diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7508d8e4c1..ba702784f4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -83,7 +83,7 @@ src/library.* @sjplimp src/main.cpp @sjplimp src/min_*.* @sjplimp src/memory.* @sjplimp -src/modify.* @sjplimp +src/modify.* @sjplimp @stanmoore1 src/molecule.* @sjplimp src/my_page.h @sjplimp src/my_pool_chunk.h @sjplimp diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 064ba6c652..f9503e0e1f 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -3,7 +3,7 @@ name: "CodeQL Code Analysis" on: push: - branches: [master] + branches: [develop] jobs: analyze: diff --git a/.github/workflows/compile-msvc.yml b/.github/workflows/compile-msvc.yml new file mode 100644 index 0000000000..e8cfcd4788 --- /dev/null +++ b/.github/workflows/compile-msvc.yml @@ -0,0 +1,33 @@ +# GitHub action to build LAMMPS on Windows with Visual C++ +name: "Native Windows Compilation" + +on: + push: + branches: [develop] + +jobs: + build: + name: Windows Compilation Test + if: ${{ github.repository == 'lammps/lammps' }} + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 2 + + - name: Building LAMMPS via CMake + shell: bash + run: | + cmake -C cmake/presets/windows.cmake \ + -S cmake -B build \ + -D BUILD_SHARED_LIBS=on \ + -D LAMMPS_EXCEPTIONS=on + cmake --build build --config Release + + - name: Run LAMMPS executable + shell: bash + run: | + ./build/Release/lmp.exe -h + ./build/Release/lmp.exe -in bench/in.lj diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index 88e28513e8..6e2f9bd800 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -3,7 +3,7 @@ name: "Unittest for MacOS" on: push: - branches: [master] + branches: [develop] jobs: build: diff --git a/.gitignore b/.gitignore index ae708ff184..3fb3af0d13 100644 --- a/.gitignore +++ b/.gitignore @@ -37,8 +37,8 @@ vgcore.* .Trashes ehthumbs.db Thumbs.db -.clang-format .lammps_history +.vs #cmake /build* @@ -49,3 +49,8 @@ Thumbs.db /Testing /cmake_install.cmake /lmp +out/Debug +out/RelWithDebInfo +out/Release +out/x86 +out/x64 diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e0fca5bd9b..00a254197d 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -81,22 +81,40 @@ check_for_autogen_files(${LAMMPS_SOURCE_DIR}) include(CheckIncludeFileCXX) # set required compiler flags and compiler/CPU arch specific optimizations -if((CMAKE_CXX_COMPILER_ID STREQUAL "Intel") OR (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -restrict") - if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 17.3 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 17.4) - set(CMAKE_TUNE_DEFAULT "-xCOMMON-AVX512") +if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qrestrict") + endif() + if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 17.3 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 17.4) + set(CMAKE_TUNE_DEFAULT "/QxCOMMON-AVX512") + else() + set(CMAKE_TUNE_DEFAULT "/QxHost") + endif() else() - set(CMAKE_TUNE_DEFAULT "-xHost") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -restrict") + if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 17.3 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 17.4) + set(CMAKE_TUNE_DEFAULT "-xCOMMON-AVX512") + else() + set(CMAKE_TUNE_DEFAULT "-xHost") + endif() endif() endif() -# we require C++11 without extensions +# we require C++11 without extensions. Kokkos requires at least C++14 (currently) set(CMAKE_CXX_STANDARD 11) +if(PKG_KOKKOS AND (CMAKE_CXX_STANDARD LESS 14)) + set(CMAKE_CXX_STANDARD 14) +endif() set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF CACHE BOOL "Use compiler extensions") -# ugly hack for MSVC which by default always reports an old C++ standard in the __cplusplus macro +# 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() # export all symbols when building a .dll file on windows @@ -281,6 +299,11 @@ else() target_include_directories(mpi_stubs PUBLIC $) if(BUILD_SHARED_LIBS) target_link_libraries(lammps PRIVATE mpi_stubs) + if(MSVC) + target_link_libraries(lmp PRIVATE mpi_stubs) + target_include_directories(lmp INTERFACE $) + target_compile_definitions(lmp INTERFACE $) + endif(MSVC) target_include_directories(lammps INTERFACE $) target_compile_definitions(lammps INTERFACE $) else() @@ -468,9 +491,12 @@ foreach(HEADER cmath) endif(NOT FOUND_${HEADER}) endforeach(HEADER) -set(MATH_LIBRARIES "m" CACHE STRING "math library") -mark_as_advanced( MATH_LIBRARIES ) -target_link_libraries(lammps PRIVATE ${MATH_LIBRARIES}) +# make the standard math library overrideable and autodetected (for systems that don't have it) +find_library(STANDARD_MATH_LIB m DOC "Standard Math library") +mark_as_advanced(STANDARD_MATH_LIB) +if(STANDARD_MATH_LIB) + target_link_libraries(lammps PRIVATE ${STANDARD_MATH_LIB}) +endif() ###################################### # Generate Basic Style files @@ -591,15 +617,12 @@ foreach(PKG_WITH_INCL CORESHELL QEQ OPENMP DPD-SMOOTH KOKKOS OPT INTEL GPU) endforeach() if(PKG_PLUGIN) - if(BUILD_SHARED_LIBS) - target_compile_definitions(lammps PRIVATE -DLMP_PLUGIN) - else() - message(WARNING "Plugin loading will not work unless BUILD_SHARED_LIBS is enabled") - endif() - # link with -ldl or equivalent for plugin loading; except on Windows - if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - target_link_libraries(lammps PRIVATE ${CMAKE_DL_LIBS}) - endif() + target_compile_definitions(lammps PRIVATE -DLMP_PLUGIN) +endif() + +# link with -ldl or equivalent for plugin loading; except on Windows +if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + target_link_libraries(lammps PRIVATE ${CMAKE_DL_LIBS}) endif() ###################################################################### @@ -608,7 +631,7 @@ endif() # and after everything else that is compiled locally ###################################################################### if(CMAKE_SYSTEM_NAME STREQUAL "Windows") - target_link_libraries(lammps PRIVATE -lwsock32 -lpsapi) + target_link_libraries(lammps PRIVATE "wsock32;psapi") endif() ###################################################### diff --git a/cmake/CMakeSettings.json b/cmake/CMakeSettings.json new file mode 100644 index 0000000000..dada2f6752 --- /dev/null +++ b/cmake/CMakeSettings.json @@ -0,0 +1,55 @@ +{ + "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", + "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-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" + } + ] + } + ] +} \ No newline at end of file diff --git a/cmake/Modules/GTest.cmake b/cmake/Modules/GTest.cmake index 211b506d2f..e012e61ea9 100644 --- a/cmake/Modules/GTest.cmake +++ b/cmake/Modules/GTest.cmake @@ -7,8 +7,8 @@ else() 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") +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) ExternalProject_Add(googletest diff --git a/cmake/Modules/LAMMPSUtils.cmake b/cmake/Modules/LAMMPSUtils.cmake index 74102ab244..28ad99fa31 100644 --- a/cmake/Modules/LAMMPSUtils.cmake +++ b/cmake/Modules/LAMMPSUtils.cmake @@ -85,7 +85,7 @@ endfunction(GenerateBinaryHeader) # fetch missing potential files function(FetchPotentials pkgfolder potfolder) - if (EXISTS "${pkgfolder}/potentials.txt") + if(EXISTS "${pkgfolder}/potentials.txt") file(STRINGS "${pkgfolder}/potentials.txt" linelist REGEX "^[^#].") foreach(line ${linelist}) string(FIND ${line} " " blank) diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index d5fccad4ba..fe6c17801e 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -1,7 +1,7 @@ ######################################################################## # As of version 3.3.0 Kokkos requires C++14 if(CMAKE_CXX_STANDARD LESS 14) - set(CMAKE_CXX_STANDARD 14) + message(FATAL_ERROR "The KOKKOS package requires the C++ standard to be set to at least C++14") endif() ######################################################################## # consistency checks and Kokkos options/settings required by LAMMPS diff --git a/cmake/Modules/Packages/MACHDYN.cmake b/cmake/Modules/Packages/MACHDYN.cmake index fab532541e..d90ca8146c 100644 --- a/cmake/Modules/Packages/MACHDYN.cmake +++ b/cmake/Modules/Packages/MACHDYN.cmake @@ -7,8 +7,9 @@ endif() option(DOWNLOAD_EIGEN3 "Download Eigen3 instead of using an already installed one)" ${DOWNLOAD_EIGEN3_DEFAULT}) if(DOWNLOAD_EIGEN3) message(STATUS "Eigen3 download requested - we will build our own") - set(EIGEN3_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz" CACHE STRING "URL for Eigen3 tarball") - set(EIGEN3_MD5 "609286804b0f79be622ccf7f9ff2b660" CACHE STRING "MD5 checksum of Eigen3 tarball") + + set(EIGEN3_URL "${LAMMPS_THIRDPARTY_URL}/eigen-3.4.0.tar.gz" CACHE STRING "URL for Eigen3 tarball") + set(EIGEN3_MD5 "4c527a9171d71a72a9d4186e65bea559" CACHE STRING "MD5 checksum of Eigen3 tarball") mark_as_advanced(EIGEN3_URL) mark_as_advanced(EIGEN3_MD5) include(ExternalProject) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index ccc7423355..d46197114d 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,11 +1,11 @@ +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.10.25.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.4.9.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "4db54962fbd6adcf8c18d46e1798ceb5" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "a2ac3315c41a1a4a5c912bcb1bc9c5cc" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) # download library sources to build folder -file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz SHOW_PROGRESS EXPECTED_HASH MD5=${PACELIB_MD5}) +file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5}) #SHOW_PROGRESS # uncompress downloaded sources execute_process( @@ -14,12 +14,19 @@ execute_process( WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) -file(GLOB PACE_EVALUATOR_INCLUDE_DIR ${CMAKE_BINARY_DIR}/lammps-user-pace-*/USER-PACE) -file(GLOB PACE_EVALUATOR_SOURCES ${CMAKE_BINARY_DIR}/lammps-user-pace-*/USER-PACE/*.cpp) +file(GLOB lib-pace ${CMAKE_BINARY_DIR}/lammps-user-pace-*) +add_subdirectory(${lib-pace}/yaml-cpp build-yaml-cpp) +set(YAML_CPP_INCLUDE_DIR ${lib-pace}/yaml-cpp/include) + +file(GLOB PACE_EVALUATOR_INCLUDE_DIR ${lib-pace}/ML-PACE) +file(GLOB PACE_EVALUATOR_SOURCES ${lib-pace}/ML-PACE/*.cpp) list(FILTER PACE_EVALUATOR_SOURCES EXCLUDE REGEX pair_pace.cpp) add_library(pace STATIC ${PACE_EVALUATOR_SOURCES}) set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE}) -target_include_directories(pace PUBLIC ${PACE_EVALUATOR_INCLUDE_DIR}) -target_link_libraries(lammps PRIVATE pace) +target_include_directories(pace PUBLIC ${PACE_EVALUATOR_INCLUDE_DIR} ${YAML_CPP_INCLUDE_DIR}) + +target_link_libraries(pace PRIVATE yaml-cpp-pace) + +target_link_libraries(lammps PRIVATE pace) diff --git a/cmake/Modules/Tools.cmake b/cmake/Modules/Tools.cmake index 146764dbd5..c3b0a0771d 100644 --- a/cmake/Modules/Tools.cmake +++ b/cmake/Modules/Tools.cmake @@ -25,7 +25,9 @@ if(BUILD_TOOLS) get_filename_component(MSI2LMP_SOURCE_DIR ${LAMMPS_TOOLS_DIR}/msi2lmp/src ABSOLUTE) file(GLOB MSI2LMP_SOURCES ${MSI2LMP_SOURCE_DIR}/[^.]*.c) add_executable(msi2lmp ${MSI2LMP_SOURCES}) - target_link_libraries(msi2lmp PRIVATE ${MATH_LIBRARIES}) + if(STANDARD_MATH_LIB) + target_link_libraries(msi2lmp PRIVATE ${STANDARD_MATH_LIB}) + endif() install(TARGETS msi2lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES ${LAMMPS_DOC_DIR}/msi2lmp.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() diff --git a/cmake/presets/windows.cmake b/cmake/presets/windows.cmake new file mode 100644 index 0000000000..d4e69c5fca --- /dev/null +++ b/cmake/presets/windows.cmake @@ -0,0 +1,64 @@ +set(WIN_PACKAGES + ASPHERE + BOCS + BODY + BROWNIAN + CG-DNA + CG-SDK + CLASS2 + COLLOID + COLVARS + CORESHELL + DIELECTRIC + DIFFRACTION + DIPOLE + DPD-BASIC + DPD-MESO + DPD-REACT + DPD-SMOOTH + DRUDE + EFF + EXTRA-COMPUTE + EXTRA-DUMP + EXTRA-FIX + EXTRA-MOLECULE + EXTRA-PAIR + FEP + GRANULAR + INTERLAYER + KSPACE + MANIFOLD + MANYBODY + MC + MEAM + MISC + ML-IAP + ML-SNAP + MOFFF + MOLECULE + MOLFILE + OPENMP + ORIENT + PERI + PHONON + POEMS + PTM + QEQ + QTB + REACTION + REAXFF + REPLICA + RIGID + SHOCK + SMTBQ + SPH + SPIN + SRD + TALLY + UEF + YAFF) + +foreach(PKG ${WIN_PACKAGES}) + set(PKG_${PKG} ON CACHE BOOL "" FORCE) +endforeach() + diff --git a/doc/doxygen/Doxyfile.in b/doc/doxygen/Doxyfile.in index 49a271355f..d454898f4e 100644 --- a/doc/doxygen/Doxyfile.in +++ b/doc/doxygen/Doxyfile.in @@ -435,6 +435,8 @@ INPUT = @LAMMPS_SOURCE_DIR@/utils.cpp \ @LAMMPS_SOURCE_DIR@/my_pool_chunk.cpp \ @LAMMPS_SOURCE_DIR@/my_pool_chunk.h \ @LAMMPS_SOURCE_DIR@/math_eigen.h \ + @LAMMPS_SOURCE_DIR@/platform.h \ + @LAMMPS_SOURCE_DIR@/platform.cpp \ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded diff --git a/doc/github-development-workflow.md b/doc/github-development-workflow.md index c0e35daf3f..1c0eddedcf 100644 --- a/doc/github-development-workflow.md +++ b/doc/github-development-workflow.md @@ -33,9 +33,9 @@ when necessary. ## Pull Requests ALL changes to the LAMMPS code and documentation, however trivial, MUST -be submitted as a pull request to GitHub. All changes to the "master" +be submitted as a pull request to GitHub. All changes to the "develop" branch must be made exclusively through merging pull requests. The -"unstable" and "stable" branches, respectively are only to be updated +"release" and "stable" branches, respectively are only to be updated upon patch or stable releases with fast-forward merges based on the associated tags. Pull requests may also be submitted to (long-running) feature branches created by LAMMPS developers inside the LAMMPS project, @@ -123,16 +123,16 @@ and thus were this comment should be placed. LAMMPS uses a continuous release development model with incremental changes, i.e. significant effort is made - including automated pre-merge -testing - that the code in the branch "master" does not get easily +testing - that the code in the branch "develop" does not get easily broken. These tests are run after every update to a pull request. More extensive and time consuming tests (including regression testing) are -performed after code is merged to the "master" branch. There are patch +performed after code is merged to the "develop" branch. There are patch releases of LAMMPS every 3-5 weeks at a point, when the LAMMPS developers feel, that a sufficient amount of changes have happened, and the post-merge testing has been successful. These patch releases are -marked with a `patch_` tag and the "unstable" branch +marked with a `patch_` tag and the "release" branch follows only these versions (and thus is always supposed to be of -production quality, unlike "master", which may be temporary broken, in +production quality, unlike "develop", which may be temporary broken, in the case of larger change sets or unexpected incompatibilities or side effects. diff --git a/doc/lammps.1 b/doc/lammps.1 index c868a2a86f..78b6c9fd67 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,4 +1,4 @@ -.TH LAMMPS "29 September 2021" "2021-09-29" +.TH LAMMPS "1" "27 October 2021" "2021-10-27" .SH NAME .B LAMMPS \- Molecular Dynamics Simulator. diff --git a/doc/msi2lmp.1 b/doc/msi2lmp.1 index 91916fb3a5..ba771da7dc 100644 --- a/doc/msi2lmp.1 +++ b/doc/msi2lmp.1 @@ -1,4 +1,4 @@ -.TH MSI2LMP "v3.9.9" "2018-11-05" +.TH MSI2LMP "1" "v3.9.9" "2018-11-05" .SH NAME .B MSI2LMP \- Converter for Materials Studio files to LAMMPS diff --git a/doc/src/Build_diskspace.rst b/doc/src/Build_diskspace.rst index 48ab21fd70..80d83956cb 100644 --- a/doc/src/Build_diskspace.rst +++ b/doc/src/Build_diskspace.rst @@ -14,7 +14,7 @@ environments with restricted disk space capacity it may be needed to reduce the storage requirements. Here are some suggestions: - Create a so-called shallow repository by cloning only the last commit - instead of the full project history by using ``git clone git@github.com:lammps/lammps --depth=1 --branch=master``. + instead of the full project history by using ``git clone git@github.com:lammps/lammps --depth=1 --branch=develop``. This reduces the downloaded size to about half. With ``--depth=1`` it is not possible to check out different versions/branches of LAMMPS, using ``--depth=1000`` will make multiple recent versions available at little extra storage needs (the entire git history had nearly 30,000 commits in fall 2021). diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index d12c6dc498..5dbefd8b6e 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -33,12 +33,15 @@ various tools and files. Some of them have to be installed (see below). For the rest the build process will attempt to download and install them into a python virtual environment and local folders. -A current version of the manual (latest patch release, aka unstable -branch) is is available online at: -`https://docs.lammps.org/Manual.html `_. -A version of the manual corresponding to the ongoing development (aka master branch) -is available online at: `https://docs.lammps.org/latest/ -`_ +A current version of the manual (latest patch release, that is the state +of the *release* branch) is is available online at: +`https://docs.lammps.org/ `_. +A version of the manual corresponding to the ongoing development (that is +the state of the *develop* branch) is available online at: +`https://docs.lammps.org/latest/ `_ +A version of the manual corresponding to the latest stable LAMMPS release +(that is the state of the *stable* branch) is available online at: +`https://docs.lammps.org/stable/ `_ Build using GNU make -------------------- diff --git a/doc/src/Build_settings.rst b/doc/src/Build_settings.rst index c7397935d8..b68313aaed 100644 --- a/doc/src/Build_settings.rst +++ b/doc/src/Build_settings.rst @@ -321,9 +321,7 @@ following settings: .. code-block:: make - LMP_INC = -DLAMMPS_JPEG - LMP_INC = -DLAMMPS_PNG - LMP_INC = -DLAMMPS_FFMPEG + LMP_INC = -DLAMMPS_JPEG -DLAMMPS_PNG -DLAMMPS_FFMPEG JPG_INC = -I/usr/local/include # path to jpeglib.h, png.h, zlib.h header files if make cannot find them JPG_PATH = -L/usr/lib # paths to libjpeg.a, libpng.a, libz.a (.so) files if make cannot find them @@ -354,8 +352,10 @@ Read or write compressed files ----------------------------------------- If this option is enabled, large files can be read or written with -gzip compression by several LAMMPS commands, including -:doc:`read_data `, :doc:`rerun `, and :doc:`dump `. +compression by ``gzip`` or similar tools by several LAMMPS commands, +including :doc:`read_data `, :doc:`rerun `, and +:doc:`dump `. Currently supported compression tools are: +``gzip``, ``bzip2``, ``zstd``, and ``lzma``. .. tabs:: @@ -364,23 +364,23 @@ gzip compression by several LAMMPS commands, including .. code-block:: bash -D WITH_GZIP=value # yes or no - # default is yes if CMake can find gzip, else no - -D GZIP_EXECUTABLE=path # path to gzip executable if CMake cannot find it + # default is yes if CMake can find the gzip program, else no .. tab:: Traditional make .. code-block:: make - LMP_INC = -DLAMMPS_GZIP + LMP_INC = -DLAMMPS_GZIP -This option requires that your operating system fully supports the "popen()" -function in the standard runtime library and that a ``gzip`` executable can be -found by LAMMPS during a run. +This option requires that your operating system fully supports the +"popen()" function in the standard runtime library and that a ``gzip`` +or other executable can be found by LAMMPS in the standard search path +during a run. .. note:: - On some clusters with high-speed networks, using the "fork()" library - call (required by "popen()") can interfere with the fast communication + On clusters with high-speed networks, using the "fork()" library call + (required by "popen()") can interfere with the fast communication library and lead to simulations using compressed output or input to hang or crash. For selected operations, compressed file I/O is also available using a compression library instead, which is what the @@ -452,7 +452,7 @@ those systems: .. code-block:: make - LMP_INC = -DLAMMPS_LONGLONG_TO_LONG + LMP_INC = -DLAMMPS_LONGLONG_TO_LONG ---------- @@ -479,7 +479,7 @@ e.g. to Python. Of course, the calling code has to be set up to .. code-block:: make - LMP_INC = -DLAMMPS_EXCEPTIONS + LMP_INC = -DLAMMPS_EXCEPTIONS .. note:: @@ -520,7 +520,7 @@ executable, not the library. .. code-block:: make - LMP_INC = -DLAMMPS_TRAP_FPE + LMP_INC = -DLAMMPS_TRAP_FPE After compilation with this flag set, the LAMMPS executable will stop and produce a core dump when a division by zero, overflow, illegal math diff --git a/doc/src/Build_windows.rst b/doc/src/Build_windows.rst index 3a56f29d09..fa2296d302 100644 --- a/doc/src/Build_windows.rst +++ b/doc/src/Build_windows.rst @@ -4,6 +4,7 @@ Notes for building LAMMPS on Windows * :ref:`General remarks ` * :ref:`Running Linux on Windows ` * :ref:`Using GNU GCC ported to Windows ` +* :ref:`Using Visual Studio ` * :ref:`Using a cross-compiler ` ---------- @@ -31,13 +32,13 @@ pre-compiled Windows binary packages are sufficient for your needs. If it is necessary for you to compile LAMMPS on a Windows machine (e.g. because it is your main desktop), please also consider using a virtual machine software and compile and run LAMMPS in a Linux virtual -machine, or - if you have a sufficiently up-to-date Windows 10 -installation - consider using the Windows subsystem for Linux. This -optional Windows feature allows you to run the bash shell from Ubuntu -from within Windows and from there on, you can pretty much use that -shell like you are running on an Ubuntu Linux machine (e.g. installing -software via apt-get and more). For more details on that, please see -:doc:`this tutorial `. +machine, or - if you have a sufficiently up-to-date Windows 10 or +Windows 11 installation - consider using the Windows subsystem for +Linux. This optional Windows feature allows you to run the bash shell +from Ubuntu from within Windows and from there on, you can pretty much +use that shell like you are running on an Ubuntu Linux machine +(e.g. installing software via apt-get and more). For more details on +that, please see :doc:`this tutorial `. .. _gnu: @@ -67,6 +68,35 @@ requiring changes to the LAMMPS source code, or figure out corrections yourself, please report them on the lammps-users mailing list, or file them as an issue or pull request on the LAMMPS GitHub project. +.. _msvc: + +Using Microsoft Visual Studio +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Following the integration of the :doc:`platform namespace +` into the LAMMPS code base, portability of LAMMPS +to be compiled on Windows using Visual Studio has been significantly +improved. This has been tested with Visual Studio 2019 (aka version +16). Not all features and packages in LAMMPS are currently supported +out of the box, but a preset ``cmake/presets/windows.cmake`` is provided +that contains the packages that have been compiled successfully. You +must use the CMake based build procedure, and either use the integrated +CMake support of Visual Studio or use an external CMake installation to +create build files for the Visual Studio build system. Please note that +on launching Visual Studio it will scan the directory tree and likely +miss the correct master ``CMakeLists.txt``. Try to open the +``cmake/CMakeSettings.json`` and use those CMake configurations as a +starting point. It is also possible to configure and compile LAMMPS +from the command line with a CMake binary from `cmake.org `_. + +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. + +This is work in progress and you should contact the LAMMPS developers +via GitHub, the forum, or the mailing list, if you have questions or +LAMMPS specific problems. + .. _cross: Using a cross-compiler diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index effccd55bf..c3fca16bef 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -23,6 +23,7 @@ OPT. :columns: 5 * :doc:`accelerate/cos ` + * :doc:`acks2/reaxff (k) ` * :doc:`adapt ` * :doc:`adapt/fep ` * :doc:`addforce ` @@ -103,6 +104,7 @@ OPT. * :doc:`manifoldforce ` * :doc:`mdi/engine ` * :doc:`meso/move ` + * :doc:`mol/swap ` * :doc:`momentum (k) ` * :doc:`momentum/chunk ` * :doc:`move ` diff --git a/doc/src/Developer.rst b/doc/src/Developer.rst index f68007486d..fd4a44a8a0 100644 --- a/doc/src/Developer.rst +++ b/doc/src/Developer.rst @@ -18,4 +18,5 @@ of time and requests from the LAMMPS user community. Developer_plugins Developer_unittest Classes + Developer_platform Developer_utils diff --git a/doc/src/Developer_platform.rst b/doc/src/Developer_platform.rst new file mode 100644 index 0000000000..c9ecd30cec --- /dev/null +++ b/doc/src/Developer_platform.rst @@ -0,0 +1,152 @@ +Platform abstraction functions +------------------------------ + +The ``platform`` sub-namespace inside the ``LAMMPS_NS`` namespace +provides a collection of wrapper and convenience functions and utilities +that perform common tasks for which platform specific code would be +required or for which a more high-level abstraction would be convenient +and reduce duplicated code. This reduces redundant implementations and +encourages consistent behavior and thus has some overlap with the +:doc:`"utils" sub-namespace `. + +Time functions +^^^^^^^^^^^^^^ + +.. doxygenfunction:: cputime + :project: progguide + +.. doxygenfunction:: walltime + :project: progguide + +.. doxygenfunction:: usleep + :project: progguide + +Platform information functions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. doxygenfunction:: os_info + :project: progguide + +.. doxygenfunction:: compiler_info + :project: progguide + +.. doxygenfunction:: cxx_standard + :project: progguide + +.. doxygenfunction:: openmp_standard + :project: progguide + +.. doxygenfunction:: mpi_vendor + :project: progguide + +.. doxygenfunction:: mpi_info + :project: progguide + +.. doxygenfunction:: compress_info + :project: progguide + + +File and path functions and global constants +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. doxygenvariable:: filepathsep + :project: progguide + +.. doxygenvariable:: pathvarsep + :project: progguide + +.. doxygenfunction:: guesspath + :project: progguide + +.. doxygenfunction:: path_basename + :project: progguide + +.. doxygenfunction:: path_join + :project: progguide + +.. doxygenfunction:: file_is_readable + :project: progguide + +.. doxygenfunction:: is_console + :project: progguide + +.. doxygenfunction:: path_is_directory + :project: progguide + +.. doxygenfunction:: current_directory + :project: progguide + +.. doxygenfunction:: list_directory + :project: progguide + +.. doxygenfunction:: chdir + :project: progguide + +.. doxygenfunction:: mkdir + :project: progguide + +.. doxygenfunction:: rmdir + :project: progguide + +.. doxygenfunction:: unlink + :project: progguide + +Standard I/O function wrappers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. doxygenvariable:: END_OF_FILE + :project: progguide + +.. doxygenfunction:: ftell + :project: progguide + +.. doxygenfunction:: fseek + :project: progguide + +.. doxygenfunction:: ftruncate + :project: progguide + +.. doxygenfunction:: popen + :project: progguide + +.. doxygenfunction:: pclose + :project: progguide + +Environment variable functions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. doxygenfunction:: putenv + :project: progguide + +.. doxygenfunction:: list_pathenv + :project: progguide + +.. doxygenfunction:: find_exe_path + :project: progguide + +Dynamically loaded object or library functions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. doxygenfunction:: dlopen + :project: progguide + +.. doxygenfunction:: dlclose + :project: progguide + +.. doxygenfunction:: dlsym + :project: progguide + +.. doxygenfunction:: dlerror + :project: progguide + +Compressed file I/O functions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. doxygenfunction:: has_compress_extension + :project: progguide + +.. doxygenfunction:: compressed_read + :project: progguide + +.. doxygenfunction:: compressed_write + :project: progguide diff --git a/doc/src/Developer_utils.rst b/doc/src/Developer_utils.rst index 041fce60b0..db47a9e3c3 100644 --- a/doc/src/Developer_utils.rst +++ b/doc/src/Developer_utils.rst @@ -7,7 +7,9 @@ a collection of convenience functions and utilities that perform common tasks that are required repeatedly throughout the LAMMPS code like reading or writing to files with error checking or translation of strings into specific types of numbers with checking for validity. This -reduces redundant implementations and encourages consistent behavior. +reduces redundant implementations and encourages consistent behavior and +thus has some overlap with the :doc:`"platform" sub-namespace +`. I/O with status check and similar functions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -101,6 +103,12 @@ and parsing files or arguments. .. doxygenfunction:: strdup :project: progguide +.. doxygenfunction:: lowercase + :project: progguide + +.. doxygenfunction:: uppercase + :project: progguide + .. doxygenfunction:: trim :project: progguide @@ -143,21 +151,6 @@ and parsing files or arguments. .. doxygenfunction:: is_double :project: progguide -File and path functions -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. doxygenfunction:: guesspath - :project: progguide - -.. doxygenfunction:: path_basename - :project: progguide - -.. doxygenfunction:: path_join - :project: progguide - -.. doxygenfunction:: file_is_readable - :project: progguide - Potential file functions ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/src/Developer_write.rst b/doc/src/Developer_write.rst index 37ac9ca126..c3df6ad6bb 100644 --- a/doc/src/Developer_write.rst +++ b/doc/src/Developer_write.rst @@ -29,7 +29,9 @@ of code in the header before include guards: .. code-block:: c #ifdef FIX_CLASS - FixStyle(print/vel,FixPrintVel) + // clang-format off + FixStyle(print/vel,FixPrintVel); + // clang-format on #else /* the definition of the FixPrintVel class comes here */ ... diff --git a/doc/src/Examples.rst b/doc/src/Examples.rst index f91ca2db11..c211727902 100644 --- a/doc/src/Examples.rst +++ b/doc/src/Examples.rst @@ -80,7 +80,7 @@ Lowercase directories +-------------+------------------------------------------------------------------+ | friction | frictional contact of spherical asperities between 2d surfaces | +-------------+------------------------------------------------------------------+ -| gcmc | Grand Canonical Monte Carlo (GCMC) via the fix gcmc command | +| mc | Monte Carlo features via fix gcmc, widom and other commands | +-------------+------------------------------------------------------------------+ | granregion | use of fix wall/region/gran as boundary on granular particles | +-------------+------------------------------------------------------------------+ @@ -205,7 +205,7 @@ Uppercase directories +------------+--------------------------------------------------------------------------------------------------+ | KAPPA | compute thermal conductivity via several methods | +------------+--------------------------------------------------------------------------------------------------+ -| MC | using LAMMPS in a Monte Carlo mode to relax the energy of a system | +| MC-LOOP | using LAMMPS in a Monte Carlo mode to relax the energy of a system in a input script loop | +------------+--------------------------------------------------------------------------------------------------+ | PACKAGES | examples for specific packages and contributed commands | +------------+--------------------------------------------------------------------------------------------------+ diff --git a/doc/src/Howto_github.rst b/doc/src/Howto_github.rst index 0bb931fccd..278b9e4bfd 100644 --- a/doc/src/Howto_github.rst +++ b/doc/src/Howto_github.rst @@ -7,11 +7,11 @@ LAMMPS GitHub tutorial This document describes the process of how to use GitHub to integrate changes or additions you have made to LAMMPS into the official LAMMPS -distribution. It uses the process of updating this very tutorial as -an example to describe the individual steps and options. You need to -be familiar with git and you may want to have a look at the -`git book `_ to reacquaint yourself with some -of the more advanced git features used below. +distribution. It uses the process of updating this very tutorial as an +example to describe the individual steps and options. You need to be +familiar with git and you may want to have a look at the `git book +`_ to familiarize yourself with some of the +more advanced git features used below. As of fall 2016, submitting contributions to LAMMPS via pull requests on GitHub is the preferred option for integrating contributed features @@ -37,15 +37,15 @@ username or e-mail address and password. **Forking the repository** To get changes into LAMMPS, you need to first fork the `lammps/lammps` -repository on GitHub. At the time of writing, *master* is the preferred +repository on GitHub. At the time of writing, *develop* is the preferred target branch. Thus go to `LAMMPS on GitHub `_ -and make sure branch is set to "master", as shown in the figure below. +and make sure branch is set to "develop", as shown in the figure below. .. image:: JPG/tutorial_branch.png :align: center -If it is not, use the button to change it to *master*\ . Once it is, use the -fork button to create a fork. +If it is not, use the button to change it to *develop*. Once it is, use +the fork button to create a fork. .. image:: JPG/tutorial_fork.png :align: center @@ -64,11 +64,12 @@ LAMMPS development. **Adding changes to your own fork** Additions to the upstream version of LAMMPS are handled using *feature -branches*\ . For every new feature, a so-called feature branch is +branches*. For every new feature, a so-called feature branch is created, which contains only those modification relevant to one specific feature. For example, adding a single fix would consist of creating a branch with only the fix header and source file and nothing else. It is -explained in more detail here: `feature branch workflow `_. +explained in more detail here: `feature branch workflow +`_. **Feature branches** @@ -94,8 +95,8 @@ The above command copies ("clones") the git repository to your local machine to a directory with the name you chose. If none is given, it will default to "lammps". Typical names are "mylammps" or something similar. -You can use this local clone to make changes and -test them without interfering with the repository on GitHub. +You can use this local clone to make changes and test them without +interfering with the repository on GitHub. To pull changes from upstream into this copy, you can go to the directory and use git pull: @@ -103,28 +104,45 @@ and use git pull: .. code-block:: bash $ cd mylammps - $ git checkout master - $ git pull https://github.com/lammps/lammps + $ git checkout develop + $ git pull https://github.com/lammps/lammps develop You can also add this URL as a remote: .. code-block:: bash - $ git remote add lammps_upstream https://www.github.com/lammps/lammps + $ git remote add upstream https://www.github.com/lammps/lammps -At this point, you typically make a feature branch from the updated master +From then on you can update your upstream branches with: + +.. code-block:: bash + + $ git fetch upstream + +and then refer to the upstream repository branches with +`upstream/develop` or `upstream/release` and so on. + +At this point, you typically make a feature branch from the updated branch for the feature you want to work on. This tutorial contains the workflow that updated this tutorial, and hence we will call the branch "github-tutorial-update": .. code-block:: bash - $ git checkout -b github-tutorial-update master + $ git fetch upstream + $ git checkout -b github-tutorial-update upstream/develop Now that we have changed branches, we can make our changes to our local repository. Just remember that if you want to start working on another, unrelated feature, you should switch branches! +.. note:: + + 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. + **After changes are made** After everything is done, add the files to the branch and commit them: @@ -287,28 +305,32 @@ After each push, the automated checks are run again. LAMMPS developers may add labels to your pull request to assign it to categories (mostly for bookkeeping purposes), but a few of them are -important: needs_work, work_in_progress, test-for-regression, and -full-regression-test. The first two indicate, that your pull request -is not considered to be complete. With "needs_work" the burden is on -exclusively on you; while "work_in_progress" can also mean, that a -LAMMPS developer may want to add changes. Please watch the comments -to the pull requests. The two "test" labels are used to trigger -extended tests before the code is merged. This is sometimes done by -LAMMPS developers, if they suspect that there may be some subtle -side effects from your changes. It is not done by default, because -those tests are very time consuming. +important: *needs_work*, *work_in_progress*, *run_tests*, +*test_for_regression*, and *ready_for_merge*. The first two indicate, +that your pull request is not considered to be complete. With +"needs_work" the burden is on exclusively on you; while +"work_in_progress" can also mean, that a LAMMPS developer may want to +add changes. Please watch the comments to the pull requests. The two +"test" labels are used to trigger extended tests before the code is +merged. This is sometimes done by LAMMPS developers, if they suspect +that there may be some subtle side effects from your changes. It is not +done by default, because those tests are very time consuming. The +*ready_for_merge* label is usually attached when the LAMMPS developer +assigned to the pull request considers this request complete and to +trigger a final full test evaluation. **Reviews** -As of Summer 2018, a pull request needs at least 1 approving review -from a LAMMPS developer with write access to the repository. -In case your changes touch code that certain developers are associated -with, they are auto-requested by the GitHub software. Those associations -are set in the file -`.github/CODEOWNERS `_ -Thus if you want to be automatically notified to review when anybody -changes files or packages, that you have contributed to LAMMPS, you can -add suitable patterns to that file, or a LAMMPS developer may add you. +As of Fall 2021, a pull request needs to pass all automatic tests and at +least 1 approving review from a LAMMPS developer with write access to +the repository before it is eligible for merging. In case your changes +touch code that certain developers are associated with, they are +auto-requested by the GitHub software. Those associations are set in +the file `.github/CODEOWNERS +`_ Thus +if you want to be automatically notified to review when anybody changes +files or packages, that **you** have contributed to LAMMPS, you can add +suitable patterns to that file, or a LAMMPS developer may add you. Otherwise, you can also manually request reviews from specific developers, or LAMMPS developers - in their assessment of your pull request - may @@ -329,7 +351,7 @@ LAMMPS developer (including him/herself) or c) Axel Kohlmeyer (akohlmey). After the review, the developer can choose to implement changes directly or suggest them to you. * Case c) means that the pull request has been assigned to the developer - overseeing the merging of pull requests into the master branch. + overseeing the merging of pull requests into the *develop* branch. In this case, Axel assigned the tutorial to Steve: @@ -351,11 +373,11 @@ Sometimes, however, you might not feel comfortable having other people push changes into your own branch, or maybe the maintainers are not sure their idea was the right one. In such a case, they can make changes, reassign you as the assignee, and file a "reverse pull request", i.e. -file a pull request in your GitHub repository to include changes in the -branch, that you have submitted as a pull request yourself. In that -case, you can choose to merge their changes back into your branch, -possibly make additional changes or corrections and proceed from there. -It looks something like this: +file a pull request in **your** forked GitHub repository to include +changes in the branch, that you have submitted as a pull request +yourself. In that case, you can choose to merge their changes back into +your branch, possibly make additional changes or corrections and proceed +from there. It looks something like this: .. image:: JPG/tutorial_reverse_pull_request.png :align: center @@ -419,7 +441,7 @@ This merge also shows up on the lammps GitHub page: **After a merge** -When everything is fine, the feature branch is merged into the master branch: +When everything is fine, the feature branch is merged into the *develop* branch: .. image:: JPG/tutorial_merged.png :align: center @@ -433,8 +455,8 @@ branch! .. code-block:: bash - $ git checkout master - $ git pull master + $ git checkout develop + $ git pull https://github.com/lammps/lammps develop $ git branch -d github-tutorial-update If you do not pull first, it is not really a problem but git will warn @@ -442,6 +464,7 @@ you at the next statement that you are deleting a local branch that was not yet fully merged into HEAD. This is because git does not yet know your branch just got merged into LAMMPS upstream. If you first delete and then pull, everything should still be fine. +You can display all branches that are fully merged by: Finally, if you delete the branch locally, you might want to push this to your remote(s) as well: @@ -453,14 +476,14 @@ to your remote(s) as well: **Recent changes in the workflow** Some changes to the workflow are not captured in this tutorial. For -example, in addition to the master branch, to which all new features -should be submitted, there is now also an "unstable" and a "stable" -branch; these have the same content as "master", but are only updated -after a patch release or stable release was made. -Furthermore, the naming of the patches now follow the pattern -"patch_" to simplify comparisons between releases. -Finally, all patches and submissions are subject to automatic testing -and code checks to make sure they at the very least compile. +example, in addition to the *develop* branch, to which all new features +should be submitted, there is also a *release* and a *stable* branch; +these have the same content as *develop*, but are only updated after a +patch release or stable release was made. Furthermore, the naming of +the patches now follow the pattern "patch_" to +simplify comparisons between releases. Finally, all patches and +submissions are subject to automatic testing and code checks to make +sure they at the very least compile. A discussion of the LAMMPS developer GitHub workflow can be found in the file -`doc/github-development-workflow.md `_ +`doc/github-development-workflow.md `_ diff --git a/doc/src/Howto_thermostat.rst b/doc/src/Howto_thermostat.rst index fbeb1f7785..fe53fff540 100644 --- a/doc/src/Howto_thermostat.rst +++ b/doc/src/Howto_thermostat.rst @@ -2,8 +2,8 @@ Thermostats =========== Thermostatting means controlling the temperature of particles in an MD -simulation. :doc:`Barostatting ` means controlling the -pressure. Since the pressure includes a kinetic component due to +simulation. :doc:`Barostatting ` means controlling +the pressure. Since the pressure includes a kinetic component due to particle velocities, both these operations require calculation of the temperature. Typically a target temperature (T) and/or pressure (P) is specified by the user, and the thermostat or barostat attempts to @@ -26,11 +26,13 @@ can be invoked via the *dpd/tstat* pair style: * :doc:`pair_style dpd/tstat ` :doc:`Fix nvt ` only thermostats the translational velocity of -particles. :doc:`Fix nvt/sllod ` also does this, except -that it subtracts out a velocity bias due to a deforming box and -integrates the SLLOD equations of motion. See the :doc:`Howto nemd ` page for further details. :doc:`Fix nvt/sphere ` and :doc:`fix nvt/asphere ` thermostat not only translation -velocities but also rotational velocities for spherical and aspherical -particles. +particles. :doc:`Fix nvt/sllod ` also does this, +except that it subtracts out a velocity bias due to a deforming box +and integrates the SLLOD equations of motion. See the :doc:`Howto +nemd ` page for further details. :doc:`Fix nvt/sphere +` and :doc:`fix nvt/asphere ` +thermostat not only translation velocities but also rotational +velocities for spherical and aspherical particles. .. note:: @@ -40,25 +42,31 @@ particles. e.g. molecular systems. The latter can be tricky to do correctly. DPD thermostatting alters pairwise interactions in a manner analogous -to the per-particle thermostatting of :doc:`fix langevin `. +to the per-particle thermostatting of :doc:`fix langevin +`. -Any of the thermostatting fixes can be instructed to use custom temperature -computes that remove bias which has two effects: first, the current -calculated temperature, which is compared to the requested target temperature, -is calculated with the velocity bias removed; second, the thermostat adjusts -only the thermal temperature component of the particle's velocities, which are -the velocities with the bias removed. The removed bias is then added back -to the adjusted velocities. See the doc pages for the individual -fixes and for the :doc:`fix_modify ` command for -instructions on how to assign a temperature compute to a -thermostatting fix. For example, you can apply a thermostat to only -the x and z components of velocity by using it in conjunction with -:doc:`compute temp/partial `. Of you could -thermostat only the thermal temperature of a streaming flow of -particles without affecting the streaming velocity, by using -:doc:`compute temp/profile `. +Any of the thermostatting fixes can be instructed to use custom +temperature computes that remove bias which has two effects: first, +the current calculated temperature, which is compared to the requested +target temperature, is calculated with the velocity bias removed; +second, the thermostat adjusts only the thermal temperature component +of the particle's velocities, which are the velocities with the bias +removed. The removed bias is then added back to the adjusted +velocities. See the doc pages for the individual fixes and for the +:doc:`fix_modify ` command for instructions on how to +assign a temperature compute to a thermostatting fix. -Below is a list of some custom temperature computes that can be used like that: +For example, you can apply a thermostat only to atoms in a spatial +region by using it in conjunction with :doc:`compute temp/region +`. Or you can apply a thermostat to only the x +and z components of velocity by using it with :doc:`compute +temp/partial `. Of you could thermostat only +the thermal temperature of a streaming flow of particles without +affecting the streaming velocity, by using :doc:`compute temp/profile +`. + +Below is a list of custom temperature computes that can be used like +that: * :doc:`compute_temp_asphere` * :doc:`compute_temp_body` @@ -72,8 +80,6 @@ Below is a list of some custom temperature computes that can be used like that: * :doc:`compute_temp_rotate` * :doc:`compute_temp_sphere` - - .. note:: Only the nvt fixes perform time integration, meaning they update @@ -86,17 +92,17 @@ Below is a list of some custom temperature computes that can be used like that: * :doc:`fix nve/sphere ` * :doc:`fix nve/asphere ` -Thermodynamic output, which can be setup via the -:doc:`thermo_style ` command, often includes temperature -values. As explained on the page for the -:doc:`thermo_style ` command, the default temperature is -setup by the thermo command itself. It is NOT the temperature -associated with any thermostatting fix you have defined or with any -compute you have defined that calculates a temperature. The doc pages -for the thermostatting fixes explain the ID of the temperature compute -they create. Thus if you want to view these temperatures, you need to -specify them explicitly via the :doc:`thermo_style custom ` command. Or you can use the -:doc:`thermo_modify ` command to re-define what +Thermodynamic output, which can be setup via the :doc:`thermo_style +` command, often includes temperature values. As +explained on the page for the :doc:`thermo_style ` +command, the default temperature is setup by the thermo command +itself. It is NOT the temperature associated with any thermostatting +fix you have defined or with any compute you have defined that +calculates a temperature. The doc pages for the thermostatting fixes +explain the ID of the temperature compute they create. Thus if you +want to view these temperatures, you need to specify them explicitly +via the :doc:`thermo_style custom ` command. Or you can +use the :doc:`thermo_modify ` command to re-define what temperature compute is used for default thermodynamic output. ---------- diff --git a/doc/src/Install_git.rst b/doc/src/Install_git.rst index f62bad6847..4e7db77873 100644 --- a/doc/src/Install_git.rst +++ b/doc/src/Install_git.rst @@ -9,7 +9,8 @@ has several advantages: command. * You can create your own development branches to add code to LAMMPS. * You can submit your new features back to GitHub for inclusion in - LAMMPS. + LAMMPS. For that you should first create your own :doc:`fork on + GitHub `. You must have `git `_ installed on your system to use the commands explained below to communicate with the git servers on @@ -20,35 +21,53 @@ provides `limited support for subversion clients `_. As of October 2016, the official home of public LAMMPS development is on GitHub. The previously advertised LAMMPS git repositories on - git.lammps.org and bitbucket.org are now deprecated or offline. + git.lammps.org and bitbucket.org are now offline or deprecated. .. _git: https://git-scm.com .. _svn: https://help.github.com/en/github/importing-your-projects-to-github/working-with-subversion-on-github -You can follow LAMMPS development on 3 different git branches: +You can follow the LAMMPS development on 3 different git branches: -* **stable** : this branch is updated with every stable release -* **unstable** : this branch is updated with every patch release -* **master** : this branch continuously follows ongoing development +* **stable** : this branch is updated with every stable release; + updates are always "fast forward" merges from *develop* +* **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 + is updated with every merge commit of a pull request To access the git repositories on your box, use the clone command to create a local copy of the LAMMPS repository with a command like: .. code-block:: bash - $ git clone -b unstable https://github.com/lammps/lammps.git mylammps + $ git clone -b release https://github.com/lammps/lammps.git mylammps where "mylammps" is the name of the directory you wish to create on -your machine and "unstable" is one of the 3 branches listed above. +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:: + + 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. + Once the command completes, your directory will contain the same files as if you unpacked a current LAMMPS tarball, with the exception, that the HTML documentation files are not included. They can be fetched from the LAMMPS website by typing ``make fetch`` in the doc directory. -Or they can be generated from the content provided in doc/src by -typing ``make html`` from the doc directory. +Or they can be generated from the content provided in ``doc/src`` by +typing ``make html`` from the ``doc`` directory. After initial cloning, as bug fixes and new features are added to LAMMPS you can stay up-to-date by typing the following git commands @@ -56,9 +75,9 @@ from within the "mylammps" directory: .. code-block:: bash - $ git checkout unstable # not needed if you always stay in this branch - $ git checkout stable # use one of these 3 checkout commands - $ git checkout master # to choose the branch to follow + $ git checkout release # not needed if you always stay in this branch + $ git checkout stable # use one of these 3 checkout commands + $ git checkout develop # to choose the branch to follow $ git pull Doing a "pull" will not change any files you have added to the LAMMPS @@ -81,7 +100,7 @@ Stable versions and what tagID to use for a particular stable version are discussed on `this page `_. Note that this command will print some warnings, because in order to get back to the latest revision and to be able to update with ``git pull`` -again, you will need to do ``git checkout unstable`` (or +again, you will need to do ``git checkout release`` (or check out any other desired branch) first. Once you have updated your local files with a ``git pull`` (or ``git diff --git a/doc/src/Intro_opensource.rst b/doc/src/Intro_opensource.rst index fa857e5014..a1baaf5185 100644 --- a/doc/src/Intro_opensource.rst +++ b/doc/src/Intro_opensource.rst @@ -19,7 +19,7 @@ software and open-source distribution, see `www.gnu.org `_ or `www.opensource.org `_. The legal text of the GPL as it applies to LAMMPS is in the LICENSE file included in the LAMMPS distribution. -.. _gpl: https://github.com/lammps/lammps/blob/master/LICENSE +.. _gpl: https://github.com/lammps/lammps/blob/develop/LICENSE .. _lgpl: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html diff --git a/doc/src/Manual_version.rst b/doc/src/Manual_version.rst index ae9bd556c4..b705ce8c4a 100644 --- a/doc/src/Manual_version.rst +++ b/doc/src/Manual_version.rst @@ -7,7 +7,7 @@ correctly and reliably at all times. You can follow its development in a public `git repository on GitHub `_. Whenever we fix a bug or update or add a feature, it will be merged into -the `master` branch of the git repository. When a sufficient number of +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 diff --git a/doc/src/Speed.rst b/doc/src/Speed.rst index 02eae1f3fa..dfd5f4bf3e 100644 --- a/doc/src/Speed.rst +++ b/doc/src/Speed.rst @@ -14,7 +14,7 @@ Intel Xeon Phi co-processors. The `Benchmark page `_ of the LAMMPS website gives performance results for the various accelerator -packages discussed on the :doc:`Speed packages ` doc +packages discussed on the :doc:`Accelerator packages ` page, for several of the standard LAMMPS benchmark problems, as a function of problem size and number of compute nodes, on different hardware platforms. diff --git a/doc/src/accel_styles.rst b/doc/src/accel_styles.rst index 27a798d731..228953335c 100644 --- a/doc/src/accel_styles.rst +++ b/doc/src/accel_styles.rst @@ -1,7 +1,7 @@ Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed on the :doc:`Speed packages ` doc +hardware, as discussed on the :doc:`Accelerator packages ` page. The accelerated styles take the same arguments and should produce the same results, except for round-off and precision issues. @@ -13,5 +13,5 @@ You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` page for more +See the :doc:`Accelerator packages ` page for more instructions on how to use the accelerated styles effectively. diff --git a/doc/src/angle_charmm.rst b/doc/src/angle_charmm.rst index 0da31e54e7..425ed7e4f1 100644 --- a/doc/src/angle_charmm.rst +++ b/doc/src/angle_charmm.rst @@ -56,23 +56,7 @@ radian\^2. ---------- -Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the :doc:`Speed packages ` doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. - -These accelerated styles are part of the GPU, INTEL, KOKKOS, -OPENMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the -:doc:`suffix ` command in your input script. - -See :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. +.. include:: accel_styles.rst ---------- diff --git a/doc/src/atom_style.rst b/doc/src/atom_style.rst index bade8c2f79..3a525b27f5 100644 --- a/doc/src/atom_style.rst +++ b/doc/src/atom_style.rst @@ -319,28 +319,9 @@ styles; see the :doc:`Modify ` doc page. ---------- -Styles with a *kk* suffix are functionally the same as the -corresponding style without the suffix. They have been optimized to -run faster, depending on your available hardware, as discussed in on -the :doc:`Speed packages ` doc page. The accelerated -styles take the same arguments and should produce the same results, -except for round-off and precision issues. +.. include:: accel_styles.rst -Note that other acceleration packages in LAMMPS, specifically the GPU, -INTEL, OPENMP, and OPT packages do not use accelerated atom -styles. - -The accelerated styles are part of the KOKKOS package. They are only -enabled if LAMMPS was built with those packages. See the :doc:`Build -package ` page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the :doc:`-suffix command-line -switch ` when you invoke LAMMPS, or you can use the -:doc:`suffix ` command in your input script. - -See the :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. +---------- Restrictions """""""""""" diff --git a/doc/src/fix.rst b/doc/src/fix.rst index c45ae6a801..6afe0fe325 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -166,6 +166,7 @@ page are followed by one or more of (g,i,k,o,t) to indicate which accelerated styles exist. * :doc:`accelerate/cos ` - apply cosine-shaped acceleration to atoms +* :doc:`acks2/reaxff ` - apply ACKS2 charge equilibration * :doc:`adapt ` - change a simulation parameter over time * :doc:`adapt/fep ` - enhanced version of fix adapt * :doc:`addforce ` - add a force to each atom @@ -246,6 +247,7 @@ accelerated styles exist. * :doc:`manifoldforce ` - restrain atoms to a manifold during minimization * :doc:`mdi/engine ` - connect LAMMPS to external programs via the MolSSI Driver Interface (MDI) * :doc:`meso/move ` - move mesoscopic SPH/SDPD particles in a prescribed fashion +* :doc:`mol/swap ` - Monte Carlo atom type swapping with a molecule * :doc:`momentum ` - zero the linear and/or angular momentum of a group of atoms * :doc:`momentum/chunk ` - zero the linear and/or angular momentum of a chunk of atoms * :doc:`move ` - move atoms in a prescribed fashion diff --git a/doc/src/fix_acks2_reaxff.rst b/doc/src/fix_acks2_reaxff.rst new file mode 100644 index 0000000000..b555f77a66 --- /dev/null +++ b/doc/src/fix_acks2_reaxff.rst @@ -0,0 +1,118 @@ +.. index:: fix acks2/reaxff +.. index:: fix acks2/reaxff/kk + +fix acks2/reaxff command +======================== + +Accelerator Variants: *acks2/reaxff/kk* + +Syntax +"""""" + +.. parsed-literal:: + + fix ID group-ID acks2/reaxff Nevery cutlo cuthi tolerance params args + +* ID, group-ID are documented in :doc:`fix ` command +* acks2/reaxff = style name of this fix command +* Nevery = perform ACKS2 every this many steps +* cutlo,cuthi = lo and hi cutoff for Taper radius +* tolerance = precision to which charges will be equilibrated +* params = reaxff or a filename + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 reaxff + fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 param.acks2 + +Description +""""""""""" + +Perform the atom-condensed Kohn-Sham DFT to second order (ACKS2) charge +equilibration method as described in :ref:`(Verstraelen) `. +ACKS2 impedes unphysical long-range charge transfer sometimes seen with +QEq (e.g. for dissociation of molecules), at increased computational +cost. It is typically used in conjunction with the ReaxFF force field +model as implemented in the :doc:`pair_style reaxff ` +command, but it can be used with any potential in LAMMPS, so long as it +defines and uses charges on each atom. For more technical details about +the charge equilibration performed by fix acks2/reaxff, see the +:ref:`(O'Hearn) ` paper. + +The ACKS2 method minimizes the electrostatic energy of the system by +adjusting the partial charge on individual atoms based on interactions +with their neighbors. It requires some parameters for each atom type. +If the *params* setting above is the word "reaxff", then these are +extracted from the :doc:`pair_style reaxff ` command and +the ReaxFF force field file it reads in. If a file name is specified +for *params*\ , then the parameters are taken from the specified file +and the file must contain one line for each atom type. The latter form +must be used when performing QeQ with a non-ReaxFF potential. The lines +should be formatted as follows: + +.. parsed-literal:: + + bond_softness + itype chi eta gamma bcut + +where the first line is the global parameter *bond_softness*. The +remaining 1 to Ntypes lines include *itype*, the atom type from 1 to +Ntypes, *chi*, the electronegativity in eV, *eta*, the self-Coulomb +potential in eV, *gamma*, the valence orbital exponent, and *bcut*, the +bond cutoff distance. Note that these 4 quantities are also in the +ReaxFF potential file, except that eta is defined here as twice the eta +value in the ReaxFF file. Note that unlike the rest of LAMMPS, the units +of this fix are hard-coded to be A, eV, and electronic charge. + +**Restart, fix_modify, output, run start/stop, minimize info:** + +No information about this fix is written to :doc:`binary restart files +`. No global scalar or vector or per-atom quantities are +stored by this fix for access by various :doc:`output commands +`. No parameter of this fix can be used with the +*start/stop* keywords of the :doc:`run ` command. + +This fix is invoked during :doc:`energy minimization `. + +---------- + +.. include:: accel_styles.rst + +---------- + +Restrictions +"""""""""""" + +This fix is part of the REAXFF package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package +` doc page for more info. + +This fix does not correctly handle interactions involving multiple +periodic images of the same atom. Hence, it should not be used for +periodic cell dimensions less than 10 angstroms. + +This fix may be used in combination with :doc:`fix efield ` +and will apply the external electric field during charge equilibration, +but there may be only one fix efield instance used, it may only use a +constant electric field, and the electric field vector may only have +components in non-periodic directions. + +Related commands +"""""""""""""""" + +:doc:`pair_style reaxff `, :doc:`fix qeq/reaxff ` + +**Default:** none + +---------- + +.. _O'Hearn: + +**(O'Hearn)** O'Hearn, Alperen, Aktulga, SIAM J. Sci. Comput., 42(1), C1-C22 (2020). + +.. _Verstraelen: + +**(Verstraelen)** Verstraelen, Ayers, Speybroeck, Waroquier, J. Chem. Phys. 138, 074108 (2013). diff --git a/doc/src/fix_atom_swap.rst b/doc/src/fix_atom_swap.rst index eb56572db7..8a81e32818 100644 --- a/doc/src/fix_atom_swap.rst +++ b/doc/src/fix_atom_swap.rst @@ -73,51 +73,51 @@ is the same after the swap as it was before the swap, even though the atom masses have changed. The *semi-grand* keyword can be set to *yes* to switch to the -semi-grand canonical ensemble as discussed in :ref:`(Sadigh) `. This -means that the total number of each particle type does not need to be -conserved. The default is *no*, which means that the only kind of swap -allowed exchanges an atom of one type with an atom of a different -given type. In other words, the relative mole fractions of the swapped -atoms remains constant. Whereas in the semi-grand canonical ensemble, -the composition of the system can change. Note that when using -*semi-grand*, atoms in the fix group whose type is not listed -in the *types* keyword are ineligible for attempted -conversion. An attempt is made to switch -the selected atom (if eligible) to one of the other listed types -with equal probability. Acceptance of each attempt depends upon the Metropolis criterion. +semi-grand canonical ensemble as discussed in :ref:`(Sadigh) +`. This means that the total number of each particle type does +not need to be conserved. The default is *no*, which means that the +only kind of swap allowed exchanges an atom of one type with an atom +of a different given type. In other words, the relative mole fractions +of the swapped atoms remains constant. Whereas in the semi-grand +canonical ensemble, the composition of the system can change. Note +that when using *semi-grand*, atoms in the fix group whose type is not +listed in the *types* keyword are ineligible for attempted +conversion. An attempt is made to switch the selected atom (if +eligible) to one of the other listed types with equal +probability. Acceptance of each attempt depends upon the Metropolis +criterion. -The *mu* keyword allows users to specify chemical -potentials. This is required and allowed only when using *semi-grand*\ . -All chemical potentials are absolute, so there is one for -each swap type listed following the *types* keyword. -In semi-grand canonical ensemble simulations the chemical composition -of the system is controlled by the difference in these values. So -shifting all values by a constant amount will have no effect -on the simulation. +The *mu* keyword allows users to specify chemical potentials. This is +required and allowed only when using *semi-grand*\ . All chemical +potentials are absolute, so there is one for each swap type listed +following the *types* keyword. In semi-grand canonical ensemble +simulations the chemical composition of the system is controlled by +the difference in these values. So shifting all values by a constant +amount will have no effect on the simulation. This command may optionally use the *region* keyword to define swap volume. The specified region must have been previously defined with a -:doc:`region ` command. It must be defined with side = *in*\ . -Swap attempts occur only between atoms that are both within the +:doc:`region ` command. It must be defined with side = *in*\ +. Swap attempts occur only between atoms that are both within the specified region. Swaps are not otherwise attempted. You should ensure you do not swap atoms belonging to a molecule, or -LAMMPS will soon generate an error when it tries to find those atoms. -LAMMPS will warn you if any of the atoms eligible for swapping have a -non-zero molecule ID, but does not check for this at the time of +LAMMPS will eventually generate an error when it tries to find those +atoms. LAMMPS will warn you if any of the atoms eligible for swapping +have a non-zero molecule ID, but does not check for this at the time of swapping. If not using *semi-grand* this fix checks to ensure all atoms of the given types have the same atomic charge. LAMMPS does not enforce this -in general, but it is needed for this fix to simplify the -swapping procedure. Successful swaps will swap the atom type and charge -of the swapped atoms. Conversely, when using *semi-grand*, it is assumed that all the atom -types involved in switches have the same charge. Otherwise, charge -would not be conserved. As a consequence, no checks on atomic charges are -performed, and successful switches update the atom type but not the -atom charge. While it is possible to use *semi-grand* with groups of -atoms that have different charges, these charges will not be changed when the -atom types change. +in general, but it is needed for this fix to simplify the swapping +procedure. Successful swaps will swap the atom type and charge of the +swapped atoms. Conversely, when using *semi-grand*, it is assumed that +all the atom types involved in switches have the same +charge. Otherwise, charge would not be conserved. As a consequence, no +checks on atomic charges are performed, and successful switches update +the atom type but not the atom charge. While it is possible to use +*semi-grand* with groups of atoms that have different charges, these +charges will not be changed when the atom types change. Since this fix computes total potential energies before and after proposed swaps, so even complicated potential energy calculations are @@ -133,23 +133,24 @@ OK, including the following: Some fixes have an associated potential energy. Examples of such fixes include: :doc:`efield `, :doc:`gravity `, :doc:`addforce `, :doc:`langevin `, -:doc:`restrain `, :doc:`temp/berendsen `, -:doc:`temp/rescale `, and :doc:`wall fixes `. -For that energy to be included in the total potential energy of the -system (the quantity used when performing GCMC moves), -you MUST enable the :doc:`fix_modify ` *energy* option for -that fix. The doc pages for individual :doc:`fix ` commands -specify if this should be done. +:doc:`restrain `, :doc:`temp/berendsen +`, :doc:`temp/rescale `, and +:doc:`wall fixes `. For that energy to be included in the +total potential energy of the system (the quantity used when +performing GCMC moves), you MUST enable the :doc:`fix_modify +` *energy* option for that fix. The doc pages for +individual :doc:`fix ` commands specify if this should be done. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -This fix writes the state of the fix to :doc:`binary restart files `. This includes information about the random -number generator seed, the next timestep for MC exchanges, the number -of exchange attempts and successes etc. See -the :doc:`read_restart ` command for info on how to -re-specify a fix in an input script that reads a restart file, so that -the operation of the fix continues in an uninterrupted fashion. +This fix writes the state of the fix to :doc:`binary restart files +`. This includes information about the random number +generator seed, the next timestep for MC exchanges, the number of +exchange attempts and successes etc. See the :doc:`read_restart +` command for info on how to re-specify a fix in an +input script that reads a restart file, so that the operation of the +fix continues in an uninterrupted fashion. .. note:: @@ -165,12 +166,13 @@ by various :doc:`output commands `. The vector values are the following global cumulative quantities: * 1 = swap attempts -* 2 = swap successes +* 2 = swap accepts The vector values calculated by this fix are "extensive". No parameter of this fix can be used with the *start/stop* keywords of -the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +the :doc:`run ` command. This fix is not invoked during +:doc:`energy minimization `. Restrictions """""""""""" @@ -184,7 +186,8 @@ Related commands :doc:`fix nvt `, :doc:`neighbor `, :doc:`fix deposit `, :doc:`fix evaporate `, -:doc:`delete_atoms `, :doc:`fix gcmc ` +:doc:`delete_atoms `, :doc:`fix gcmc `, +:doc:`fix mol/swap ` Default """"""" diff --git a/doc/src/fix_langevin.rst b/doc/src/fix_langevin.rst index c8be9afc31..5979155799 100644 --- a/doc/src/fix_langevin.rst +++ b/doc/src/fix_langevin.rst @@ -138,16 +138,18 @@ temperature with optional time-dependence as well. Like other fixes that perform thermostatting, this fix can be used with :doc:`compute commands ` that remove a "bias" from the -atom velocities. E.g. removing the center-of-mass velocity from a -group of atoms or removing the x-component of velocity from the -calculation. This is not done by default, but only if the -:doc:`fix_modify ` command is used to assign a temperature -compute to this fix that includes such a bias term. See the doc pages -for individual :doc:`compute commands ` to determine which ones -include a bias. In this case, the thermostat works in the following -manner: bias is removed from each atom, thermostatting is performed on -the remaining thermal degrees of freedom, and the bias is added back -in. +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. The *damp* parameter is specified in time units and determines how rapidly the temperature is relaxed. For example, a value of 100.0 means @@ -183,7 +185,8 @@ omega (which is derived from the angular momentum in the case of aspherical particles). The rotational temperature of the particles can be monitored by the -:doc:`compute temp/sphere ` and :doc:`compute temp/asphere ` commands with their rotate +:doc:`compute temp/sphere ` and :doc:`compute +temp/asphere ` commands with their rotate options. For the *omega* keyword there is also a scale factor of diff --git a/doc/src/fix_langevin_drude.rst b/doc/src/fix_langevin_drude.rst index 3486723a67..89ea28cf08 100644 --- a/doc/src/fix_langevin_drude.rst +++ b/doc/src/fix_langevin_drude.rst @@ -167,17 +167,20 @@ functions, and include :doc:`thermo_style ` command keywords for the simulation box parameters and timestep and elapsed time. Thus it is easy to specify a time-dependent temperature. -Like other fixes that perform thermostatting, this fix can be used with -:doc:`compute commands ` that remove a "bias" from the atom -velocities. E.g. removing the center-of-mass velocity from a group of -atoms. This is not done by default, but only if the -:doc:`fix_modify ` command is used to assign a temperature -compute to this fix that includes such a bias term. See the doc pages -for individual :doc:`compute commands ` to determine which ones -include a bias. In this case, the thermostat works in the following -manner: bias is removed from each atom, thermostatting is performed on -the remaining thermal degrees of freedom, and the bias is added back -in. NOTE: this feature has not been tested. +Like other fixes that perform thermostatting, this fix can be used +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. Note: The temperature thermostatting the core-Drude particle pairs should be chosen low enough, so as to mimic as closely as possible the diff --git a/doc/src/fix_mol_swap.rst b/doc/src/fix_mol_swap.rst new file mode 100644 index 0000000000..737536fa0d --- /dev/null +++ b/doc/src/fix_mol_swap.rst @@ -0,0 +1,170 @@ +.. index:: fix mol/swap + +fix mol/swap command +===================== + +Syntax +"""""" + +.. parsed-literal:: + + fix ID group-ID mol/swap N X itype jtype seed T keyword value ... + +* ID, group-ID are documented in :doc:`fix ` command +* atom/swap = style name of this fix command +* N = invoke this fix every N steps +* X = number of swaps to attempt every N steps +* itype,jtype = two atom types to swap with each other +* seed = random # seed (positive integer) +* T = scaling temperature of the MC swaps (temperature units) +* zero or more keyword/value pairs may be appended to args +* keyword = *ke* + + .. parsed-literal:: + + *ke* value = *no* or *yes* + *no* = no conservation of kinetic energy after atom swaps + *yes* = kinetic energy is conserved after atom swaps + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix 2 all mol/swap 100 1 2 3 29494 300.0 ke no + fix mySwap fluid mol/swap 500 10 1 2 482798 1.0 + +Description +""""""""""" + +This fix performs Monte Carlo swaps of two specified atom types within +a randomly selected molecule. Two possible use cases are as follows. + +First, consider a mixture of some molecules with atoms of itype and +other molecules with atoms of jtype. The fix will select a random +molecule and attempt to swap all the itype atoms to jtype for the +first kind of molecule, or all the jtype atoms to itype for the second +kind. Because the swap will only take place if it is energetically +favorable, the fix can be used to determine the miscibility of 2 +different kinds of molecules much more quickly than just dynamics +would do it. + +Second, consider diblock co-polymers with two types of monomers itype +and jtype. The fix will select a random molecule and attempt to do a +itype <--> jtype swap of all those monomers within the molecule. Thus +the fix can be used to find the energetically favorable fractions of +two flavors of diblock co-polymers. + +Intra-molecular swaps of atom types are attempted every N timesteps. On +that timestep, X swaps are attempted. For each attempt a single +molecule ID is randomly selected. The range of possible molecule IDs +from loID to hiID is pre-computed before each run begins. The +loID/hiID is set for the molecule with the smallest/largest ID which +has any itype or jtype atoms in it. Note that if you define a system +with many molecule IDs between loID and hiID which have no itype or +jtype atoms, then the fix will be inefficient at performing swaps. +Also note that if atoms with molecule ID = 0 exist, they are not +considered molecules by this fix; they are assumed to be solvent atoms +or molecules. + +Candidate atoms for swapping must also be in the fix group. Atoms +within the selected molecule which are not itype or jtype are ignored. + +When an atom is swapped from itype to jtype (or vice versa), if +charges are defined, the charge values for itype versus jtype atoms +are also swapped. This requires that all itype atoms in the system +have the same charge value. Likewise all jtype atoms in the system +must have the same charge value. If this is not the case, LAMMPS +issues a warning that it cannot swap charge values. + +If the *ke* keyword is set to yes, which is the default, and the +masses of itype and jtype atoms are different, then when a swap +occurs, the velocity of the swapped atom is rescaled by the sqrt of +the mass ratio, so as to conserve the kinetic energy of the atom. + +---------- + +The potential energy of the entire system is computed before and after +each swap is performed within a single molecule. The specified +temperature T is used in the Metropolis criterion to accept or reject +the attempted swap. If the swap is rejected all swapped values are +reversed. + +The potential energy calculations can include systems and models with +the following features: + +* manybody pair styles, including EAM +* hybrid pair styles +* long-range electrostatics (kspace) +* triclinic systems +* potential energy contributions from other fixes + +For the last bullet point, fixes can have an associated potential +energy. Examples of such fixes include: :doc:`efield `, +:doc:`gravity `, :doc:`addforce `, +:doc:`langevin `, :doc:`restrain `, +:doc:`temp/berendsen `, :doc:`temp/rescale +`, and :doc:`wall fixes `. For that +energy to be included in the total potential energy of the system (the +quantity used for the swap accept/reject decision), you MUST enable +the :doc:`fix_modify ` *energy* option for that fix. The +doc pages for individual :doc:`fix ` commands specify if this +should be done. + +.. note:: + + One comment on computational efficiency. If the cutoff lengths + defined for the pair style are different for itype versus jtype + atoms (for any of their interactions with any other atom type), then + a new neighbor list needs to be generated for every attempted swap. + This is potentially expensive if N is small or X is large. + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +This fix writes the state of the fix to :doc:`binary restart files +`. This includes information about the random number +generator seed, the next timestep for MC exchanges, the number of +exchange attempts and successes etc. See the :doc:`read_restart +` command for info on how to re-specify a fix in an +input script that reads a restart file, so that the operation of the +fix continues in an uninterrupted fashion. + +.. note:: + + For this to work correctly, the timestep must **not** be changed + after reading the restart with :doc:`reset_timestep `. + The fix will try to detect it and stop with an error. + +None of the :doc:`fix_modify ` options are relevant to this +fix. + +This fix computes a global vector of length 2, which can be accessed +by various :doc:`output commands `. The vector values are +the following global cumulative quantities: + +* 1 = swap attempts +* 2 = swap accepts + +The vector values calculated by this fix are "extensive". + +No parameter of this fix can be used with the *start/stop* keywords of +the :doc:`run ` command. This fix is not invoked during +:doc:`energy minimization `. + +Restrictions +"""""""""""" + +This fix is part of the MC package. It is only enabled if LAMMPS was +built with that package. See the :doc:`Build package ` +doc page for more info. + +Related commands +"""""""""""""""" + +:doc:`fix atom/swap `, :doc:`fix gcmc ` + +Default +""""""" + +The option default is ke = yes. diff --git a/doc/src/fix_nh.rst b/doc/src/fix_nh.rst index 46b343fdce..cb9e6ba61e 100644 --- a/doc/src/fix_nh.rst +++ b/doc/src/fix_nh.rst @@ -486,19 +486,20 @@ temperature or pressure during thermodynamic output via the compute-ID. It also means that changing attributes of *thermo_temp* or *thermo_press* will have no effect on this fix. -Like other fixes that perform thermostatting, fix nvt and fix npt can -be used with :doc:`compute commands ` that calculate a -temperature after removing a "bias" from the atom velocities. -E.g. removing the center-of-mass velocity from a group of atoms or -only calculating temperature on the x-component of velocity or only -calculating temperature for atoms in a geometric region. This is not -done by default, but only if the :doc:`fix_modify ` command -is used to assign a temperature compute to this fix that includes such -a bias term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +Like other fixes that perform thermostatting, this fix can be used +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_npt_asphere.rst b/doc/src/fix_npt_asphere.rst index 28edb59f8d..64e1c45be7 100644 --- a/doc/src/fix_npt_asphere.rst +++ b/doc/src/fix_npt_asphere.rst @@ -48,8 +48,9 @@ can also have a bias velocity removed from them before thermostatting takes place; see the description below. Additional parameters affecting the thermostat and barostat are -specified by keywords and values documented with the :doc:`fix npt ` command. See, for example, discussion of the *temp*, -*iso*, *aniso*, and *dilate* keywords. +specified by keywords and values documented with the :doc:`fix npt +` command. See, for example, discussion of the *temp*, *iso*, +*aniso*, and *dilate* keywords. The particles in the fix group are the only ones whose velocities and positions are updated by the velocity/position update portion of the @@ -89,18 +90,19 @@ It also means that changing attributes of *thermo_temp* or *thermo_press* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_npt_body.rst b/doc/src/fix_npt_body.rst index d44870a4fb..ff98638b63 100644 --- a/doc/src/fix_npt_body.rst +++ b/doc/src/fix_npt_body.rst @@ -87,18 +87,19 @@ It also means that changing attributes of *thermo_temp* or *thermo_press* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_npt_cauchy.rst b/doc/src/fix_npt_cauchy.rst index 13b5b7bf70..6ff3dffba3 100644 --- a/doc/src/fix_npt_cauchy.rst +++ b/doc/src/fix_npt_cauchy.rst @@ -400,19 +400,20 @@ temperature or pressure during thermodynamic output via the compute-ID. It also means that changing attributes of *thermo_temp* or *thermo_press* will have no effect on this fix. -Like other fixes that perform thermostatting, fix npt/cauchy can -be used with :doc:`compute commands ` that calculate a -temperature after removing a "bias" from the atom velocities. -E.g. removing the center-of-mass velocity from a group of atoms or -only calculating temperature on the x-component of velocity or only -calculating temperature for atoms in a geometric region. This is not -done by default, but only if the :doc:`fix_modify ` command -is used to assign a temperature compute to this fix that includes such -a bias term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +Like other fixes that perform thermostatting, this fix can be used +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_npt_sphere.rst b/doc/src/fix_npt_sphere.rst index 75e4c9a4ec..bd52ca9dc5 100644 --- a/doc/src/fix_npt_sphere.rst +++ b/doc/src/fix_npt_sphere.rst @@ -103,18 +103,19 @@ appropriate compute-ID. It also means that changing attributes of *thermo_temp* or *thermo_press* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_nvt_asphere.rst b/doc/src/fix_nvt_asphere.rst index 00f4588f7f..7ce3aec125 100644 --- a/doc/src/fix_nvt_asphere.rst +++ b/doc/src/fix_nvt_asphere.rst @@ -72,18 +72,19 @@ It also means that changing attributes of *thermo_temp* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_nvt_body.rst b/doc/src/fix_nvt_body.rst index 28ad3e7857..7b9e996a5b 100644 --- a/doc/src/fix_nvt_body.rst +++ b/doc/src/fix_nvt_body.rst @@ -69,18 +69,19 @@ It also means that changing attributes of *thermo_temp* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_nvt_sllod.rst b/doc/src/fix_nvt_sllod.rst index 3d041ca767..4bb4478991 100644 --- a/doc/src/fix_nvt_sllod.rst +++ b/doc/src/fix_nvt_sllod.rst @@ -37,15 +37,16 @@ trajectory consistent with the canonical ensemble. This thermostat is used for a simulation box that is changing size and/or shape, for example in a non-equilibrium MD (NEMD) simulation. -The size/shape change is induced by use of the :doc:`fix deform ` command, so each point in the simulation box -can be thought of as having a "streaming" velocity. This -position-dependent streaming velocity is subtracted from each atom's -actual velocity to yield a thermal velocity which is used for -temperature computation and thermostatting. For example, if the box -is being sheared in x, relative to y, then points at the bottom of the -box (low y) have a small x velocity, while points at the top of the -box (hi y) have a large x velocity. These velocities do not -contribute to the thermal "temperature" of the atom. +The size/shape change is induced by use of the :doc:`fix deform +` command, so each point in the simulation box can be +thought of as having a "streaming" velocity. This position-dependent +streaming velocity is subtracted from each atom's actual velocity to +yield a thermal velocity which is used for temperature computation and +thermostatting. For example, if the box is being sheared in x, +relative to y, then points at the bottom of the box (low y) have a +small x velocity, while points at the top of the box (hi y) have a +large x velocity. These velocities do not contribute to the thermal +"temperature" of the atom. .. note:: @@ -60,13 +61,15 @@ contribute to the thermal "temperature" of the atom. consistent. The SLLOD equations of motion, originally proposed by Hoover and Ladd -(see :ref:`(Evans and Morriss) `), were proven to be equivalent to -Newton's equations of motion for shear flow by :ref:`(Evans and Morriss) `. They were later shown to generate the desired -velocity gradient and the correct production of work by stresses for -all forms of homogeneous flow by :ref:`(Daivis and Todd) `. As -implemented in LAMMPS, they are coupled to a Nose/Hoover chain -thermostat in a velocity Verlet formulation, closely following the -implementation used for the :doc:`fix nvt ` command. +(see :ref:`(Evans and Morriss) `), were proven to be +equivalent to Newton's equations of motion for shear flow by +:ref:`(Evans and Morriss) `. They were later shown to generate +the desired velocity gradient and the correct production of work by +stresses for all forms of homogeneous flow by :ref:`(Daivis and Todd) +`. As implemented in LAMMPS, they are coupled to a +Nose/Hoover chain thermostat in a velocity Verlet formulation, closely +following the implementation used for the :doc:`fix nvt ` +command. .. note:: @@ -94,27 +97,28 @@ underscore + "temp", and the group for the new compute is the same as the fix group. Note that this is NOT the compute used by thermodynamic output (see -the :doc:`thermo_style ` command) with ID = *thermo_temp*. -This means you can change the attributes of this fix's temperature -(e.g. its degrees-of-freedom) via the -:doc:`compute_modify ` command or print this temperature -during thermodynamic output via the :doc:`thermo_style custom ` command using the appropriate compute-ID. -It also means that changing attributes of *thermo_temp* will have no -effect on this fix. +the :doc:`thermo_style ` command) with ID = +*thermo_temp*. This means you can change the attributes of this fix's +temperature (e.g. its degrees-of-freedom) via the :doc:`compute_modify +` command or print this temperature during +thermodynamic output via the :doc:`thermo_style custom ` +command using the appropriate compute-ID. It also means that changing +attributes of *thermo_temp* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_nvt_sphere.rst b/doc/src/fix_nvt_sphere.rst index 31c8d91889..91575d4c48 100644 --- a/doc/src/fix_nvt_sphere.rst +++ b/doc/src/fix_nvt_sphere.rst @@ -86,18 +86,19 @@ It also means that changing attributes of *thermo_temp* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_qeq.rst b/doc/src/fix_qeq.rst index eab35391b5..f4e4a2a5cc 100644 --- a/doc/src/fix_qeq.rst +++ b/doc/src/fix_qeq.rst @@ -230,7 +230,10 @@ These fixes are part of the QEQ package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. -The qeq fixes are not compatible with the GPU and USER-INTEL packages. +These qeq fixes are not compatible with the GPU and USER-INTEL packages. + +These qeq fixes will ignore electric field contributions from +:doc:`fix efield `. Related commands """""""""""""""" diff --git a/doc/src/fix_qeq_reaxff.rst b/doc/src/fix_qeq_reaxff.rst index ada9e22ed7..9c9dce7f89 100644 --- a/doc/src/fix_qeq_reaxff.rst +++ b/doc/src/fix_qeq_reaxff.rst @@ -116,6 +116,12 @@ This fix does not correctly handle interactions involving multiple periodic images of the same atom. Hence, it should not be used for periodic cell dimensions less than 10 angstroms. +This fix may be used in combination with :doc:`fix efield ` +and will apply the external electric field during charge equilibration, +but there may be only one fix efield instance used, it may only use a +constant electric field, and the electric field vector may only have +components in non-periodic directions. + Related commands """""""""""""""" diff --git a/doc/src/fix_reaxff_species.rst b/doc/src/fix_reaxff_species.rst index 434e18d8a5..a652777ba7 100644 --- a/doc/src/fix_reaxff_species.rst +++ b/doc/src/fix_reaxff_species.rst @@ -56,6 +56,17 @@ number of molecules of each species. In this context, "species" means a unique molecule. The chemical formula of each species is given in the first line. +.. warning:: + + In order to compute averaged data, it is required that there are no + neighbor list rebuilds between the *Nfreq* steps. For that reason, fix + *reaxff/species* may change your neighbor list settings. There will + be a warning message showing the new settings. Having an *Nfreq* + setting that is larger than what is required for correct computation + of the ReaxFF force field interactions can thus lead to incorrect + results. For typical ReaxFF calculations a value of 100 is already + quite large. + If the filename ends with ".gz", the output file is written in gzipped format. A gzipped dump file will be about 3x smaller than the text version, but will also take longer to write. diff --git a/doc/src/fix_saed_vtk.rst b/doc/src/fix_saed_vtk.rst index a9e8f154e6..dd5db32966 100644 --- a/doc/src/fix_saed_vtk.rst +++ b/doc/src/fix_saed_vtk.rst @@ -28,7 +28,6 @@ Syntax Nstart = start averaging on this timestep *file* arg = filename filename = name of file to output time averages to - *overwrite* arg = none = overwrite output file with only latest output Examples """""""" @@ -161,10 +160,6 @@ the *file* keyword and this string is appended with _N.vtk where N is an index (0,1,2...) to account for situations with multiple diffraction intensity outputs. -The *overwrite* keyword will continuously overwrite the output file -with the latest output, so that it only contains one timestep worth of -output. This option can only be used with the *ave running* setting. - Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" diff --git a/doc/src/fix_setforce.rst b/doc/src/fix_setforce.rst index fd1eb70c4a..f899b63aa5 100644 --- a/doc/src/fix_setforce.rst +++ b/doc/src/fix_setforce.rst @@ -89,26 +89,13 @@ precession vectors instead of the forces. ---------- -Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the :doc:`Speed packages ` doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. +.. include:: accel_styles.rst -The region keyword is also supported by Kokkos, but a Kokkos-enabled -region must be used. See the region :doc:`region ` command for -more information. +.. note:: -These accelerated styles are part of the r Kokkos package. They are -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the -:doc:`suffix ` command in your input script. - -See the :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. + The region keyword is supported by Kokkos, but a Kokkos-enabled + region must be used. See the region :doc:`region ` command for + more information. ---------- diff --git a/doc/src/fix_temp_berendsen.rst b/doc/src/fix_temp_berendsen.rst index 89fc2392f4..473c30aced 100644 --- a/doc/src/fix_temp_berendsen.rst +++ b/doc/src/fix_temp_berendsen.rst @@ -102,18 +102,19 @@ It also means that changing attributes of *thermo_temp* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_temp_csvr.rst b/doc/src/fix_temp_csvr.rst index 81379f346b..5fc6e8eae7 100644 --- a/doc/src/fix_temp_csvr.rst +++ b/doc/src/fix_temp_csvr.rst @@ -110,28 +110,29 @@ during thermodynamic output via the :doc:`thermo_style custom ` co It also means that changing attributes of *thermo_temp* will have no effect on this fix. -Like other fixes that perform thermostatting, these fixes can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is used -to assign a temperature compute to this fix that includes such a bias -term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal degrees of freedom, and the bias is added back in. +Like other fixes that perform thermostatting, this fix can be used +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. An important feature of these thermostats is that they have an -associated effective energy that is a constant of motion. -The effective energy is the total energy (kinetic + potential) plus -the accumulated kinetic energy changes due to the thermostat. The -latter quantity is the global scalar computed by these fixes. This -feature is useful to check the integration of the equations of motion -against discretization errors. In other words, the conservation of -the effective energy can be used to choose an appropriate integration +associated effective energy that is a constant of motion. The +effective energy is the total energy (kinetic + potential) plus the +accumulated kinetic energy changes due to the thermostat. The latter +quantity is the global scalar computed by these fixes. This feature is +useful to check the integration of the equations of motion against +discretization errors. In other words, the conservation of the +effective energy can be used to choose an appropriate integration :doc:`timestep `. This is similar to the usual paradigm of checking the conservation of the total energy in the microcanonical ensemble. diff --git a/doc/src/fix_temp_rescale.rst b/doc/src/fix_temp_rescale.rst index a61773d2a2..41ad8709cc 100644 --- a/doc/src/fix_temp_rescale.rst +++ b/doc/src/fix_temp_rescale.rst @@ -109,19 +109,19 @@ command using the appropriate compute-ID. It also means that changing attributes of *thermo_temp* will have no effect on this fix. Like other fixes that perform thermostatting, this fix can be used -with :doc:`compute commands ` that calculate a temperature -after removing a "bias" from the atom velocities. E.g. removing the -center-of-mass velocity from a group of atoms or only calculating -temperature on the x-component of velocity or only calculating -temperature for atoms in a geometric region. This is not done by -default, but only if the :doc:`fix_modify ` command is -used to assign a temperature compute to this fix that includes such a -bias term. See the doc pages for individual :doc:`compute commands -` to determine which ones include a bias. In this case, the -thermostat works in the following manner: the current temperature is -calculated taking the bias into account, bias is removed from each -atom, thermostatting is performed on the remaining thermal degrees of -freedom, and the bias is added back in. +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. ---------- diff --git a/doc/src/fix_tgnh_drude.rst b/doc/src/fix_tgnh_drude.rst index 7088692353..d1f5cf19a4 100644 --- a/doc/src/fix_tgnh_drude.rst +++ b/doc/src/fix_tgnh_drude.rst @@ -187,26 +187,32 @@ barostatting. ---------- -Like other fixes that perform thermostatting, these fixes can -be used with :doc:`compute commands ` that calculate a -temperature after removing a "bias" from the atom velocities. -This is not done by default, but only if the :doc:`fix_modify ` command -is used to assign a temperature compute to this fix that includes such -a bias term. See the doc pages for individual :doc:`compute commands ` to determine which ones include a bias. In -this case, the thermostat works in the following manner: the current -temperature is calculated taking the bias into account, bias is -removed from each atom, thermostatting is performed on the remaining -thermal DOF, and the bias is added back in. +Like other fixes that perform thermostatting, this fix can be used +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. .. note:: - However, not all temperature compute commands are valid to be used with these fixes. - Precisely, only temperature compute that does not modify the DOF of the group can be used. - E.g. :doc:`compute temp/ramp ` and :doc:`compute viscosity/cos ` - compute the kinetic energy after remove a velocity gradient without affecting the DOF of the group, - then they can be invoked in this way. - In contrast, :doc:`compute temp/partial ` may remove the DOF at one or more dimensions, - therefore it cannot be used with these fixes. + However, not all temperature compute commands are valid to be used + with these fixes. Precisely, only temperature compute that does + not modify the DOF of the group can be used. E.g. :doc:`compute + temp/ramp ` and :doc:`compute viscosity/cos + ` compute the kinetic energy after remove a + velocity gradient without affecting the DOF of the group, then they + can be invoked in this way. In contrast, :doc:`compute + temp/partial ` may remove the DOF at one or + more dimensions, therefore it cannot be used with these fixes. ---------- diff --git a/doc/src/improper_harmonic.rst b/doc/src/improper_harmonic.rst index 42cd3b75c5..706b8af1de 100644 --- a/doc/src/improper_harmonic.rst +++ b/doc/src/improper_harmonic.rst @@ -64,25 +64,7 @@ radian\^2. ---------- -Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the :doc:`Speed packages ` doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. - -These accelerated styles are part of the GPU, INTEL, KOKKOS, -OPENMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the :doc:`Build package -` page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the :doc:`-suffix -command-line switch ` when you invoke LAMMPS, or you can -use the :doc:`suffix ` command in your input script. - -See the :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. +.. include:: accel_styles.rst ---------- diff --git a/doc/src/kspace_style.rst b/doc/src/kspace_style.rst index be854581ed..1dec62bb43 100644 --- a/doc/src/kspace_style.rst +++ b/doc/src/kspace_style.rst @@ -414,33 +414,26 @@ relative RMS error. ---------- -Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the :doc:`Speed packages ` doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. +.. include:: accel_styles.rst -More specifically, the *pppm/gpu* style performs charge assignment and -force interpolation calculations on the GPU. These processes are -performed either in single or double precision, depending on whether -the -DFFT_SINGLE setting was specified in your low-level Makefile, as -discussed above. The FFTs themselves are still calculated on the CPU. -If *pppm/gpu* is used with a GPU-enabled pair style, part of the PPPM -calculation can be performed concurrently on the GPU while other -calculations for non-bonded and bonded force calculation are performed -on the CPU. +.. note:: -The *pppm/kk* style performs charge assignment and force interpolation -calculations, along with the FFTs themselves, on the GPU or (optionally) threaded -on the CPU when using OpenMP and FFTW3. + For the GPU package, the *pppm/gpu* style performs charge assignment + and force interpolation calculations on the GPU. These processes + are performed either in single or double precision, depending on + whether the -DFFT_SINGLE setting was specified in your low-level + Makefile, as discussed above. The FFTs themselves are still + calculated on the CPU. If *pppm/gpu* is used with a GPU-enabled + pair style, part of the PPPM calculation can be performed + concurrently on the GPU while other calculations for non-bonded and + bonded force calculation are performed on the CPU. -These accelerated styles are part of the GPU, INTEL, KOKKOS, -OPENMP, and OPT packages respectively. They are only enabled if -LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. +.. note:: -See the :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. + For the KOKKOS package, the *pppm/kk* style performs charge + assignment and force interpolation calculations, along with the FFTs + themselves, on the GPU or (optionally) threaded on the CPU when + using OpenMP and FFTW3. ---------- diff --git a/doc/src/package.rst b/doc/src/package.rst index 0fc71b48f9..2cf772ea5a 100644 --- a/doc/src/package.rst +++ b/doc/src/package.rst @@ -166,7 +166,7 @@ intel", or "package omp" command with default settings. set, either to default values or to specified settings. I.e. settings from previous invocations do not persist across multiple invocations. -See the :doc:`Speed packages ` page for more details +See the :doc:`Accelerator packages ` page for more details about using the various accelerator packages for speeding up LAMMPS simulations. diff --git a/doc/src/pair_agni.rst b/doc/src/pair_agni.rst index 8e91e57b72..ae23306195 100644 --- a/doc/src/pair_agni.rst +++ b/doc/src/pair_agni.rst @@ -67,21 +67,7 @@ and input files are provided in the examples/PACKAGES/agni directory. ---------- -Styles with *omp* suffix is functionally the same as the corresponding -style without the suffix. They have been optimized to run faster, -depending on your available hardware, as discussed on the :doc:`Speed packages ` doc page. The accelerated style takes -the same arguments and should produce the same results, except for -round-off and precision issues. - -The accelerated style is part of the OPENMP. They are only enabled -if LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. - -You can specify the accelerated style explicitly in your input script -by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the -:doc:`suffix ` command in your input script. - -See the :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. +.. include:: accel_styles.rst ---------- diff --git a/doc/src/pair_hybrid.rst b/doc/src/pair_hybrid.rst index 9c3cd6622a..541cdc1911 100644 --- a/doc/src/pair_hybrid.rst +++ b/doc/src/pair_hybrid.rst @@ -383,30 +383,19 @@ coefficients to 0.0. ---------- -Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the :doc:`Speed packages ` doc -page. Pair style *hybrid/scaled* does (currently) not support the -*gpu*, *omp*, *kk*, or *intel* suffix. +.. include:: accel_styles.rst -Since the *hybrid*, *hybrid/overlay*, *hybrid/scaled* styles delegate -computation to the individual sub-styles, the suffix versions of the -*hybrid* and *hybrid/overlay* styles are used to propagate the -corresponding suffix to all sub-styles, if those versions -exist. Otherwise the non-accelerated version will be used. +.. note:: -The individual accelerated sub-styles are part of the GPU, KOKKOS, -INTEL, OPENMP, and OPT packages, respectively. They are only -enabled if LAMMPS was built with those packages. See the :doc:`Build -package ` page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the -:doc:`suffix ` command in your input script. - -See the :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. + Since the *hybrid*, *hybrid/overlay*, *hybrid/scaled* styles + delegate computation to the individual sub-styles, the suffix + versions of the *hybrid* and *hybrid/overlay* styles are used to + propagate the corresponding suffix to all sub-styles, if those + versions exist. Otherwise the non-accelerated version will be used. + The individual accelerated sub-styles are part of the GPU, KOKKOS, + INTEL, OPENMP, and OPT packages, respectively. They are only + enabled if LAMMPS was built with those packages. See the + :doc:`Build package ` page for more info. ---------- diff --git a/doc/src/pair_reaxff.rst b/doc/src/pair_reaxff.rst index a3a9c81cb8..a2aa0f356d 100644 --- a/doc/src/pair_reaxff.rst +++ b/doc/src/pair_reaxff.rst @@ -20,7 +20,7 @@ Syntax .. parsed-literal:: keyword = *checkqeq* or *lgvdw* or *safezone* or *mincap* or *minhbonds* - *checkqeq* value = *yes* or *no* = whether or not to require qeq/reaxff fix + *checkqeq* value = *yes* or *no* = whether or not to require qeq/reaxff or acks2/reaxff fix *enobonds* value = *yes* or *no* = whether or not to tally energy of atoms with no bonds *lgvdw* value = *yes* or *no* = whether or not to use a low gradient vdW correction *safezone* = factor used for array allocation @@ -119,7 +119,8 @@ The ReaxFF parameter files provided were created using a charge equilibration (QEq) model for handling the electrostatic interactions. Therefore, by default, LAMMPS requires that either the :doc:`fix qeq/reaxff ` or the -:doc:`fix qeq/shielded ` command be used with +:doc:`fix qeq/shielded ` or :doc:`fix acks2/reaxff ` +command be used with *pair_style reaxff* when simulating a ReaxFF model, to equilibrate the charges each timestep. @@ -128,7 +129,8 @@ for the QEq fixes, allowing a simulation to be run without charge equilibration. In this case, the static charges you assign to each atom will be used for computing the electrostatic interactions in the system. See the :doc:`fix qeq/reaxff ` or -:doc:`fix qeq/shielded ` command documentation for more details. +:doc:`fix qeq/shielded ` or :doc:`fix acks2/reaxff ` +command documentation for more details. Using the optional keyword *lgvdw* with the value *yes* turns on the low-gradient correction of ReaxFF for long-range London Dispersion, @@ -352,7 +354,8 @@ Related commands """""""""""""""" :doc:`pair_coeff `, :doc:`fix qeq/reaxff `, -:doc:`fix reaxff/bonds `, :doc:`fix reaxff/species ` +:doc:`fix acks2/reaxff `, :doc:`fix reaxff/bonds `, +:doc:`fix reaxff/species ` Default """"""" diff --git a/doc/src/pair_sw.rst b/doc/src/pair_sw.rst index f207b25863..1b2a4a4b1d 100644 --- a/doc/src/pair_sw.rst +++ b/doc/src/pair_sw.rst @@ -159,28 +159,14 @@ taken from the ij and ik pairs (:math:`\sigma`, *a*, :math:`\gamma`) ---------- -Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the :doc:`Speed packages ` doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. +.. include:: accel_styles.rst -These accelerated styles are part of the GPU, INTEL, KOKKOS, -OPENMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. +.. note:: -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the -:doc:`suffix ` command in your input script. - -When using the INTEL package with this style, there is an -additional 5 to 10 percent performance improvement when the -Stillinger-Weber parameters p and q are set to 4 and 0 respectively. -These parameters are common for modeling silicon and water. - -See the :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. + When using the INTEL package with this style, there is an additional + 5 to 10 percent performance improvement when the Stillinger-Weber + parameters p and q are set to 4 and 0 respectively. These + parameters are common for modeling silicon and water. ---------- diff --git a/doc/src/plugin.rst b/doc/src/plugin.rst index 7995ddc369..5372dffc83 100644 --- a/doc/src/plugin.rst +++ b/doc/src/plugin.rst @@ -65,10 +65,8 @@ only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Plugins are not available on Windows. -For the loading of plugins to work the LAMMPS library must be -:ref:`compiled as a shared library `. If plugins -access functions or classes from a package, LAMMPS must have -been compiled with that package included. +If plugins access functions or classes from a package, LAMMPS must +have been compiled with that package included. Plugins are dependent on the LAMMPS binary interface (ABI) and particularly the MPI library used. So they are not guaranteed diff --git a/doc/src/region.rst b/doc/src/region.rst index d891a69410..da3e67c004 100644 --- a/doc/src/region.rst +++ b/doc/src/region.rst @@ -371,26 +371,13 @@ sub-regions can be defined with the *open* keyword. ---------- -Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the :doc:`Speed packages ` doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. +.. include:: accel_styles.rst -The code using the region (such as a fix or compute) must also be supported -by Kokkos or no acceleration will occur. Currently, only *block* style -regions are supported by Kokkos. +.. note:: -These accelerated styles are part of the Kokkos package. They are -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the -:doc:`suffix ` command in your input script. - -See the :doc:`Speed packages ` page for more -instructions on how to use the accelerated styles effectively. + Currently, only *block* style regions are supported by Kokkos. The + code using the region (such as a fix or compute) must also be + supported by Kokkos or no acceleration will occur. ---------- diff --git a/doc/src/run_style.rst b/doc/src/run_style.rst index bcfa3d7b54..b4d1c22113 100644 --- a/doc/src/run_style.rst +++ b/doc/src/run_style.rst @@ -125,12 +125,13 @@ screen.0 by default; see the :doc:`-plog and -pscreen command-line switches ` page for performance -details of the speed-up offered by the *verlet/split* style. One -important performance consideration is the assignment of logical -processors in the 2 partitions to the physical cores of a parallel -machine. The :doc:`processors ` command has options to -support this, and strategies are discussed in :doc:`Section 5 ` of the manual. +See the :doc:`Accelerator packages ` page for +performance details of the speed-up offered by the *verlet/split* +style. One important performance consideration is the assignment of +logical processors in the 2 partitions to the physical cores of a +parallel machine. The :doc:`processors ` command has +options to support this, and strategies are discussed in :doc:`Section +5 ` of the manual. ---------- @@ -295,10 +296,10 @@ except for round-off and precision issues. You can specify *respa/omp* explicitly in your input script, or you can use the :doc:`-suffix command-line switch ` when you -invoke LAMMPS, or you can use the :doc:`suffix ` command in your -input script. +invoke LAMMPS, or you can use the :doc:`suffix ` command in +your input script. -See the :doc:`Speed packages ` page for more +See the :doc:`Accelerator packages ` page for more instructions on how to use the accelerated styles effectively. ---------- @@ -308,7 +309,8 @@ Restrictions The *verlet/split* style can only be used if LAMMPS was built with the REPLICA package. Correspondingly the *respa/omp* style is available -only if the OPENMP package was included. See the :doc:`Build package ` page for more info. +only if the OPENMP package was included. See the :doc:`Build package +` page for more info. Whenever using rRESPA, the user should experiment with trade-offs in speed and accuracy for their system, and verify that they are diff --git a/doc/utils/check-styles.py b/doc/utils/check-styles.py index 6c1fd6dd35..2ad75aeeda 100755 --- a/doc/utils/check-styles.py +++ b/doc/utils/check-styles.py @@ -254,7 +254,7 @@ for command_type, entries in index.items(): print("Total number of style index entries:", total_index) -skip_fix = ('python', 'NEIGH_HISTORY/omp','qeq/reax','reax/c/bonds','reax/c/species') +skip_fix = ('python', 'NEIGH_HISTORY/omp','acks2/reax','qeq/reax','reax/c/bonds','reax/c/species') skip_pair = ('meam/c','lj/sf','reax/c') counter = 0 @@ -282,7 +282,7 @@ if counter: counter = 0 counter += check_style_index("compute", compute, index["compute"]) -counter += check_style_index("fix", fix, index["fix"], skip=['python','qeq/reax','reax/c/bonds','reax/c/species']) +counter += check_style_index("fix", fix, index["fix"], skip=['python','acks2/reax','qeq/reax','reax/c/bonds','reax/c/species']) counter += check_style_index("angle_style", angle, index["angle_style"]) counter += check_style_index("bond_style", bond, index["bond_style"]) counter += check_style_index("dihedral_style", dihedral, index["dihedral_style"]) diff --git a/doc/utils/requirements.txt b/doc/utils/requirements.txt index f367727d20..9b8e106875 100644 --- a/doc/utils/requirements.txt +++ b/doc/utils/requirements.txt @@ -1,7 +1,7 @@ -Sphinx==4.0.3 -sphinxcontrib-spelling==7.2.1 +Sphinx +sphinxcontrib-spelling git+git://github.com/akohlmey/sphinx-fortran@parallel-read -sphinx_tabs==3.2.0 -breathe==4.31.0 -Pygments==2.10.0 -six==1.16.0 +sphinx_tabs +breathe +Pygments +six diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 5f64a4229c..d295767519 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -19,6 +19,7 @@ accuracies ach ackland Ackland +acks acolor acos Acta @@ -77,6 +78,7 @@ allocators allosws AlO Alonso +Alperen alphak alphashrink amap @@ -685,6 +687,7 @@ diagonalized diagonalizers diagonalizing Diallo +diblock Dickel diel differentiable @@ -1135,6 +1138,7 @@ Germann Germano gerolf Gerolf +getrusage Gershgorin getter gettimeofday @@ -1222,6 +1226,7 @@ Guo gw gyromagnetic gz +gzip gzipped Haak Hafskjold @@ -1252,6 +1257,7 @@ hbond hcp hdnnp HDNNP +Hearn heatconduction Hebbeker Hebenstreit @@ -1278,6 +1284,7 @@ hgrid hhmrr Hibbs Higdon +hiID Hijazi Hilger Hinestrosa @@ -1774,6 +1781,7 @@ Loewen logfile logfreq logicals +loID Lomdahl Lond lookup @@ -1809,6 +1817,7 @@ lyon Lysogorskiy Lyulin lz +lzma Maaravi MACHDYN machdyn @@ -2762,6 +2771,7 @@ REAXFF ReaxFF reaxff rebo +recurse recursing Ree refactored @@ -3076,6 +3086,7 @@ Spearot specular spellcheck Spellmeyer +Speybroeck sph SPH Spickermann @@ -3441,6 +3452,7 @@ usec uSemiParallel userguide username +usleep usr util utils @@ -3488,6 +3500,7 @@ Verlag verlet Verlet versa +Verstraelen ves vflag vhi @@ -3554,6 +3567,7 @@ vzcm vzi Waals Wadley +Waroquier wallstyle walltime Waltham diff --git a/examples/MC/README b/examples/MC-LOOP/README similarity index 100% rename from examples/MC/README rename to examples/MC-LOOP/README diff --git a/examples/MC/in.mc b/examples/MC-LOOP/in.mc similarity index 100% rename from examples/MC/in.mc rename to examples/MC-LOOP/in.mc diff --git a/examples/MC/log.13Oct16.mc.g++.1 b/examples/MC-LOOP/log.13Oct16.mc.g++.1 similarity index 100% rename from examples/MC/log.13Oct16.mc.g++.1 rename to examples/MC-LOOP/log.13Oct16.mc.g++.1 diff --git a/examples/README b/examples/README index 76ddf77498..c398579cde 100644 --- a/examples/README +++ b/examples/README @@ -75,7 +75,6 @@ eim: NaCl using the EIM potential ellipse: ellipsoidal particles in spherical solvent, 2d system flow: Couette and Poiseuille flow in a 2d channel friction: frictional contact of spherical asperities between 2d surfaces -gcmc: Grand Canonical MC with fix gcmc, Widom insertion with fix widom gjf: use of fix langevin Gronbech-Jensen/Farago option granregion: use of fix wall/region/gran as boundary on granular particles hugoniostat: Hugoniostat shock dynamics @@ -83,6 +82,7 @@ hyper: global and local hyperdynamics of diffusion on Pt surface indent: spherical indenter into a 2d solid kim: use of potentials in Knowledge Base for Interatomic Models (KIM) latte: use of LATTE density-functional tight-binding quantum code +mc: MC package models: GCMC, Widom, fix mol/swap meam: MEAM test for SiC and shear (same as shear examples) melt: rapid melt of 3d LJ system message: client/server coupling of 2 codes @@ -167,7 +167,7 @@ The KAPPA directory has example scripts for computing the thermal conductivity (kappa) of a LJ liquid using 5 different methods. See the KAPPA/README file for more info. -The MC directory has an example script for using LAMMPS as an +The MC-LOOP directory has an example script for using LAMMPS as an energy-evaluation engine in a iterative Monte Carlo energy-relaxation loop. diff --git a/examples/gcmc/CO2.txt b/examples/mc/CO2.txt similarity index 100% rename from examples/gcmc/CO2.txt rename to examples/mc/CO2.txt diff --git a/examples/gcmc/H2O.txt b/examples/mc/H2O.txt similarity index 100% rename from examples/gcmc/H2O.txt rename to examples/mc/H2O.txt diff --git a/examples/mc/data.bead b/examples/mc/data.bead new file mode 100644 index 0000000000..56b30fa3f6 --- /dev/null +++ b/examples/mc/data.bead @@ -0,0 +1,11733 @@ +LAMMPS Description + + 4000 atoms + 3900 bonds + 3800 angles + 0 dihedrals + 0 impropers + + 2 atom types + 1 bond types + 1 angle types + + -8.21157000000000 8.21157000000000 xlo xhi + -8.21157000000000 8.21157000000000 ylo yhi + -8.21157000000000 8.21157000000000 zlo zhi + +Masses + + 1 1.0 + 2 1.0 + +Bond Coeffs + + 1 30.0 1.5 1.0 1.0 + +Atoms + + 1 1 1 -2.9103 -2.6338 -5.5800 0 0 0 + 2 1 1 -3.3673 -2.5540 -6.4677 0 0 0 + 3 1 1 -3.7032 -1.7756 -6.9465 0 0 0 + 4 1 1 -3.7288 -1.6133 -5.9116 0 0 0 + 5 1 1 -3.9173 -2.4798 -5.4545 0 0 0 + 6 1 1 -4.2082 -2.9678 -4.6977 0 0 0 + 7 1 1 -5.0665 -3.3630 -4.3797 0 0 0 + 8 1 1 -5.6059 -2.8334 -3.7675 0 0 0 + 9 1 1 -4.7453 -2.5468 -3.5426 0 0 0 + 10 1 1 -3.9543 -2.2812 -3.1107 0 0 0 + 11 1 1 -3.1586 -2.0408 -3.4687 0 0 0 + 12 1 1 -2.6736 -1.3359 -3.1965 0 0 0 + 13 1 1 -2.1194 -0.7114 -2.8051 0 0 0 + 14 1 1 -2.2847 -1.1385 -1.9611 0 0 0 + 15 1 1 -1.7850 -1.5842 -1.3712 0 0 0 + 16 1 1 -1.4364 -1.6803 -0.5220 0 0 0 + 17 1 1 -1.3507 -1.5469 0.4084 0 0 0 + 18 1 1 -1.7319 -1.6032 1.3034 0 0 0 + 19 1 1 -2.4172 -1.4765 1.9525 0 0 0 + 20 1 1 -3.2394 -1.0263 1.7041 0 0 0 + 21 1 1 -3.0859 -0.2908 2.3477 0 0 0 + 22 1 1 -3.7945 -0.0892 1.7353 0 0 0 + 23 1 1 -4.2861 -0.8912 1.4840 0 0 0 + 24 1 1 -4.5074 -0.2849 0.7346 0 0 0 + 25 1 1 -5.0793 0.0734 0.0605 0 0 0 + 26 1 1 -5.6653 0.4743 -0.5270 0 0 0 + 27 1 1 -6.5731 0.3491 -0.8646 0 0 0 + 28 1 1 -7.4484 -0.0013 -0.9089 0 0 0 + 29 1 1 -7.9598 -0.1126 -0.1493 0 0 0 + 30 1 1 7.6748 0.2203 0.3118 -1 0 0 + 31 1 1 6.7844 0.6283 0.2314 -1 0 0 + 32 1 1 6.1059 1.3011 0.3738 -1 0 0 + 33 1 1 5.2569 1.4695 0.8677 -1 0 0 + 34 1 1 4.6223 0.7851 0.9307 -1 0 0 + 35 1 1 4.8526 -0.1101 0.7663 -1 0 0 + 36 1 1 4.8830 -0.7657 0.1001 -1 0 0 + 37 1 1 4.5724 -1.2504 -0.6660 -1 0 0 + 38 1 1 4.0212 -2.0601 -0.9810 -1 0 0 + 39 1 1 3.8614 -2.7681 -1.7166 -1 0 0 + 40 1 1 3.7867 -3.3077 -0.8664 -1 0 0 + 41 2 2 3.4551 -1.0865 -3.8797 0 0 0 + 42 2 2 3.4634 -0.2905 -4.4171 0 0 0 + 43 2 2 3.3450 0.3311 -5.1842 0 0 0 + 44 2 2 3.1350 0.5569 -6.1197 0 0 0 + 45 2 2 3.0083 1.0587 -7.0003 0 0 0 + 46 2 2 3.2088 0.7640 -7.9587 0 0 0 + 47 2 2 3.1971 0.6936 7.5232 0 0 -1 + 48 2 2 2.5881 0.5624 6.8757 0 0 -1 + 49 2 2 1.6330 0.5113 7.0591 0 0 -1 + 50 2 2 1.5102 -0.0762 7.7949 0 0 -1 + 51 2 2 1.1030 0.0542 -7.6565 0 0 0 + 52 2 2 0.9357 0.6439 -6.9262 0 0 0 + 53 2 2 1.4333 1.4139 -7.0550 0 0 0 + 54 2 2 2.1274 1.7216 -7.5156 0 0 0 + 55 2 2 2.6898 1.5840 8.0474 0 0 -1 + 56 2 2 2.9524 2.2160 7.3232 0 0 -1 + 57 2 2 3.4174 3.0386 7.0594 0 0 -1 + 58 2 2 3.6172 3.4920 6.2838 0 0 -1 + 59 2 2 3.4249 4.0656 5.5761 0 0 -1 + 60 2 2 3.6243 4.8742 5.0226 0 0 -1 + 61 2 2 3.2361 5.7505 5.1372 0 0 -1 + 62 2 2 3.7763 6.2672 4.5804 0 0 -1 + 63 2 2 4.6843 6.4442 4.4298 0 0 -1 + 64 2 2 5.4346 7.0470 4.5256 0 0 -1 + 65 2 2 5.8473 7.9466 4.4979 0 0 -1 + 66 2 2 5.0667 8.0371 3.9286 0 0 -1 + 67 2 2 4.4694 7.3492 3.7072 0 0 -1 + 68 2 2 3.7871 7.9939 3.8058 0 0 -1 + 69 2 2 3.2044 -8.0376 3.1640 0 1 -1 + 70 2 2 3.8676 -7.3417 3.1638 0 1 -1 + 71 2 2 3.1740 -7.0258 3.8617 0 1 -1 + 72 2 2 2.6229 -6.8235 4.5657 0 1 -1 + 73 2 2 1.8737 -6.2882 4.9562 0 1 -1 + 74 2 2 1.0941 -5.7874 5.2434 0 1 -1 + 75 2 2 0.6263 -5.6822 4.2904 0 1 -1 + 76 2 2 1.5630 -5.4597 4.1946 0 1 -1 + 77 2 2 1.7525 -4.5454 4.3691 0 1 -1 + 78 2 2 2.3296 -4.0096 3.8006 0 1 -1 + 79 2 2 2.8806 -3.3547 4.2242 0 1 -1 + 80 2 2 3.1860 -2.7136 3.5227 0 1 -1 + 81 3 1 -4.5548 5.7485 6.0216 0 0 0 + 82 3 1 -4.1555 6.5480 5.6687 0 0 0 + 83 3 1 -4.0973 6.9142 4.8681 0 0 0 + 84 3 1 -4.9105 7.0901 4.3756 0 0 0 + 85 3 1 -4.4207 6.3159 4.0682 0 0 0 + 86 3 1 -4.7397 5.4672 3.9007 0 0 0 + 87 3 1 -4.6912 4.8125 3.1822 0 0 0 + 88 3 1 -4.1776 3.9883 3.1806 0 0 0 + 89 3 1 -4.1307 4.1924 2.2221 0 0 0 + 90 3 1 -4.8933 3.6825 1.8270 0 0 0 + 91 3 1 -4.8665 2.8420 1.4647 0 0 0 + 92 3 1 -5.3054 2.5407 2.3089 0 0 0 + 93 3 1 -4.6398 1.9524 1.9588 0 0 0 + 94 3 1 -4.7860 1.9788 2.9090 0 0 0 + 95 3 1 -4.1572 1.3286 3.4270 0 0 0 + 96 3 1 -4.1322 0.5902 3.9949 0 0 0 + 97 3 1 -3.8486 0.7777 4.9030 0 0 0 + 98 3 1 -3.1679 0.6448 5.6278 0 0 0 + 99 3 1 -3.7431 1.4402 5.6819 0 0 0 + 100 3 1 -3.9513 1.7463 6.5838 0 0 0 + 101 3 1 -4.4751 2.4318 6.9534 0 0 0 + 102 3 1 -4.7871 1.5760 7.4224 0 0 0 + 103 3 1 -5.0796 0.8459 7.9811 0 0 0 + 104 3 1 -4.7904 0.5863 -7.6006 0 0 1 + 105 3 1 -4.5790 -0.1461 -7.0952 0 0 1 + 106 3 1 -4.8318 -1.0000 -7.4320 0 0 1 + 107 3 1 -5.2877 -1.7175 -7.9583 0 0 1 + 108 3 1 -5.1173 -1.8660 7.5130 0 0 0 + 109 3 1 -4.7000 -1.3583 6.7775 0 0 0 + 110 3 1 -5.5551 -0.9660 6.6824 0 0 0 + 111 3 1 -6.3552 -0.4859 6.4167 0 0 0 + 112 3 1 -7.2893 -0.2325 6.3530 0 0 0 + 113 3 1 -8.1166 -0.0576 6.7017 0 0 0 + 114 3 1 7.9537 -0.8068 7.1081 -1 0 0 + 115 3 1 7.8094 -1.4160 7.7817 -1 0 0 + 116 3 1 7.6663 -1.3428 -7.6974 -1 0 1 + 117 3 1 -8.0615 -1.0159 -7.1172 0 0 1 + 118 3 1 -8.0340 -0.0766 -7.0752 0 0 1 + 119 3 1 -7.7311 0.5241 -7.7389 0 0 1 + 120 3 1 -6.9535 -0.0280 -7.5954 0 0 1 + 121 4 2 -2.5059 -5.6993 -1.2716 0 0 0 + 122 4 2 -2.3664 -6.0973 -0.4090 0 0 0 + 123 4 2 -1.4970 -6.5861 -0.2642 0 0 0 + 124 4 2 -0.7174 -6.9509 0.1025 0 0 0 + 125 4 2 0.0817 -7.5289 0.0050 0 0 0 + 126 4 2 0.2275 -6.6250 0.4168 0 0 0 + 127 4 2 0.3005 -5.7404 0.8929 0 0 0 + 128 4 2 -0.1107 -6.3155 1.6182 0 0 0 + 129 4 2 -0.8772 -6.4103 1.1087 0 0 0 + 130 4 2 -0.7684 -5.4467 1.0151 0 0 0 + 131 4 2 -0.4349 -4.5241 0.9512 0 0 0 + 132 4 2 -0.1952 -4.0553 0.1461 0 0 0 + 133 4 2 -0.4295 -3.9024 -0.7809 0 0 0 + 134 4 2 -1.1228 -4.4615 -0.3919 0 0 0 + 135 4 2 -1.0690 -5.3817 -0.8239 0 0 0 + 136 4 2 -1.5786 -5.9305 -1.4779 0 0 0 + 137 4 2 -0.9972 -6.6286 -1.8603 0 0 0 + 138 4 2 -0.9811 -6.3735 -2.7604 0 0 0 + 139 4 2 -1.7257 -5.9456 -3.2078 0 0 0 + 140 4 2 -2.5744 -5.4172 -3.2036 0 0 0 + 141 4 2 -3.2106 -4.8160 -2.8782 0 0 0 + 142 4 2 -3.9261 -4.7724 -3.4799 0 0 0 + 143 4 2 -3.9331 -5.6655 -3.1279 0 0 0 + 144 4 2 -3.6121 -6.5065 -3.5012 0 0 0 + 145 4 2 -3.5359 -7.4241 -3.3480 0 0 0 + 146 4 2 -4.4247 -7.8027 -3.5339 0 0 0 + 147 4 2 -4.3956 -8.1393 -4.4395 0 0 0 + 148 4 2 -4.5835 -7.7408 -5.2598 0 0 0 + 149 4 2 -3.6430 -8.0019 -5.3640 0 0 0 + 150 4 2 -3.1537 -7.8070 -4.5653 0 0 0 + 151 4 2 -2.5874 -7.4266 -3.8996 0 0 0 + 152 4 2 -2.1033 -6.5176 -4.0259 0 0 0 + 153 4 2 -2.2477 -5.6546 -4.1995 0 0 0 + 154 4 2 -2.0494 -4.6562 -4.0474 0 0 0 + 155 4 2 -1.5988 -4.1080 -4.6447 0 0 0 + 156 4 2 -1.4496 -3.3936 -5.1841 0 0 0 + 157 4 2 -1.2606 -2.4357 -5.3465 0 0 0 + 158 4 2 -0.9591 -1.9438 -4.5710 0 0 0 + 159 4 2 -0.4858 -1.2616 -4.1253 0 0 0 + 160 4 2 0.4164 -1.0237 -4.1183 0 0 0 + 161 5 1 -0.1440 7.2364 -5.7227 0 0 0 + 162 5 1 0.6558 6.9783 -6.1262 0 0 0 + 163 5 1 1.1111 6.1343 -5.9811 0 0 0 + 164 5 1 1.0226 5.7997 -5.1022 0 0 0 + 165 5 1 0.3941 6.3700 -4.6712 0 0 0 + 166 5 1 1.1217 6.9317 -4.9989 0 0 0 + 167 5 1 0.7755 7.7592 -5.3428 0 0 0 + 168 5 1 0.6448 -7.7669 -5.7142 0 1 0 + 169 5 1 0.1854 -7.1895 -6.2835 0 1 0 + 170 5 1 -0.5676 -7.4706 -6.8027 0 1 0 + 171 5 1 -1.1520 -7.8542 -7.5021 0 1 0 + 172 5 1 -1.9454 -7.4317 -7.4158 0 1 0 + 173 5 1 -2.8468 -7.2151 -7.2658 0 1 0 + 174 5 1 -3.5842 -6.8908 -7.8260 0 1 0 + 175 5 1 -3.5508 -7.0063 7.6241 0 1 -1 + 176 5 1 -2.9756 -7.7201 7.8585 0 1 -1 + 177 5 1 -2.0394 -7.8230 8.1039 0 1 -1 + 178 5 1 -1.3274 -7.1897 8.1174 0 1 -1 + 179 5 1 -0.9807 -6.6449 -7.5431 0 1 0 + 180 5 1 -0.9238 -5.6903 -7.3638 0 1 0 + 181 5 1 -0.8741 -4.9265 -6.6813 0 1 0 + 182 5 1 -0.0949 -5.5199 -6.3670 0 1 0 + 183 5 1 -0.2778 -4.8656 -5.7369 0 1 0 + 184 5 1 -0.6919 -4.5164 -5.0108 0 1 0 + 185 5 1 -0.4891 -3.6504 -4.7370 0 1 0 + 186 5 1 0.3406 -3.7766 -5.2321 0 1 0 + 187 5 1 -0.3353 -3.7202 -5.9210 0 1 0 + 188 5 1 0.2085 -3.0043 -6.3445 0 1 0 + 189 5 1 0.5040 -3.2604 -7.2279 0 1 0 + 190 5 1 1.2968 -2.8872 -6.9492 0 1 0 + 191 5 1 2.1808 -2.5142 -6.8257 0 1 0 + 192 5 1 1.9266 -1.6274 -7.1142 0 1 0 + 193 5 1 2.7913 -1.2579 -6.6547 0 1 0 + 194 5 1 3.3329 -0.8061 -6.0178 0 1 0 + 195 5 1 4.0946 -0.2082 -5.7371 0 1 0 + 196 5 1 4.8297 -0.5360 -6.2362 0 1 0 + 197 5 1 5.4864 -0.1385 -6.8564 0 1 0 + 198 5 1 5.5430 -0.1071 -7.8622 0 1 0 + 199 5 1 4.7464 0.3372 -7.5507 0 1 0 + 200 5 1 4.0768 0.4963 -6.8595 0 1 0 + 201 6 2 -7.5650 1.5000 1.2413 0 0 0 + 202 6 2 -8.0473 0.8479 0.7081 0 0 0 + 203 6 2 -7.9777 0.9662 -0.2078 0 0 0 + 204 6 2 8.0672 0.6049 -1.0508 -1 0 0 + 205 6 2 7.3706 0.0109 -0.7142 -1 0 0 + 206 6 2 6.5245 0.4155 -0.8480 -1 0 0 + 207 6 2 6.3281 1.3903 -0.7213 -1 0 0 + 208 6 2 7.2457 1.3462 -0.7141 -1 0 0 + 209 6 2 8.0101 1.8416 -0.6149 -1 0 0 + 210 6 2 8.0231 2.8577 -0.6369 -1 0 0 + 211 6 2 7.4977 2.7380 0.1246 -1 0 0 + 212 6 2 6.6911 2.2612 -0.1411 -1 0 0 + 213 6 2 5.7458 2.2789 0.0148 -1 0 0 + 214 6 2 5.2222 2.6041 0.7804 -1 0 0 + 215 6 2 4.3216 2.8995 0.5944 -1 0 0 + 216 6 2 4.2944 3.6961 1.0411 -1 0 0 + 217 6 2 4.5201 3.1454 1.7328 -1 0 0 + 218 6 2 4.6989 2.8044 2.6264 -1 0 0 + 219 6 2 5.3639 2.6169 3.2121 -1 0 0 + 220 6 2 5.4309 2.2501 4.1225 -1 0 0 + 221 6 2 5.4368 2.0364 5.0152 -1 0 0 + 222 6 2 6.1506 2.3692 5.6603 -1 0 0 + 223 6 2 6.1296 1.7133 6.3910 -1 0 0 + 224 6 2 6.9172 1.1740 6.2003 -1 0 0 + 225 6 2 7.0855 1.9468 5.6814 -1 0 0 + 226 6 2 7.1305 2.6951 4.9985 -1 0 0 + 227 6 2 6.4025 3.1032 4.5315 -1 0 0 + 228 6 2 5.4882 3.3255 4.2646 -1 0 0 + 229 6 2 4.5483 3.2340 4.2192 -1 0 0 + 230 6 2 4.1767 2.3631 4.1633 -1 0 0 + 231 6 2 4.4256 2.2482 5.0824 -1 0 0 + 232 6 2 5.0453 2.8611 5.4213 -1 0 0 + 233 6 2 4.4123 2.8712 6.0804 -1 0 0 + 234 6 2 4.5083 2.6907 7.0185 -1 0 0 + 235 6 2 4.1319 2.0459 7.6273 -1 0 0 + 236 6 2 4.5832 1.2833 7.3126 -1 0 0 + 237 6 2 5.0233 0.4519 7.3297 -1 0 0 + 238 6 2 4.9562 -0.3351 7.7829 -1 0 0 + 239 6 2 4.7810 -0.8429 6.9451 -1 0 0 + 240 6 2 5.3913 -1.4885 6.4549 -1 0 0 + 241 7 1 6.9722 -5.8488 -6.6715 0 0 0 + 242 7 1 7.8812 -6.1989 -6.5964 0 0 0 + 243 7 1 -7.9971 -6.9093 -6.9504 1 0 0 + 244 7 1 -7.5043 -6.9853 -7.7710 1 0 0 + 245 7 1 -7.3887 -7.1313 7.6754 1 0 -1 + 246 7 1 -7.0229 -7.9617 7.5892 1 0 -1 + 247 7 1 -7.8696 -8.0413 8.0866 1 0 -1 + 248 7 1 8.0445 7.6146 -8.1240 0 -1 0 + 249 7 1 7.0492 7.5183 8.0777 0 -1 -1 + 250 7 1 6.4798 7.0077 7.5573 0 -1 -1 + 251 7 1 6.1121 6.2934 7.0757 0 -1 -1 + 252 7 1 6.9712 6.2966 6.5677 0 -1 -1 + 253 7 1 6.9671 6.8706 5.7955 0 -1 -1 + 254 7 1 6.2166 7.1106 5.2161 0 -1 -1 + 255 7 1 5.3877 7.3516 5.6560 0 -1 -1 + 256 7 1 4.4705 7.0498 5.7885 0 -1 -1 + 257 7 1 3.6793 6.4541 5.8203 0 -1 -1 + 258 7 1 2.9979 6.7208 6.3953 0 -1 -1 + 259 7 1 2.4461 7.2693 6.9529 0 -1 -1 + 260 7 1 1.6527 7.0183 7.4950 0 -1 -1 + 261 7 1 2.4785 6.7848 7.9499 0 -1 -1 + 262 7 1 2.5174 7.7035 7.7858 0 -1 -1 + 263 7 1 1.8603 -7.9891 7.6609 0 0 -1 + 264 7 1 1.3688 7.8734 7.0278 0 -1 -1 + 265 7 1 1.4531 7.0626 6.4638 0 -1 -1 + 266 7 1 1.8344 6.6254 5.7071 0 -1 -1 + 267 7 1 2.7215 6.8419 5.3543 0 -1 -1 + 268 7 1 2.4085 7.3839 4.6329 0 -1 -1 + 269 7 1 1.5024 7.5277 4.3413 0 -1 -1 + 270 7 1 0.7070 6.9936 4.5543 0 -1 -1 + 271 7 1 0.3946 7.8772 4.7528 0 -1 -1 + 272 7 1 -0.3419 -8.1238 5.2184 0 0 -1 + 273 7 1 -0.2883 7.3723 5.4801 0 -1 -1 + 274 7 1 -0.3893 6.4642 5.1932 0 -1 -1 + 275 7 1 -1.3141 6.4405 5.2721 0 -1 -1 + 276 7 1 -1.1979 6.7879 6.2024 0 -1 -1 + 277 7 1 -1.2658 7.0109 7.1159 0 -1 -1 + 278 7 1 -1.9462 6.8161 7.8205 0 -1 -1 + 279 7 1 -2.8224 6.4567 7.8971 0 -1 -1 + 280 7 1 -3.2919 7.0336 -7.9544 0 -1 0 + 281 8 2 5.2796 -6.5812 -5.4085 0 0 0 + 282 8 2 4.7163 -6.7833 -4.5681 0 0 0 + 283 8 2 4.4060 -5.9174 -4.2984 0 0 0 + 284 8 2 3.5099 -5.7204 -4.4373 0 0 0 + 285 8 2 2.9851 -6.1663 -5.1381 0 0 0 + 286 8 2 3.1889 -7.0146 -4.7250 0 0 0 + 287 8 2 3.8547 -7.1451 -5.3837 0 0 0 + 288 8 2 4.5242 -7.1185 -6.0551 0 0 0 + 289 8 2 5.1681 -6.6532 -6.5325 0 0 0 + 290 8 2 5.9050 -7.1959 -6.3571 0 0 0 + 291 8 2 6.3040 -7.0069 -5.5110 0 0 0 + 292 8 2 6.8515 -6.9124 -4.7697 0 0 0 + 293 8 2 7.3534 -7.7221 -4.8654 0 0 0 + 294 8 2 8.2082 -8.0084 -4.4692 0 0 0 + 295 8 2 -7.5403 -7.8024 -3.8292 1 0 0 + 296 8 2 -7.4014 -7.7313 -2.9290 1 0 0 + 297 8 2 -7.6476 7.7892 -2.8196 1 -1 0 + 298 8 2 8.0534 7.9926 -3.3742 0 -1 0 + 299 8 2 7.2509 -8.1619 -3.8214 0 0 0 + 300 8 2 6.4546 -8.1818 -4.4556 0 0 0 + 301 8 2 5.5531 -8.0801 -4.1505 0 0 0 + 302 8 2 5.2333 -7.2360 -3.8559 0 0 0 + 303 8 2 5.1755 -7.1027 -2.9131 0 0 0 + 304 8 2 4.3003 -6.7047 -2.8807 0 0 0 + 305 8 2 3.9516 -5.8846 -2.3769 0 0 0 + 306 8 2 3.9923 -5.3884 -1.6100 0 0 0 + 307 8 2 3.2342 -4.8484 -1.4445 0 0 0 + 308 8 2 4.0318 -4.2970 -1.3989 0 0 0 + 309 8 2 4.9095 -4.6881 -1.2571 0 0 0 + 310 8 2 5.5017 -5.4254 -1.2630 0 0 0 + 311 8 2 4.7428 -5.5289 -0.6837 0 0 0 + 312 8 2 3.8827 -5.1141 -0.6030 0 0 0 + 313 8 2 3.1842 -5.6936 -1.0026 0 0 0 + 314 8 2 3.9261 -6.3038 -0.7947 0 0 0 + 315 8 2 4.1325 -6.5477 0.1181 0 0 0 + 316 8 2 4.2381 -5.6449 0.2877 0 0 0 + 317 8 2 5.0593 -6.1096 0.2201 0 0 0 + 318 8 2 5.6677 -6.6746 0.6816 0 0 0 + 319 8 2 4.9862 -6.5959 1.3351 0 0 0 + 320 8 2 4.9665 -5.7010 1.4799 0 0 0 + 321 9 1 -0.0477 -5.0097 -0.6713 0 0 0 + 322 9 1 -0.4859 -5.4641 0.0181 0 0 0 + 323 9 1 -1.4214 -5.4887 0.2290 0 0 0 + 324 9 1 -2.2031 -5.9645 0.5101 0 0 0 + 325 9 1 -1.6950 -6.7547 0.7017 0 0 0 + 326 9 1 -1.5128 -7.7264 0.6779 0 0 0 + 327 9 1 -2.2943 8.1128 0.6711 0 -1 0 + 328 9 1 -2.1247 7.2537 0.9948 0 -1 0 + 329 9 1 -2.0090 7.1285 1.9188 0 -1 0 + 330 9 1 -2.7040 6.4552 2.2441 0 -1 0 + 331 9 1 -3.3591 5.8222 2.0699 0 -1 0 + 332 9 1 -4.2589 5.6786 1.8880 0 -1 0 + 333 9 1 -4.9586 5.0590 2.2008 0 -1 0 + 334 9 1 -5.7800 4.7283 2.5296 0 -1 0 + 335 9 1 -6.5251 4.3990 2.9885 0 -1 0 + 336 9 1 -6.7508 5.1313 2.3841 0 -1 0 + 337 9 1 -7.2547 5.2164 1.5653 0 -1 0 + 338 9 1 -6.6673 4.9299 0.8489 0 -1 0 + 339 9 1 -6.1782 4.5312 0.0976 0 -1 0 + 340 9 1 -6.4905 3.8038 0.5989 0 -1 0 + 341 9 1 -6.9662 3.0683 0.9096 0 -1 0 + 342 9 1 -7.8375 3.4309 0.8570 0 -1 0 + 343 9 1 8.1320 2.6404 1.1856 -1 -1 0 + 344 9 1 7.4973 3.3543 1.0767 -1 -1 0 + 345 9 1 6.7109 3.6993 0.7816 -1 -1 0 + 346 9 1 5.8361 4.0432 0.6811 -1 -1 0 + 347 9 1 5.0958 3.6472 0.2477 -1 -1 0 + 348 9 1 5.1428 3.1030 -0.6290 -1 -1 0 + 349 9 1 5.2138 3.8702 -1.1747 -1 -1 0 + 350 9 1 5.2915 4.7014 -1.5387 -1 -1 0 + 351 9 1 4.8757 5.6615 -1.4683 -1 -1 0 + 352 9 1 5.2443 5.4902 -0.5578 -1 -1 0 + 353 9 1 5.0383 5.8271 0.2975 -1 -1 0 + 354 9 1 4.5934 6.2090 1.0805 -1 -1 0 + 355 9 1 3.6988 6.0628 0.7137 -1 -1 0 + 356 9 1 3.6193 6.1897 1.6088 -1 -1 0 + 357 9 1 3.4358 6.3119 2.5794 -1 -1 0 + 358 9 1 2.6134 5.8276 2.4014 -1 -1 0 + 359 9 1 2.4782 4.8298 2.2485 -1 -1 0 + 360 9 1 1.8223 4.5893 1.5448 -1 -1 0 + 361 10 2 5.7461 -7.3903 -7.3881 0 0 0 + 362 10 2 5.7162 -6.7772 -8.0634 0 0 0 + 363 10 2 5.5090 -5.8469 7.9991 0 0 -1 + 364 10 2 4.9486 -5.6862 7.2370 0 0 -1 + 365 10 2 4.6357 -5.1502 6.5498 0 0 -1 + 366 10 2 4.4760 -4.1344 6.4437 0 0 -1 + 367 10 2 4.3972 -4.6535 5.5958 0 0 -1 + 368 10 2 4.9731 -4.9407 4.8989 0 0 -1 + 369 10 2 4.4981 -5.6377 4.4320 0 0 -1 + 370 10 2 4.1161 -6.3673 3.9374 0 0 -1 + 371 10 2 4.0949 -7.3325 4.1672 0 0 -1 + 372 10 2 3.6259 -6.9234 4.9133 0 0 -1 + 373 10 2 4.5214 -6.6310 5.0224 0 0 -1 + 374 10 2 5.2391 -6.5934 4.2920 0 0 -1 + 375 10 2 5.2455 -7.4252 3.9171 0 0 -1 + 376 10 2 5.8529 -7.9758 3.4127 0 0 -1 + 377 10 2 6.6095 7.8674 3.4886 0 -1 -1 + 378 10 2 7.0572 -7.8980 4.2005 0 0 -1 + 379 10 2 7.6610 -7.7794 3.4514 0 0 -1 + 380 10 2 -7.9207 8.1954 3.1231 1 -1 -1 + 381 10 2 -7.6302 -7.8899 2.2614 1 0 -1 + 382 10 2 -6.9896 -7.3037 1.8109 1 0 -1 + 383 10 2 -7.6860 -6.7972 2.2555 1 0 -1 + 384 10 2 -7.8960 -7.0864 3.1097 1 0 -1 + 385 10 2 -7.7775 -6.3129 3.7419 1 0 -1 + 386 10 2 -7.1576 -5.6685 4.1818 1 0 -1 + 387 10 2 -6.7994 -4.8602 4.4295 1 0 -1 + 388 10 2 -6.0057 -4.5435 4.7475 1 0 -1 + 389 10 2 -5.2609 -4.5769 4.1675 1 0 -1 + 390 10 2 -5.0571 -5.0645 3.3283 1 0 -1 + 391 10 2 -5.4671 -5.9421 3.3306 1 0 -1 + 392 10 2 -5.2633 -6.7774 2.8865 1 0 -1 + 393 10 2 -5.0660 -7.2960 2.0849 1 0 -1 + 394 10 2 -4.9879 8.1988 2.3095 1 -1 -1 + 395 10 2 -4.9648 7.2637 2.0874 1 -1 -1 + 396 10 2 -5.0343 6.3443 1.9623 1 -1 -1 + 397 10 2 -5.6366 6.7240 1.2974 1 -1 -1 + 398 10 2 -5.5589 6.7686 0.3687 1 -1 -1 + 399 10 2 -4.7381 6.2525 0.4268 1 -1 -1 + 400 10 2 -3.8238 6.2399 0.8094 1 -1 -1 + 401 11 1 4.8337 -6.9620 6.0701 0 0 0 + 402 11 1 4.9682 -7.8687 5.8710 0 0 0 + 403 11 1 5.1201 7.9035 6.5376 0 -1 0 + 404 11 1 5.8985 7.3266 6.7467 0 -1 0 + 405 11 1 6.4363 8.0277 7.1194 0 -1 0 + 406 11 1 7.1418 7.5188 6.6213 0 -1 0 + 407 11 1 6.6665 7.8088 5.8309 0 -1 0 + 408 11 1 6.3115 -7.9020 5.3080 0 0 0 + 409 11 1 5.6408 -7.2855 4.9299 0 0 0 + 410 11 1 4.8457 -7.8486 4.8295 0 0 0 + 411 11 1 4.4990 7.6371 4.6862 0 -1 0 + 412 11 1 3.6175 7.4169 4.8332 0 -1 0 + 413 11 1 3.7506 7.9127 5.6417 0 -1 0 + 414 11 1 3.7883 7.4426 6.5018 0 -1 0 + 415 11 1 4.1095 -8.1215 6.5892 0 0 0 + 416 11 1 3.8558 -7.4196 5.9769 0 0 0 + 417 11 1 3.1326 -7.2501 6.5570 0 0 0 + 418 11 1 2.8995 -8.1320 6.2067 0 0 0 + 419 11 1 2.3160 7.5976 5.8834 0 -1 0 + 420 11 1 1.4822 7.7037 5.3906 0 -1 0 + 421 11 1 0.6840 7.1953 5.6118 0 -1 0 + 422 11 1 0.5910 8.0868 5.9678 0 -1 0 + 423 11 1 -0.0709 -7.7813 6.3154 0 0 0 + 424 11 1 -0.5510 -7.4558 7.1140 0 0 0 + 425 11 1 -1.2303 -8.0777 7.4053 0 0 0 + 426 11 1 -2.0710 8.0375 7.2003 0 -1 0 + 427 11 1 -2.7494 7.4079 7.4776 0 -1 0 + 428 11 1 -3.5682 7.8395 7.6497 0 -1 0 + 429 11 1 -4.1296 -7.7807 7.7261 0 0 0 + 430 11 1 -3.7905 -7.8746 6.8338 0 0 0 + 431 11 1 -3.2207 7.8096 6.6330 0 -1 0 + 432 11 1 -3.3161 6.8891 6.2763 0 -1 0 + 433 11 1 -3.8344 6.1397 6.6664 0 -1 0 + 434 11 1 -3.4342 5.5022 6.0708 0 -1 0 + 435 11 1 -3.7669 4.8398 6.6222 0 -1 0 + 436 11 1 -4.2915 4.6582 5.9002 0 -1 0 + 437 11 1 -5.0737 4.9969 5.4288 0 -1 0 + 438 11 1 -5.5673 5.0779 4.6087 0 -1 0 + 439 11 1 -5.1845 5.9038 4.8997 0 -1 0 + 440 11 1 -4.2460 5.7952 4.9872 0 -1 0 + 441 12 2 -5.8484 6.5244 3.9637 0 0 0 + 442 12 2 -5.8487 5.5949 3.5625 0 0 0 + 443 12 2 -6.4822 4.8961 3.9423 0 0 0 + 444 12 2 -5.6401 4.5007 3.6756 0 0 0 + 445 12 2 -5.2342 3.9247 3.0098 0 0 0 + 446 12 2 -5.3675 3.4942 3.8258 0 0 0 + 447 12 2 -5.6043 3.0865 4.6483 0 0 0 + 448 12 2 -6.1308 2.3274 4.6564 0 0 0 + 449 12 2 -6.8222 2.2662 4.0488 0 0 0 + 450 12 2 -7.4447 2.0088 3.3879 0 0 0 + 451 12 2 -8.0726 1.8201 4.0400 0 0 0 + 452 12 2 7.4996 1.4924 3.7553 -1 0 0 + 453 12 2 6.9905 0.8666 3.3206 -1 0 0 + 454 12 2 6.7091 -0.0328 3.0518 -1 0 0 + 455 12 2 7.3154 -0.8154 2.8325 -1 0 0 + 456 12 2 7.5483 -0.0009 2.3035 -1 0 0 + 457 12 2 7.9145 0.8716 2.3943 -1 0 0 + 458 12 2 -7.7586 0.5406 1.8865 0 0 0 + 459 12 2 -7.0387 0.0467 2.3366 0 0 0 + 460 12 2 -6.3499 0.7028 2.6841 0 0 0 + 461 12 2 -5.7714 1.4854 2.6503 0 0 0 + 462 12 2 -6.5295 1.5130 3.2747 0 0 0 + 463 12 2 -7.1685 1.1460 3.7989 0 0 0 + 464 12 2 -7.8567 0.6498 4.2531 0 0 0 + 465 12 2 -7.9221 1.2778 4.9560 0 0 0 + 466 12 2 7.6912 1.7098 4.8771 -1 0 0 + 467 12 2 6.9543 1.1102 5.0877 -1 0 0 + 468 12 2 5.9849 1.2570 5.2015 -1 0 0 + 469 12 2 5.6691 1.0844 4.3112 -1 0 0 + 470 12 2 5.4974 0.2660 3.7942 -1 0 0 + 471 12 2 5.1024 0.1347 4.7027 -1 0 0 + 472 12 2 5.7992 0.0595 5.4303 -1 0 0 + 473 12 2 6.5115 0.0897 6.0602 -1 0 0 + 474 12 2 7.4204 0.3003 6.0354 -1 0 0 + 475 12 2 7.9608 1.1020 5.9662 -1 0 0 + 476 12 2 -8.1652 2.0120 5.7790 0 0 0 + 477 12 2 -8.0498 2.4218 6.6768 0 0 0 + 478 12 2 -7.8681 2.4292 7.6013 0 0 0 + 479 12 2 7.6795 2.1065 7.6815 -1 0 0 + 480 12 2 7.2229 1.9105 -7.8671 -1 0 1 + 481 13 1 1.0973 2.9125 6.1625 0 0 0 + 482 13 1 0.3697 3.4964 5.9423 0 0 0 + 483 13 1 -0.1709 3.1267 6.6195 0 0 0 + 484 13 1 -0.3678 2.6757 7.3771 0 0 0 + 485 13 1 -0.5737 3.2283 8.1647 0 0 0 + 486 13 1 -1.1554 3.4641 -7.5638 0 0 1 + 487 13 1 -1.3187 3.4857 -6.6652 0 0 1 + 488 13 1 -1.1266 4.4785 -6.6960 0 0 1 + 489 13 1 -0.3638 5.1346 -6.6223 0 0 1 + 490 13 1 -0.1713 6.1254 -6.7920 0 0 1 + 491 13 1 -0.8710 6.5105 -6.3009 0 0 1 + 492 13 1 -1.1518 5.5650 -6.2760 0 0 1 + 493 13 1 -1.7167 4.8934 -5.7901 0 0 1 + 494 13 1 -1.4351 4.0059 -5.7680 0 0 1 + 495 13 1 -0.7079 4.5983 -5.5108 0 0 1 + 496 13 1 -0.3839 4.2817 -4.6177 0 0 1 + 497 13 1 0.4411 4.4517 -5.0176 0 0 1 + 498 13 1 1.3933 4.1570 -5.1987 0 0 1 + 499 13 1 2.1204 3.5739 -4.8923 0 0 1 + 500 13 1 1.3976 3.1355 -4.4244 0 0 1 + 501 13 1 1.3007 3.0131 -3.4836 0 0 1 + 502 13 1 1.1550 3.6151 -2.7742 0 0 1 + 503 13 1 0.5820 4.3044 -2.4456 0 0 1 + 504 13 1 0.1725 3.5112 -2.6491 0 0 1 + 505 13 1 0.0990 3.2731 -1.7118 0 0 1 + 506 13 1 -0.4402 3.3384 -0.8844 0 0 1 + 507 13 1 -0.6404 2.7813 -0.0600 0 0 1 + 508 13 1 -1.2569 2.0987 0.1336 0 0 1 + 509 13 1 -1.7181 1.9476 1.0005 0 0 1 + 510 13 1 -1.6776 1.5301 1.9021 0 0 1 + 511 13 1 -1.4481 1.2372 2.7652 0 0 1 + 512 13 1 -2.3702 1.3284 2.6504 0 0 1 + 513 13 1 -2.1835 0.4671 2.8992 0 0 1 + 514 13 1 -2.7565 0.0045 3.4115 0 0 1 + 515 13 1 -3.0749 0.8943 3.7357 0 0 1 + 516 13 1 -2.7849 1.1853 4.6243 0 0 1 + 517 13 1 -2.7370 1.9636 4.0718 0 0 1 + 518 13 1 -3.5769 2.4239 3.9072 0 0 1 + 519 13 1 -3.3747 2.0748 3.0087 0 0 1 + 520 13 1 -3.5213 1.6890 2.1158 0 0 1 + 521 14 2 7.6114 5.8083 5.8449 0 0 0 + 522 14 2 7.8523 6.5659 5.3424 0 0 0 + 523 14 2 8.0432 7.2417 4.5713 0 0 0 + 524 14 2 8.1189 8.1157 4.4329 0 0 0 + 525 14 2 -8.1729 -7.3163 4.3630 1 1 0 + 526 14 2 7.6838 -6.5122 4.1384 0 1 0 + 527 14 2 6.8835 -5.9709 4.4301 0 1 0 + 528 14 2 7.6173 -5.3672 4.3733 0 1 0 + 529 14 2 7.7332 -4.4758 4.7062 0 1 0 + 530 14 2 7.1326 -4.4350 5.4597 0 1 0 + 531 14 2 7.6310 -4.1626 6.2104 0 1 0 + 532 14 2 7.5251 -3.3406 6.7675 0 1 0 + 533 14 2 8.1044 -3.9014 7.2624 0 1 0 + 534 14 2 -7.6445 -4.3274 6.8077 1 1 0 + 535 14 2 -7.0496 -3.9161 6.1748 1 1 0 + 536 14 2 -6.7171 -3.0766 5.8328 1 1 0 + 537 14 2 -6.2443 -2.8292 5.0518 1 1 0 + 538 14 2 -6.7010 -3.6472 4.9121 1 1 0 + 539 14 2 -7.6019 -4.0978 5.1610 1 1 0 + 540 14 2 -8.1943 -3.6980 4.4486 1 1 0 + 541 14 2 7.5932 -3.7149 3.7656 0 1 0 + 542 14 2 8.1715 -3.9696 3.0770 0 1 0 + 543 14 2 7.8639 -4.6792 2.4992 0 1 0 + 544 14 2 7.6522 -5.4994 2.0510 0 1 0 + 545 14 2 6.7114 -5.4918 1.8854 0 1 0 + 546 14 2 6.3951 -6.1809 2.5320 0 1 0 + 547 14 2 6.7093 -7.0452 2.6000 0 1 0 + 548 14 2 7.0458 -6.4701 3.2679 0 1 0 + 549 14 2 7.7904 -5.8879 3.2194 0 1 0 + 550 14 2 -7.8574 -5.4241 2.8625 1 1 0 + 551 14 2 -7.4268 -5.4038 2.0228 1 1 0 + 552 14 2 -8.0600 -4.8823 1.4668 1 1 0 + 553 14 2 8.1552 -4.3100 0.6879 0 1 0 + 554 14 2 -7.5782 -4.4439 0.0462 1 1 0 + 555 14 2 -6.8662 -4.0630 -0.5520 1 1 0 + 556 14 2 -5.9019 -4.1648 -0.7090 1 1 0 + 557 14 2 -5.0850 -4.5447 -0.4591 1 1 0 + 558 14 2 -4.7646 -4.1471 0.3220 1 1 0 + 559 14 2 -4.4375 -3.8642 1.1705 1 1 0 + 560 14 2 -4.3949 -3.0706 0.6091 1 1 0 + 561 15 1 7.5417 6.4700 -5.1128 0 0 0 + 562 15 1 7.1276 5.7514 -5.6548 0 0 0 + 563 15 1 6.6466 5.7916 -6.4477 0 0 0 + 564 15 1 6.8481 5.8052 -7.3350 0 0 0 + 565 15 1 7.6306 5.9654 -6.8514 0 0 0 + 566 15 1 7.7546 5.0419 -6.4904 0 0 0 + 567 15 1 6.9470 4.5876 -6.3646 0 0 0 + 568 15 1 7.0514 3.7873 -5.8493 0 0 0 + 569 15 1 7.6999 4.3822 -5.4678 0 0 0 + 570 15 1 7.0618 4.9397 -4.9774 0 0 0 + 571 15 1 6.1505 5.2596 -4.8627 0 0 0 + 572 15 1 6.1776 5.1439 -3.9339 0 0 0 + 573 15 1 6.1759 5.9589 -3.4691 0 0 0 + 574 15 1 5.3047 6.2266 -3.2354 0 0 0 + 575 15 1 5.1197 5.4670 -3.7374 0 0 0 + 576 15 1 4.3628 4.9571 -3.3748 0 0 0 + 577 15 1 3.7180 4.8390 -2.6665 0 0 0 + 578 15 1 3.9548 5.2224 -1.8277 0 0 0 + 579 15 1 3.1376 4.8378 -1.4028 0 0 0 + 580 15 1 3.6086 4.3042 -0.7538 0 0 0 + 581 15 1 4.5145 4.2571 -0.4370 0 0 0 + 582 15 1 5.4024 4.5369 -0.2958 0 0 0 + 583 15 1 6.3151 4.8302 -0.4557 0 0 0 + 584 15 1 6.3252 5.7055 -0.6053 0 0 0 + 585 15 1 6.4573 6.1456 -1.4466 0 0 0 + 586 15 1 6.7317 6.0993 -2.3577 0 0 0 + 587 15 1 7.0679 6.4129 -3.2264 0 0 0 + 588 15 1 7.8341 5.9446 -3.4828 0 0 0 + 589 15 1 -7.9263 6.2702 -4.1106 1 0 0 + 590 15 1 -7.7240 7.1816 -4.1457 1 0 0 + 591 15 1 -6.9079 7.6316 -3.7762 1 0 0 + 592 15 1 -6.6294 7.7307 -2.9007 1 0 0 + 593 15 1 -5.9367 7.6002 -2.2858 1 0 0 + 594 15 1 -6.2793 8.1412 -1.5785 1 0 0 + 595 15 1 -6.1123 8.0650 -0.6229 1 0 0 + 596 15 1 -5.5313 -7.9232 0.0863 1 1 0 + 597 15 1 -4.5991 -7.7417 0.0074 1 1 0 + 598 15 1 -3.8650 -7.0503 -0.0813 1 1 0 + 599 15 1 -3.4373 -7.4322 -0.8852 1 1 0 + 600 15 1 -3.4795 -6.5249 -1.1762 1 1 0 + 601 16 2 3.7736 6.8386 -2.3973 0 0 0 + 602 16 2 4.3819 7.2537 -3.0665 0 0 0 + 603 16 2 4.8131 7.0930 -3.9155 0 0 0 + 604 16 2 4.4876 7.9496 -3.9603 0 0 0 + 605 16 2 4.9795 -8.1730 -3.1972 0 1 0 + 606 16 2 5.6131 -8.0168 -2.4310 0 1 0 + 607 16 2 6.0848 -7.3507 -1.9840 0 1 0 + 608 16 2 6.3572 -6.4999 -1.6689 0 1 0 + 609 16 2 6.5143 -5.8001 -1.0237 0 1 0 + 610 16 2 6.9149 -5.1283 -0.5202 0 1 0 + 611 16 2 7.6020 -4.4646 -0.3965 0 1 0 + 612 16 2 7.8427 -3.6012 0.0056 0 1 0 + 613 16 2 8.1052 -2.7475 0.1468 0 1 0 + 614 16 2 -7.5046 -2.2773 -0.2341 1 1 0 + 615 16 2 -8.0922 -1.5595 -0.0543 1 1 0 + 616 16 2 -8.0797 -1.1284 0.8120 1 1 0 + 617 16 2 -7.9078 -0.1612 0.8338 1 1 0 + 618 16 2 -7.2564 -0.6152 0.4267 1 1 0 + 619 16 2 -6.9901 -1.4813 0.5777 1 1 0 + 620 16 2 -7.5499 -2.2351 0.8723 1 1 0 + 621 16 2 8.1379 -2.3707 1.4247 0 1 0 + 622 16 2 7.3800 -1.8112 1.2778 0 1 0 + 623 16 2 6.9180 -1.1503 1.7952 0 1 0 + 624 16 2 7.5396 -0.6083 1.2899 0 1 0 + 625 16 2 7.5787 0.3736 1.3129 0 1 0 + 626 16 2 7.5846 1.3497 1.4451 0 1 0 + 627 16 2 -8.1636 1.7607 2.0002 1 1 0 + 628 16 2 -7.4908 2.4255 1.9123 1 1 0 + 629 16 2 -7.2533 3.3477 1.9264 1 1 0 + 630 16 2 -6.8519 4.2401 1.8024 1 1 0 + 631 16 2 -5.9740 4.4386 1.4127 1 1 0 + 632 16 2 -5.1736 4.4783 0.8900 1 1 0 + 633 16 2 -5.0718 5.0711 0.0736 1 1 0 + 634 16 2 -5.3784 4.4186 -0.5794 1 1 0 + 635 16 2 -5.3691 3.6130 0.0104 1 1 0 + 636 16 2 -4.6994 3.4481 -0.6365 1 1 0 + 637 16 2 -4.2294 4.1905 -0.2483 1 1 0 + 638 16 2 -3.3558 4.1148 0.0136 1 1 0 + 639 16 2 -2.5460 4.4158 0.3900 1 1 0 + 640 16 2 -2.3109 4.3578 -0.5850 1 1 0 + 641 17 1 3.1366 5.0431 -6.0095 0 0 0 + 642 17 1 3.2755 5.3671 -6.8906 0 0 0 + 643 17 1 3.8518 5.6734 -7.5991 0 0 0 + 644 17 1 4.6874 5.9910 -7.8370 0 0 0 + 645 17 1 5.1948 5.8203 7.8380 0 0 -1 + 646 17 1 6.0855 5.5678 7.8261 0 0 -1 + 647 17 1 6.8230 6.1380 7.8826 0 0 -1 + 648 17 1 7.2785 6.6028 -7.7845 0 0 0 + 649 17 1 6.8169 6.7835 -6.9896 0 0 0 + 650 17 1 6.7870 7.6342 -7.2878 0 0 0 + 651 17 1 6.5688 -7.9511 -7.6952 0 1 0 + 652 17 1 6.6767 -7.2992 -6.9866 0 1 0 + 653 17 1 6.1454 -6.5065 -7.0267 0 1 0 + 654 17 1 6.1404 -6.1361 -6.1501 0 1 0 + 655 17 1 6.2549 -6.0296 -5.1562 0 1 0 + 656 17 1 6.7207 -5.1910 -5.3314 0 1 0 + 657 17 1 6.7689 -4.3675 -5.8303 0 1 0 + 658 17 1 7.1050 -3.5345 -6.0891 0 1 0 + 659 17 1 6.7582 -2.6598 -6.2195 0 1 0 + 660 17 1 6.2752 -2.4770 -5.3976 0 1 0 + 661 17 1 5.4318 -2.1504 -4.8697 0 1 0 + 662 17 1 4.5252 -2.1583 -4.6578 0 1 0 + 663 17 1 3.9849 -1.4480 -4.8970 0 1 0 + 664 17 1 3.1551 -1.5781 -5.3336 0 1 0 + 665 17 1 2.2662 -1.6855 -5.5881 0 1 0 + 666 17 1 1.3928 -2.0468 -5.6027 0 1 0 + 667 17 1 1.0392 -2.5586 -4.8882 0 1 0 + 668 17 1 1.2340 -1.6395 -4.6559 0 1 0 + 669 17 1 2.0306 -1.1280 -4.6919 0 1 0 + 670 17 1 1.3951 -0.9010 -5.3318 0 1 0 + 671 17 1 0.8736 -0.0538 -5.5333 0 1 0 + 672 17 1 0.4047 -0.2622 -6.3845 0 1 0 + 673 17 1 -0.0562 -0.0453 -7.2203 0 1 0 + 674 17 1 -0.4831 -0.5740 -7.8736 0 1 0 + 675 17 1 -1.4170 -0.7317 8.2068 0 1 -1 + 676 17 1 -2.2094 -1.2622 -8.0399 0 1 0 + 677 17 1 -1.9390 -2.0268 7.8343 0 1 -1 + 678 17 1 -1.6142 -2.8418 7.4471 0 1 -1 + 679 17 1 -2.4583 -3.1688 7.6052 0 1 -1 + 680 17 1 -3.3312 -3.1756 8.0978 0 1 -1 + 681 18 2 1.0749 -1.8638 -6.6368 0 0 0 + 682 18 2 1.6488 -1.0710 -6.2554 0 0 0 + 683 18 2 1.4408 -0.1686 -6.6018 0 0 0 + 684 18 2 2.0577 0.3102 -7.1758 0 0 0 + 685 18 2 1.9744 -0.6084 -7.5249 0 0 0 + 686 18 2 1.6291 -1.1046 8.1724 0 0 -1 + 687 18 2 1.4730 -1.7829 7.4979 0 0 -1 + 688 18 2 2.1546 -1.8411 6.7721 0 0 -1 + 689 18 2 2.4597 -2.0815 5.9092 0 0 -1 + 690 18 2 1.5039 -2.0241 5.7076 0 0 -1 + 691 18 2 2.0721 -1.6686 5.0198 0 0 -1 + 692 18 2 2.6427 -1.9727 4.3007 0 0 -1 + 693 18 2 2.6022 -1.7490 3.3210 0 0 -1 + 694 18 2 2.8153 -1.2290 2.5367 0 0 -1 + 695 18 2 3.5056 -1.8224 2.8570 0 0 -1 + 696 18 2 2.9039 -2.4362 2.3275 0 0 -1 + 697 18 2 2.1149 -1.8559 2.2740 0 0 -1 + 698 18 2 1.1614 -2.1236 2.3372 0 0 -1 + 699 18 2 0.5552 -2.8327 2.3627 0 0 -1 + 700 18 2 -0.1206 -3.4513 2.4262 0 0 -1 + 701 18 2 -0.6002 -4.1179 3.0006 0 0 -1 + 702 18 2 -0.2066 -4.7998 3.5217 0 0 -1 + 703 18 2 -0.3763 -5.1586 4.3607 0 0 -1 + 704 18 2 -0.7220 -5.3510 5.2358 0 0 -1 + 705 18 2 -1.3882 -5.9886 4.9018 0 0 -1 + 706 18 2 -0.8301 -6.3812 5.5243 0 0 -1 + 707 18 2 -0.6451 -6.8679 6.2632 0 0 -1 + 708 18 2 -1.0682 -6.5172 7.1211 0 0 -1 + 709 18 2 -1.9178 -6.1760 6.9377 0 0 -1 + 710 18 2 -2.8467 -6.5177 6.8205 0 0 -1 + 711 18 2 -2.8214 -7.4033 6.4533 0 0 -1 + 712 18 2 -2.5574 -8.1290 5.9328 0 0 -1 + 713 18 2 -2.0389 7.6139 6.2749 0 -1 -1 + 714 18 2 -1.1955 8.0023 6.2707 0 -1 -1 + 715 18 2 -0.4940 7.4768 6.5480 0 -1 -1 + 716 18 2 0.4453 7.1856 6.7050 0 -1 -1 + 717 18 2 -0.1902 6.7328 7.2500 0 -1 -1 + 718 18 2 -0.6221 6.1092 7.8019 0 -1 -1 + 719 18 2 -0.1261 5.5807 7.1773 0 -1 -1 + 720 18 2 -0.9684 5.9783 6.7751 0 -1 -1 + 721 19 1 -7.1773 -0.9209 -4.8594 0 0 0 + 722 19 1 -8.0110 -0.5053 -4.7943 0 0 0 + 723 19 1 7.5694 -0.7406 -4.2422 -1 0 0 + 724 19 1 6.8934 -1.2071 -3.8650 -1 0 0 + 725 19 1 6.0313 -1.2789 -3.4486 -1 0 0 + 726 19 1 5.1908 -1.0138 -3.1281 -1 0 0 + 727 19 1 4.2675 -0.8315 -2.9630 -1 0 0 + 728 19 1 3.3238 -1.0185 -2.7086 -1 0 0 + 729 19 1 2.7035 -1.5719 -2.2744 -1 0 0 + 730 19 1 2.8896 -2.4635 -2.5857 -1 0 0 + 731 19 1 2.0065 -2.7429 -2.7242 -1 0 0 + 732 19 1 1.0734 -2.4288 -2.7295 -1 0 0 + 733 19 1 1.2464 -2.8166 -1.8444 -1 0 0 + 734 19 1 0.9997 -3.3141 -1.1010 -1 0 0 + 735 19 1 0.8393 -3.2514 -0.1617 -1 0 0 + 736 19 1 1.4445 -2.6925 0.3697 -1 0 0 + 737 19 1 2.3413 -2.9780 0.3644 -1 0 0 + 738 19 1 3.1798 -3.5085 0.3274 -1 0 0 + 739 19 1 3.9689 -3.8965 -0.0130 -1 0 0 + 740 19 1 4.7067 -4.5166 -0.1942 -1 0 0 + 741 19 1 5.5657 -4.0327 -0.0381 -1 0 0 + 742 19 1 5.4435 -4.8960 0.3816 -1 0 0 + 743 19 1 6.0173 -5.4755 -0.0921 -1 0 0 + 744 19 1 6.8292 -5.9330 0.2068 -1 0 0 + 745 19 1 7.0498 -6.0208 1.0926 -1 0 0 + 746 19 1 7.3509 -6.4527 1.8805 -1 0 0 + 747 19 1 7.7355 -7.2132 2.3262 -1 0 0 + 748 19 1 -8.1196 -7.2973 1.5338 0 0 0 + 749 19 1 7.5697 -6.9682 0.9162 -1 0 0 + 750 19 1 6.6205 -6.9454 0.5950 -1 0 0 + 751 19 1 6.1341 -7.8362 0.7780 -1 0 0 + 752 19 1 5.4106 7.9902 0.7272 -1 -1 0 + 753 19 1 5.7939 8.0201 1.5886 -1 -1 0 + 754 19 1 6.4096 8.1103 2.3795 -1 -1 0 + 755 19 1 6.8595 -7.6339 1.8421 -1 0 0 + 756 19 1 6.9399 7.9194 1.2854 -1 -1 0 + 757 19 1 7.7195 -7.9513 1.1148 -1 0 0 + 758 19 1 8.1221 7.8870 1.6961 -1 -1 0 + 759 19 1 7.6128 7.8780 2.4552 -1 -1 0 + 760 19 1 7.6088 7.5013 3.3956 -1 -1 0 + 761 20 2 -4.7494 -3.6573 3.6288 0 0 0 + 762 20 2 -4.2385 -4.2837 4.0914 0 0 0 + 763 20 2 -3.9709 -4.1756 3.1396 0 0 0 + 764 20 2 -4.8327 -4.2923 2.7270 0 0 0 + 765 20 2 -5.7171 -3.9982 2.7118 0 0 0 + 766 20 2 -6.6136 -3.8618 3.2243 0 0 0 + 767 20 2 -7.3331 -4.5031 2.9399 0 0 0 + 768 20 2 -7.6397 -4.1706 2.1305 0 0 0 + 769 20 2 -8.2022 -3.4005 1.9069 0 0 0 + 770 20 2 -7.5928 -3.2488 1.2004 0 0 0 + 771 20 2 -7.4128 -3.2690 0.2635 0 0 0 + 772 20 2 -6.6116 -2.7520 0.3017 0 0 0 + 773 20 2 -6.3365 -3.1055 -0.5414 0 0 0 + 774 20 2 -7.1433 -2.9442 -1.0244 0 0 0 + 775 20 2 -7.7739 -3.5507 -0.6880 0 0 0 + 776 20 2 -7.7656 -4.4766 -0.9603 0 0 0 + 777 20 2 -7.5695 -5.3967 -1.0004 0 0 0 + 778 20 2 -8.1396 -6.1549 -0.9024 0 0 0 + 779 20 2 7.6482 -6.6181 -1.4730 -1 0 0 + 780 20 2 7.2995 -6.5792 -0.5384 -1 0 0 + 781 20 2 7.9840 -6.3045 0.0831 -1 0 0 + 782 20 2 8.1350 -5.7158 0.8352 -1 0 0 + 783 20 2 -7.3502 -5.3594 0.8513 0 0 0 + 784 20 2 -7.1612 -4.3980 1.0956 0 0 0 + 785 20 2 -6.6523 -3.8952 0.5432 0 0 0 + 786 20 2 -5.8277 -3.6044 0.3070 0 0 0 + 787 20 2 -5.1887 -3.3528 -0.3813 0 0 0 + 788 20 2 -5.5836 -2.6400 0.0960 0 0 0 + 789 20 2 -5.5610 -1.7193 0.1034 0 0 0 + 790 20 2 -4.7388 -1.2656 0.4934 0 0 0 + 791 20 2 -4.0140 -1.5555 -0.0166 0 0 0 + 792 20 2 -3.8426 -1.4465 -0.9656 0 0 0 + 793 20 2 -2.8598 -1.4028 -0.7622 0 0 0 + 794 20 2 -2.3964 -0.9771 0.0401 0 0 0 + 795 20 2 -1.7215 -0.6382 0.6724 0 0 0 + 796 20 2 -1.0742 -0.0959 0.2679 0 0 0 + 797 20 2 -0.3132 -0.5552 0.6005 0 0 0 + 798 20 2 0.5017 -0.4458 1.1317 0 0 0 + 799 20 2 0.2018 0.2068 1.7758 0 0 0 + 800 20 2 -0.5355 0.8688 2.0075 0 0 0 + 801 21 1 -6.1097 -2.4421 7.2897 0 0 0 + 802 21 1 -6.2181 -1.6433 7.8475 0 0 0 + 803 21 1 -6.5435 -1.3992 6.9769 0 0 0 + 804 21 1 -7.4150 -1.0802 7.3043 0 0 0 + 805 21 1 -7.6886 -0.7923 8.1906 0 0 0 + 806 21 1 7.9768 -0.0934 -8.1806 -1 0 1 + 807 21 1 7.0796 0.1537 8.0360 -1 0 0 + 808 21 1 7.4510 0.8061 -7.8243 -1 0 1 + 809 21 1 7.6687 0.7658 -6.9078 -1 0 1 + 810 21 1 7.3478 1.6610 -6.8480 -1 0 1 + 811 21 1 7.3239 2.6087 -6.9569 -1 0 1 + 812 21 1 8.0264 2.4696 -7.5780 -1 0 1 + 813 21 1 -7.6459 3.0322 -7.8603 0 0 1 + 814 21 1 -6.7083 2.9825 -7.8751 0 0 1 + 815 21 1 -6.1131 3.4360 -7.3597 0 0 1 + 816 21 1 -5.2314 3.3128 -6.9664 0 0 1 + 817 21 1 -5.1518 4.1997 -7.3776 0 0 1 + 818 21 1 -4.4764 4.6982 -7.7469 0 0 1 + 819 21 1 -4.3086 3.7153 -7.6514 0 0 1 + 820 21 1 -4.0253 2.7986 -7.2625 0 0 1 + 821 21 1 -3.7533 3.0747 -6.4244 0 0 1 + 822 21 1 -3.4409 3.3059 -5.4787 0 0 1 + 823 21 1 -3.4125 4.3296 -5.4664 0 0 1 + 824 21 1 -3.2568 5.2445 -5.7398 0 0 1 + 825 21 1 -2.6134 5.8485 -6.1414 0 0 1 + 826 21 1 -2.2049 5.8249 -7.0227 0 0 1 + 827 21 1 -2.0033 5.9132 -8.0090 0 0 1 + 828 21 1 -2.6667 5.1278 -8.1027 0 0 1 + 829 21 1 -3.1388 4.4598 -7.6221 0 0 1 + 830 21 1 -3.3803 3.5637 -7.3262 0 0 1 + 831 21 1 -2.8567 2.7529 -7.4185 0 0 1 + 832 21 1 -3.1902 2.0485 -7.9464 0 0 1 + 833 21 1 -2.4387 1.5751 8.1659 0 0 0 + 834 21 1 -2.0930 1.8052 7.3484 0 0 0 + 835 21 1 -2.9663 1.5314 6.9926 0 0 0 + 836 21 1 -3.3838 0.7469 6.6020 0 0 0 + 837 21 1 -4.2781 0.7544 6.9629 0 0 0 + 838 21 1 -5.2334 0.7754 6.9040 0 0 0 + 839 21 1 -4.8676 -0.1527 6.8395 0 0 0 + 840 21 1 -3.9852 -0.6770 6.8452 0 0 0 + 841 22 2 -3.2085 -2.4931 -0.9039 0 0 0 + 842 22 2 -3.4472 -2.4041 0.0272 0 0 0 + 843 22 2 -4.0621 -2.8939 -0.4868 0 0 0 + 844 22 2 -4.6887 -2.2306 -0.3350 0 0 0 + 845 22 2 -5.5047 -2.3523 -0.8761 0 0 0 + 846 22 2 -5.4354 -2.9261 -1.6563 0 0 0 + 847 22 2 -5.2248 -3.2954 -2.4821 0 0 0 + 848 22 2 -4.5797 -3.4779 -3.1631 0 0 0 + 849 22 2 -4.1390 -3.7226 -3.9615 0 0 0 + 850 22 2 -3.2377 -3.9361 -3.8555 0 0 0 + 851 22 2 -3.2809 -3.2328 -3.2184 0 0 0 + 852 22 2 -2.6552 -2.7422 -2.7343 0 0 0 + 853 22 2 -1.8722 -2.1151 -2.5433 0 0 0 + 854 22 2 -0.9399 -2.2224 -2.2986 0 0 0 + 855 22 2 -1.0352 -2.5011 -1.4032 0 0 0 + 856 22 2 -1.4981 -3.1490 -0.8708 0 0 0 + 857 22 2 -1.2504 -2.8809 0.0169 0 0 0 + 858 22 2 -1.5269 -2.6440 0.8688 0 0 0 + 859 22 2 -0.9115 -2.2273 1.4285 0 0 0 + 860 22 2 -0.0509 -1.9798 1.8366 0 0 0 + 861 22 2 0.5643 -1.2948 1.6465 0 0 0 + 862 22 2 1.3712 -0.8394 1.4632 0 0 0 + 863 22 2 1.8637 -1.0052 0.6543 0 0 0 + 864 22 2 2.4484 -1.2919 1.4043 0 0 0 + 865 22 2 3.2968 -1.6124 1.6717 0 0 0 + 866 22 2 4.1787 -1.4555 2.0959 0 0 0 + 867 22 2 5.0843 -1.1847 2.4235 0 0 0 + 868 22 2 4.5602 -0.6370 2.9217 0 0 0 + 869 22 2 4.6332 -0.1041 2.1095 0 0 0 + 870 22 2 4.7503 0.8237 1.9757 0 0 0 + 871 22 2 5.0609 1.4001 2.6860 0 0 0 + 872 22 2 4.9648 1.4723 3.6445 0 0 0 + 873 22 2 4.6345 1.4912 4.5370 0 0 0 + 874 22 2 3.9260 1.4517 5.1379 0 0 0 + 875 22 2 2.9870 1.5986 5.3666 0 0 0 + 876 22 2 2.5934 1.2919 6.1626 0 0 0 + 877 22 2 2.1377 1.4343 7.0225 0 0 0 + 878 22 2 1.7866 2.3235 7.2062 0 0 0 + 879 22 2 2.2236 3.0812 7.7115 0 0 0 + 880 22 2 2.7946 2.6417 -8.1326 0 0 1 + 881 23 1 3.2954 1.9172 3.4242 0 0 0 + 882 23 1 3.8773 1.2367 3.8654 0 0 0 + 883 23 1 4.3862 0.5056 4.0633 0 0 0 + 884 23 1 4.3586 -0.4288 4.2942 0 0 0 + 885 23 1 4.0477 -1.0479 4.8949 0 0 0 + 886 23 1 3.5717 -1.6480 5.4696 0 0 0 + 887 23 1 3.5374 -1.9475 6.4260 0 0 0 + 888 23 1 4.0125 -2.0021 7.2699 0 0 0 + 889 23 1 4.5952 -2.5972 7.8114 0 0 0 + 890 23 1 4.3282 -2.9331 -7.7620 0 0 1 + 891 23 1 3.6738 -3.0517 7.9870 0 0 0 + 892 23 1 3.0804 -2.7805 7.2723 0 0 0 + 893 23 1 2.8621 -3.1915 6.3839 0 0 0 + 894 23 1 1.9309 -3.2847 6.1196 0 0 0 + 895 23 1 1.3514 -2.8137 6.7167 0 0 0 + 896 23 1 0.6363 -2.5015 6.2135 0 0 0 + 897 23 1 0.2834 -3.3095 6.6107 0 0 0 + 898 23 1 -0.1410 -2.9882 7.4023 0 0 0 + 899 23 1 -0.8298 -3.4602 6.9400 0 0 0 + 900 23 1 -0.8688 -2.5164 6.6846 0 0 0 + 901 23 1 -1.6210 -2.9079 6.1891 0 0 0 + 902 23 1 -2.3952 -2.5130 6.7895 0 0 0 + 903 23 1 -1.8298 -1.7848 6.7828 0 0 0 + 904 23 1 -1.0791 -1.5635 7.3162 0 0 0 + 905 23 1 -0.6301 -0.6730 7.5231 0 0 0 + 906 23 1 0.1482 -0.1591 7.7549 0 0 0 + 907 23 1 0.6971 -0.7287 -8.1425 0 0 1 + 908 23 1 1.0692 -0.9660 -7.3018 0 0 1 + 909 23 1 0.2695 -1.2250 -6.8830 0 0 1 + 910 23 1 -0.5026 -0.7708 -6.4287 0 0 1 + 911 23 1 -1.1775 -0.3974 -6.9972 0 0 1 + 912 23 1 -2.1085 -0.3679 -7.3044 0 0 1 + 913 23 1 -2.8738 -0.4110 -7.8206 0 0 1 + 914 23 1 -3.7560 -0.5862 -8.2099 0 0 1 + 915 23 1 -4.2720 -1.3899 8.0432 0 0 0 + 916 23 1 -4.2607 -2.4205 8.0795 0 0 0 + 917 23 1 -4.3328 -3.3367 -8.0376 0 0 1 + 918 23 1 -4.1010 -4.2223 -7.8160 0 0 1 + 919 23 1 -3.9926 -5.0875 8.1687 0 0 0 + 920 23 1 -4.8656 -5.2191 7.9655 0 0 0 + 921 24 2 3.4569 5.1644 1.7969 0 0 0 + 922 24 2 2.7015 5.3224 1.2124 0 0 0 + 923 24 2 2.5220 6.1465 0.8003 0 0 0 + 924 24 2 1.9798 7.0320 0.7218 0 0 0 + 925 24 2 1.4861 7.3241 -0.1108 0 0 0 + 926 24 2 2.1828 7.8762 -0.5012 0 0 0 + 927 24 2 2.7604 7.6196 0.2154 0 0 0 + 928 24 2 3.4467 7.3765 0.8581 0 0 0 + 929 24 2 4.0634 8.0660 0.9766 0 0 0 + 930 24 2 4.6418 7.2839 0.7406 0 0 0 + 931 24 2 5.4900 6.9240 1.1378 0 0 0 + 932 24 2 6.3729 7.0444 1.5699 0 0 0 + 933 24 2 6.7279 7.0976 2.4293 0 0 0 + 934 24 2 7.3987 7.1421 1.7731 0 0 0 + 935 24 2 7.7215 6.2621 1.6809 0 0 0 + 936 24 2 6.8688 6.1993 2.0760 0 0 0 + 937 24 2 5.9851 5.9049 2.3566 0 0 0 + 938 24 2 5.1338 5.6813 2.8423 0 0 0 + 939 24 2 5.7331 4.8670 2.6586 0 0 0 + 940 24 2 6.3764 4.1670 2.6899 0 0 0 + 941 24 2 6.6963 3.4812 2.0639 0 0 0 + 942 24 2 6.0696 3.2200 1.3791 0 0 0 + 943 24 2 6.2166 2.3590 0.9337 0 0 0 + 944 24 2 6.5420 1.7780 1.5762 0 0 0 + 945 24 2 6.5533 0.8652 1.3070 0 0 0 + 946 24 2 6.6337 0.5087 2.1385 0 0 0 + 947 24 2 6.5352 -0.1943 1.5456 0 0 0 + 948 24 2 6.0361 -0.0451 0.7291 0 0 0 + 949 24 2 5.4614 0.4524 0.1219 0 0 0 + 950 24 2 4.6325 0.9486 -0.1585 0 0 0 + 951 24 2 3.6837 0.9598 0.1619 0 0 0 + 952 24 2 4.0374 1.7248 0.5984 0 0 0 + 953 24 2 4.5978 2.1498 -0.1666 0 0 0 + 954 24 2 4.9400 1.8583 -0.9890 0 0 0 + 955 24 2 4.6608 1.0852 -1.4993 0 0 0 + 956 24 2 5.5915 1.0782 -1.7072 0 0 0 + 957 24 2 6.5344 0.9677 -1.6802 0 0 0 + 958 24 2 7.3339 0.4246 -1.7086 0 0 0 + 959 24 2 -8.2111 0.3249 -2.0230 1 0 0 + 960 24 2 -7.5986 -0.2041 -2.4930 1 0 0 + 961 25 1 1.1018 6.5419 -1.0492 0 0 0 + 962 25 1 0.7829 6.0552 -1.7940 0 0 0 + 963 25 1 0.3232 5.2536 -1.9575 0 0 0 + 964 25 1 -0.3870 5.5549 -2.4903 0 0 0 + 965 25 1 -0.7171 4.6645 -2.7848 0 0 0 + 966 25 1 -0.9951 3.7386 -2.6912 0 0 0 + 967 25 1 -1.1320 3.3205 -1.7807 0 0 0 + 968 25 1 -2.0533 3.4871 -1.6876 0 0 0 + 969 25 1 -2.8586 2.9465 -1.6251 0 0 0 + 970 25 1 -3.2223 2.1782 -2.0798 0 0 0 + 971 25 1 -3.8274 1.5116 -2.3784 0 0 0 + 972 25 1 -3.7598 0.5583 -2.4255 0 0 0 + 973 25 1 -3.3623 1.0377 -1.6519 0 0 0 + 974 25 1 -3.7586 1.2489 -0.7809 0 0 0 + 975 25 1 -4.3868 1.8300 -0.3896 0 0 0 + 976 25 1 -4.4920 2.7031 0.0416 0 0 0 + 977 25 1 -4.5043 3.4555 0.6085 0 0 0 + 978 25 1 -3.8981 4.0194 1.0515 0 0 0 + 979 25 1 -3.6762 4.9798 1.2363 0 0 0 + 980 25 1 -4.5673 5.2820 1.0865 0 0 0 + 981 25 1 -5.4984 5.5255 1.0121 0 0 0 + 982 25 1 -5.9771 5.5160 1.8017 0 0 0 + 983 25 1 -5.9053 5.9709 2.6545 0 0 0 + 984 25 1 -5.0208 5.8803 2.9937 0 0 0 + 985 25 1 -4.0696 5.7920 3.1605 0 0 0 + 986 25 1 -3.8383 5.0120 2.6410 0 0 0 + 987 25 1 -3.1389 4.8167 2.0440 0 0 0 + 988 25 1 -2.8180 5.1639 2.8886 0 0 0 + 989 25 1 -2.2268 5.4889 2.2516 0 0 0 + 990 25 1 -1.2954 5.4721 2.1408 0 0 0 + 991 25 1 -0.9482 4.7582 1.5980 0 0 0 + 992 25 1 -1.1984 3.9123 1.2988 0 0 0 + 993 25 1 -1.3266 2.9776 1.1003 0 0 0 + 994 25 1 -1.8233 2.8863 1.9327 0 0 0 + 995 25 1 -1.8924 2.2708 2.6444 0 0 0 + 996 25 1 -1.6463 1.8803 3.5120 0 0 0 + 997 25 1 -1.7654 1.9854 4.4310 0 0 0 + 998 25 1 -0.9154 2.2400 4.7759 0 0 0 + 999 25 1 -1.5993 2.4556 5.3462 0 0 0 + 1000 25 1 -1.9865 3.2290 4.9508 0 0 0 + 1001 26 2 -5.0634 -6.2137 1.9270 0 0 0 + 1002 26 2 -5.7061 -5.6388 1.6938 0 0 0 + 1003 26 2 -6.2581 -5.1139 1.0853 0 0 0 + 1004 26 2 -5.8511 -4.9377 0.2364 0 0 0 + 1005 26 2 -6.3867 -5.5208 -0.3550 0 0 0 + 1006 26 2 -5.5644 -5.3273 -0.8939 0 0 0 + 1007 26 2 -5.1327 -5.1200 -1.6727 0 0 0 + 1008 26 2 -5.0642 -5.9199 -2.1111 0 0 0 + 1009 26 2 -4.5887 -6.4716 -2.7031 0 0 0 + 1010 26 2 -3.6666 -6.4812 -2.4646 0 0 0 + 1011 26 2 -3.1918 -7.2461 -2.0077 0 0 0 + 1012 26 2 -2.5657 -7.9829 -1.8164 0 0 0 + 1013 26 2 -2.0614 -7.3778 -2.2872 0 0 0 + 1014 26 2 -2.4025 -6.6059 -1.9828 0 0 0 + 1015 26 2 -2.4316 -6.9387 -1.1572 0 0 0 + 1016 26 2 -2.3335 -7.8270 -0.7940 0 0 0 + 1017 26 2 -2.2653 7.7260 -0.4060 0 -1 0 + 1018 26 2 -1.4756 7.2541 -0.1894 0 -1 0 + 1019 26 2 -1.1298 6.6772 0.5406 0 -1 0 + 1020 26 2 -0.1865 6.3605 0.6373 0 -1 0 + 1021 26 2 0.5970 6.6257 1.0108 0 -1 0 + 1022 26 2 1.2021 6.3431 0.3506 0 -1 0 + 1023 26 2 2.0811 6.1351 -0.0391 0 -1 0 + 1024 26 2 2.9596 6.4281 -0.1493 0 -1 0 + 1025 26 2 3.7310 6.9279 -0.3688 0 -1 0 + 1026 26 2 3.8160 7.8172 -0.7560 0 -1 0 + 1027 26 2 3.8333 -7.9805 -0.0530 0 0 0 + 1028 26 2 3.5468 -7.4195 0.6407 0 0 0 + 1029 26 2 2.6606 -7.1129 0.9165 0 0 0 + 1030 26 2 2.8879 -7.4683 1.8264 0 0 0 + 1031 26 2 2.4346 -8.0314 2.4164 0 0 0 + 1032 26 2 1.8094 7.7149 2.0826 0 -1 0 + 1033 26 2 1.1968 7.0352 1.7291 0 -1 0 + 1034 26 2 0.3058 6.9117 2.1151 0 -1 0 + 1035 26 2 -0.3572 6.5682 2.6593 0 -1 0 + 1036 26 2 -1.3245 6.4873 2.9500 0 -1 0 + 1037 26 2 -1.0696 5.6857 3.3249 0 -1 0 + 1038 26 2 -1.8464 5.1136 3.1805 0 -1 0 + 1039 26 2 -1.5472 4.5147 2.4241 0 -1 0 + 1040 26 2 -2.0982 4.6927 1.6860 0 -1 0 + 1041 27 1 3.9908 -7.8489 -3.0641 0 0 0 + 1042 27 1 4.4635 8.2026 -2.1431 0 -1 0 + 1043 27 1 4.3965 -7.7086 -1.2717 0 0 0 + 1044 27 1 4.8984 -7.0784 -1.8176 0 0 0 + 1045 27 1 5.3630 -6.2847 -2.1934 0 0 0 + 1046 27 1 5.1148 -5.3875 -2.5245 0 0 0 + 1047 27 1 5.0606 -4.4265 -2.3608 0 0 0 + 1048 27 1 5.8833 -4.1736 -2.8460 0 0 0 + 1049 27 1 6.8084 -4.4782 -3.0253 0 0 0 + 1050 27 1 6.7710 -3.7543 -3.6761 0 0 0 + 1051 27 1 7.4166 -3.4463 -4.3159 0 0 0 + 1052 27 1 8.1365 -2.8114 -4.1892 0 0 0 + 1053 27 1 -7.4485 -2.4412 -3.8705 1 0 0 + 1054 27 1 -7.8650 -2.2661 -3.0241 1 0 0 + 1055 27 1 -7.9862 -1.9107 -2.1288 1 0 0 + 1056 27 1 -8.1035 -2.4289 -1.3160 1 0 0 + 1057 27 1 -7.3805 -1.8472 -1.2148 1 0 0 + 1058 27 1 -7.1040 -1.1289 -0.5657 1 0 0 + 1059 27 1 -6.2891 -0.8397 -0.2667 1 0 0 + 1060 27 1 -5.2162 -0.8708 -0.4393 1 0 0 + 1061 27 1 -4.3102 -0.5330 -0.4233 1 0 0 + 1062 27 1 -3.9641 0.3379 -0.1698 1 0 0 + 1063 27 1 -4.4316 0.8156 0.4648 1 0 0 + 1064 27 1 -4.1943 1.6457 0.8857 1 0 0 + 1065 27 1 -3.7659 2.5310 0.9608 1 0 0 + 1066 27 1 -3.2597 3.2977 0.7121 1 0 0 + 1067 27 1 -2.5632 2.8121 0.3421 1 0 0 + 1068 27 1 -2.3296 1.9726 -0.0298 1 0 0 + 1069 27 1 -1.7906 1.1556 0.1178 1 0 0 + 1070 27 1 -0.8454 1.1195 -0.1987 1 0 0 + 1071 27 1 -0.1270 1.5614 0.2124 1 0 0 + 1072 27 1 0.8180 1.6787 -0.0749 1 0 0 + 1073 27 1 1.1447 1.3071 -0.9330 1 0 0 + 1074 27 1 1.0671 0.6894 -0.1804 1 0 0 + 1075 27 1 0.0830 0.8005 -0.4675 1 0 0 + 1076 27 1 0.2392 0.3384 0.3177 1 0 0 + 1077 27 1 0.9543 0.4816 0.9186 1 0 0 + 1078 27 1 1.8782 0.1844 1.1480 1 0 0 + 1079 27 1 2.5960 0.7765 1.2713 1 0 0 + 1080 27 1 2.9269 1.5889 0.8008 1 0 0 + 1081 28 2 -3.8490 -1.1767 -3.2348 0 0 0 + 1082 28 2 -4.1166 -0.2133 -3.1837 0 0 0 + 1083 28 2 -4.8775 0.3045 -3.4400 0 0 0 + 1084 28 2 -5.2612 0.6826 -4.1849 0 0 0 + 1085 28 2 -5.8731 1.0105 -3.4872 0 0 0 + 1086 28 2 -6.4958 0.6146 -2.8046 0 0 0 + 1087 28 2 -6.7607 0.4482 -1.9493 0 0 0 + 1088 28 2 -6.9215 1.3183 -1.8739 0 0 0 + 1089 28 2 -6.6891 2.2217 -1.5197 0 0 0 + 1090 28 2 -6.0142 1.9490 -0.9798 0 0 0 + 1091 28 2 -5.5258 2.6461 -0.5495 0 0 0 + 1092 28 2 -4.9638 2.7724 -1.3683 0 0 0 + 1093 28 2 -5.5941 2.2742 -1.8618 0 0 0 + 1094 28 2 -6.0697 2.8855 -2.5109 0 0 0 + 1095 28 2 -5.9125 3.1580 -1.6517 0 0 0 + 1096 28 2 -5.1764 3.5772 -2.0558 0 0 0 + 1097 28 2 -5.0034 2.9762 -2.7691 0 0 0 + 1098 28 2 -5.7009 3.2769 -3.4150 0 0 0 + 1099 28 2 -5.2694 4.0844 -2.9918 0 0 0 + 1100 28 2 -5.0790 4.8339 -3.5601 0 0 0 + 1101 28 2 -4.8143 5.3383 -4.2780 0 0 0 + 1102 28 2 -4.4331 6.0260 -4.7959 0 0 0 + 1103 28 2 -4.2320 5.8019 -5.7835 0 0 0 + 1104 28 2 -5.0094 6.0747 -6.2529 0 0 0 + 1105 28 2 -5.7143 5.4965 -6.0592 0 0 0 + 1106 28 2 -4.9997 5.1425 -5.5513 0 0 0 + 1107 28 2 -5.1466 4.6319 -6.3188 0 0 0 + 1108 28 2 -5.9937 4.4243 -6.7816 0 0 0 + 1109 28 2 -6.7920 3.9612 -6.4865 0 0 0 + 1110 28 2 -6.8964 4.3370 -7.3626 0 0 0 + 1111 28 2 -7.3735 4.4566 -8.1847 0 0 0 + 1112 28 2 -7.9382 5.0743 7.7925 0 0 -1 + 1113 28 2 7.8386 5.5828 -8.1771 -1 0 0 + 1114 28 2 -8.1519 5.2599 -7.4132 0 0 0 + 1115 28 2 7.7295 4.5998 -8.0016 -1 0 0 + 1116 28 2 6.7770 4.8159 -7.8443 -1 0 0 + 1117 28 2 6.0955 4.6852 -7.1503 -1 0 0 + 1118 28 2 5.3532 4.6158 -6.5932 -1 0 0 + 1119 28 2 5.0958 4.5147 -5.6120 -1 0 0 + 1120 28 2 5.4547 3.8419 -4.9972 -1 0 0 + 1121 29 1 -5.1486 7.3007 5.4456 0 0 0 + 1122 29 1 -4.6403 7.9850 4.9936 0 0 0 + 1123 29 1 -4.7137 -8.1256 4.1041 0 1 0 + 1124 29 1 -4.6847 -7.8154 3.1588 0 1 0 + 1125 29 1 -4.1071 -7.1239 2.7099 0 1 0 + 1126 29 1 -3.2223 -6.9539 2.3244 0 1 0 + 1127 29 1 -2.3491 -6.5665 2.4025 0 1 0 + 1128 29 1 -1.8498 -7.2816 2.7661 0 1 0 + 1129 29 1 -1.8680 8.1477 2.7123 0 0 0 + 1130 29 1 -2.2596 7.3367 3.1604 0 0 0 + 1131 29 1 -2.2224 6.4526 3.5404 0 0 0 + 1132 29 1 -3.1775 6.1040 3.4805 0 0 0 + 1133 29 1 -3.3528 6.2960 4.3553 0 0 0 + 1134 29 1 -3.0625 6.7003 5.2228 0 0 0 + 1135 29 1 -2.3038 6.6964 5.7775 0 0 0 + 1136 29 1 -2.2797 6.7042 6.6919 0 0 0 + 1137 29 1 -2.9156 6.0223 6.8521 0 0 0 + 1138 29 1 -2.0657 5.6636 7.2453 0 0 0 + 1139 29 1 -2.7001 4.8721 7.1580 0 0 0 + 1140 29 1 -2.6151 4.8702 6.1299 0 0 0 + 1141 29 1 -3.2198 4.1822 5.6857 0 0 0 + 1142 29 1 -3.6825 3.4038 5.8608 0 0 0 + 1143 29 1 -4.3420 3.5133 6.5277 0 0 0 + 1144 29 1 -4.2221 4.0029 7.2838 0 0 0 + 1145 29 1 -3.9146 4.7125 7.7874 0 0 0 + 1146 29 1 -3.4892 5.5313 7.7189 0 0 0 + 1147 29 1 -3.5644 5.9480 -7.8443 0 0 1 + 1148 29 1 -3.0850 6.3778 -7.1230 0 0 1 + 1149 29 1 -2.4702 7.0716 -7.1120 0 0 1 + 1150 29 1 -1.5213 6.8648 -7.2705 0 0 1 + 1151 29 1 -0.8597 7.0053 -7.9144 0 0 1 + 1152 29 1 -1.3904 7.7660 -8.1956 0 0 1 + 1153 29 1 -2.3156 7.5475 -7.9781 0 0 1 + 1154 29 1 -2.9204 8.1667 -7.6148 0 0 1 + 1155 29 1 -3.3114 7.6611 -6.9743 0 0 1 + 1156 29 1 -3.8525 6.9246 -6.6584 0 0 1 + 1157 29 1 -3.7563 7.6702 -6.0559 0 0 1 + 1158 29 1 -4.6150 8.1351 -6.2590 0 0 1 + 1159 29 1 -4.9892 -7.4085 -6.3363 0 1 1 + 1160 29 1 -4.7031 -6.4350 -6.2362 0 1 1 + 1161 30 2 6.2037 -5.1746 5.5892 0 0 0 + 1162 30 2 6.5429 -4.9419 4.6778 0 0 0 + 1163 30 2 5.9371 -5.6459 4.5179 0 0 0 + 1164 30 2 5.4005 -6.0742 5.2642 0 0 0 + 1165 30 2 4.5465 -5.6905 5.5118 0 0 0 + 1166 30 2 3.8038 -6.2953 5.8439 0 0 0 + 1167 30 2 4.2378 -6.4675 6.7363 0 0 0 + 1168 30 2 4.2979 -7.3263 7.2311 0 0 0 + 1169 30 2 3.8488 -7.6989 8.0120 0 0 0 + 1170 30 2 4.4501 8.1328 7.5921 0 -1 0 + 1171 30 2 4.9577 7.3177 7.5767 0 -1 0 + 1172 30 2 5.5664 6.7120 7.9370 0 -1 0 + 1173 30 2 6.2473 6.9510 -7.9385 0 -1 1 + 1174 30 2 5.7664 6.6731 -7.1007 0 -1 1 + 1175 30 2 5.5549 5.7133 -6.9660 0 -1 1 + 1176 30 2 5.0627 5.1502 -7.5857 0 -1 1 + 1177 30 2 5.6842 4.7440 -8.2013 0 -1 1 + 1178 30 2 5.4098 4.7881 7.2479 0 -1 0 + 1179 30 2 5.8083 4.2955 6.4793 0 -1 0 + 1180 30 2 6.4709 3.6284 6.3807 0 -1 0 + 1181 30 2 7.0358 2.8691 6.1463 0 -1 0 + 1182 30 2 7.8730 3.1525 5.7953 0 -1 0 + 1183 30 2 -8.0861 3.5599 6.4290 1 -1 0 + 1184 30 2 7.6532 3.1217 6.9540 0 -1 0 + 1185 30 2 6.8696 3.1498 7.4830 0 -1 0 + 1186 30 2 6.9731 3.8322 8.1000 0 -1 0 + 1187 30 2 6.1772 4.0232 7.6202 0 -1 0 + 1188 30 2 5.8316 3.7537 -7.8506 0 -1 1 + 1189 30 2 5.1431 3.3834 -7.2623 0 -1 1 + 1190 30 2 4.4458 2.9205 -6.7443 0 -1 1 + 1191 30 2 4.4524 2.7396 -7.7111 0 -1 1 + 1192 30 2 4.0708 3.0865 7.9049 0 -1 0 + 1193 30 2 3.5644 3.8522 7.7504 0 -1 0 + 1194 30 2 2.6546 4.3283 8.0093 0 -1 0 + 1195 30 2 2.4352 3.6908 -7.7489 0 -1 1 + 1196 30 2 3.3718 3.4888 -7.6403 0 -1 1 + 1197 30 2 3.4233 2.6064 -7.2574 0 -1 1 + 1198 30 2 3.6107 1.7419 -7.6786 0 -1 1 + 1199 30 2 4.3462 1.2557 -8.0551 0 -1 1 + 1200 30 2 5.2215 1.0136 8.1067 0 -1 0 + 1201 31 1 6.9645 -2.1279 0.2899 0 0 0 + 1202 31 1 6.6737 -3.0482 0.3111 0 0 0 + 1203 31 1 5.8055 -3.0069 -0.2323 0 0 0 + 1204 31 1 5.5733 -2.1806 -0.6214 0 0 0 + 1205 31 1 5.6014 -1.2640 -0.7286 0 0 0 + 1206 31 1 5.9677 -1.2984 0.1759 0 0 0 + 1207 31 1 6.6846 -1.1720 0.8321 0 0 0 + 1208 31 1 5.8090 -1.5939 1.0933 0 0 0 + 1209 31 1 6.0328 -1.7027 2.0571 0 0 0 + 1210 31 1 6.6576 -1.8175 2.8194 0 0 0 + 1211 31 1 6.3060 -0.9848 3.1222 0 0 0 + 1212 31 1 5.4385 -0.7572 3.4350 0 0 0 + 1213 31 1 5.7235 -0.3870 2.5707 0 0 0 + 1214 31 1 5.6881 0.5534 2.7425 0 0 0 + 1215 31 1 4.7635 0.4213 3.0722 0 0 0 + 1216 31 1 3.7997 0.3516 3.1450 0 0 0 + 1217 31 1 3.4229 0.1383 4.0167 0 0 0 + 1218 31 1 3.8350 0.2124 4.9187 0 0 0 + 1219 31 1 4.3597 -0.2031 5.5559 0 0 0 + 1220 31 1 4.7544 -0.0273 6.4099 0 0 0 + 1221 31 1 5.6014 -0.3460 6.5425 0 0 0 + 1222 31 1 6.1658 -0.8708 7.1161 0 0 0 + 1223 31 1 7.0362 -1.2038 7.0888 0 0 0 + 1224 31 1 7.1158 -0.2462 7.1343 0 0 0 + 1225 31 1 7.3348 0.6810 7.2196 0 0 0 + 1226 31 1 6.9127 1.3020 7.7609 0 0 0 + 1227 31 1 6.6332 2.2645 7.8513 0 0 0 + 1228 31 1 6.0408 1.5479 -8.1848 0 0 1 + 1229 31 1 6.2694 0.6721 -7.9425 0 0 1 + 1230 31 1 6.5885 1.2675 -7.2467 0 0 1 + 1231 31 1 5.9206 0.8217 -6.7914 0 0 1 + 1232 31 1 5.0153 0.9311 -6.5212 0 0 1 + 1233 31 1 5.2502 0.3484 -5.7773 0 0 1 + 1234 31 1 5.6892 -0.0590 -5.0202 0 0 1 + 1235 31 1 5.6411 -0.5506 -4.1300 0 0 1 + 1236 31 1 5.1458 -1.3025 -4.1178 0 0 1 + 1237 31 1 4.3339 -1.5706 -3.6755 0 0 1 + 1238 31 1 4.7302 -1.9764 -2.9440 0 0 1 + 1239 31 1 5.6665 -2.2271 -2.6694 0 0 1 + 1240 31 1 6.5701 -2.2174 -2.4471 0 0 1 + 1241 32 2 -1.0057 -0.1671 1.3998 0 0 0 + 1242 32 2 -1.5498 0.3345 1.9657 0 0 0 + 1243 32 2 -0.8554 -0.0330 2.5583 0 0 0 + 1244 32 2 -0.5081 -0.8202 2.1135 0 0 0 + 1245 32 2 -0.5847 -1.3101 1.3020 0 0 0 + 1246 32 2 -0.1893 -1.8421 0.6479 0 0 0 + 1247 32 2 -0.3544 -2.7745 0.5651 0 0 0 + 1248 32 2 -0.7974 -3.5662 0.9101 0 0 0 + 1249 32 2 -0.9835 -3.8150 1.7975 0 0 0 + 1250 32 2 -1.5854 -4.0836 2.4831 0 0 0 + 1251 32 2 -2.3670 -4.1539 3.0170 0 0 0 + 1252 32 2 -2.6095 -4.6594 3.8185 0 0 0 + 1253 32 2 -2.5514 -4.3768 4.7260 0 0 0 + 1254 32 2 -2.2184 -4.2584 5.6010 0 0 0 + 1255 32 2 -2.7977 -4.6039 6.2843 0 0 0 + 1256 32 2 -2.9090 -5.1459 7.0558 0 0 0 + 1257 32 2 -3.4740 -5.6551 6.4647 0 0 0 + 1258 32 2 -3.2911 -6.1418 5.6993 0 0 0 + 1259 32 2 -4.0943 -6.0487 5.2528 0 0 0 + 1260 32 2 -5.0004 -5.9556 5.7504 0 0 0 + 1261 32 2 -4.7716 -6.0703 6.6398 0 0 0 + 1262 32 2 -4.2387 -6.1732 7.4936 0 0 0 + 1263 32 2 -4.2089 -5.3246 7.1549 0 0 0 + 1264 32 2 -4.1066 -4.4230 6.8694 0 0 0 + 1265 32 2 -4.0089 -4.1787 5.8899 0 0 0 + 1266 32 2 -5.0317 -4.2279 5.7505 0 0 0 + 1267 32 2 -4.8803 -5.0094 6.3420 0 0 0 + 1268 32 2 -4.4470 -5.0913 5.5438 0 0 0 + 1269 32 2 -3.4780 -5.1350 5.7161 0 0 0 + 1270 32 2 -2.8777 -5.4584 5.0222 0 0 0 + 1271 32 2 -3.0603 -6.3042 4.5228 0 0 0 + 1272 32 2 -3.1522 -5.5370 4.0398 0 0 0 + 1273 32 2 -3.7026 -5.2268 3.3178 0 0 0 + 1274 32 2 -3.1461 -4.8643 2.5687 0 0 0 + 1275 32 2 -2.7494 -4.2950 1.9455 0 0 0 + 1276 32 2 -3.0330 -3.4454 1.5955 0 0 0 + 1277 32 2 -3.6749 -2.7794 1.6471 0 0 0 + 1278 32 2 -4.6316 -2.8834 1.8616 0 0 0 + 1279 32 2 -5.2643 -3.5683 1.9459 0 0 0 + 1280 32 2 -5.6267 -4.1182 1.2282 0 0 0 + 1281 33 1 -0.8549 1.4349 4.1016 0 0 0 + 1282 33 1 -0.5281 1.9079 3.3651 0 0 0 + 1283 33 1 -0.3525 2.8114 3.7131 0 0 0 + 1284 33 1 -0.5359 3.7024 3.8119 0 0 0 + 1285 33 1 0.1970 4.2054 3.4425 0 0 0 + 1286 33 1 0.1745 3.3510 2.9548 0 0 0 + 1287 33 1 0.6410 2.5180 2.9992 0 0 0 + 1288 33 1 0.0114 2.0698 2.3944 0 0 0 + 1289 33 1 -0.0226 1.8354 1.4683 0 0 0 + 1290 33 1 0.0232 2.4050 0.6590 0 0 0 + 1291 33 1 0.7487 2.6398 0.1066 0 0 0 + 1292 33 1 0.6278 2.8983 -0.8361 0 0 0 + 1293 33 1 0.0173 2.1520 -0.9211 0 0 0 + 1294 33 1 -0.7217 1.5309 -1.0521 0 0 0 + 1295 33 1 -1.2832 1.1881 -1.8383 0 0 0 + 1296 33 1 -1.7701 1.1856 -1.0511 0 0 0 + 1297 33 1 -2.3177 0.4736 -1.4861 0 0 0 + 1298 33 1 -2.8391 -0.0266 -2.1137 0 0 0 + 1299 33 1 -2.1636 0.3546 -2.6437 0 0 0 + 1300 33 1 -1.5703 0.9441 -3.1368 0 0 0 + 1301 33 1 -1.1677 1.4059 -3.8984 0 0 0 + 1302 33 1 -1.3088 0.5483 -4.3268 0 0 0 + 1303 33 1 -1.2809 -0.2706 -4.7904 0 0 0 + 1304 33 1 -2.0577 -0.8166 -5.1258 0 0 0 + 1305 33 1 -2.6436 -0.2306 -5.5314 0 0 0 + 1306 33 1 -3.6450 -0.0346 -5.3750 0 0 0 + 1307 33 1 -4.4052 0.2344 -5.8560 0 0 0 + 1308 33 1 -4.5908 -0.7171 -6.1561 0 0 0 + 1309 33 1 -5.4531 -0.8992 -5.8500 0 0 0 + 1310 33 1 -5.5945 -1.3816 -4.9813 0 0 0 + 1311 33 1 -6.3195 -1.7816 -4.5704 0 0 0 + 1312 33 1 -6.4115 -1.7611 -3.6116 0 0 0 + 1313 33 1 -5.7954 -0.9771 -3.8395 0 0 0 + 1314 33 1 -5.8349 -0.1625 -3.3734 0 0 0 + 1315 33 1 -5.9699 -0.0919 -4.3687 0 0 0 + 1316 33 1 -6.3842 -0.1231 -5.2295 0 0 0 + 1317 33 1 -7.3077 -0.0297 -5.5870 0 0 0 + 1318 33 1 -7.2186 -0.4223 -6.4912 0 0 0 + 1319 33 1 -7.0819 -1.0133 -7.2580 0 0 0 + 1320 33 1 -6.3050 -0.8821 -7.8212 0 0 0 + 1321 34 2 -2.9155 1.0394 -2.7384 0 0 0 + 1322 34 2 -2.5110 1.6287 -3.3408 0 0 0 + 1323 34 2 -1.7275 2.1461 -3.4864 0 0 0 + 1324 34 2 -1.3040 2.5515 -2.6807 0 0 0 + 1325 34 2 -0.6084 2.3460 -2.1374 0 0 0 + 1326 34 2 -0.9486 2.4371 -1.2454 0 0 0 + 1327 34 2 -1.7660 2.3099 -0.8589 0 0 0 + 1328 34 2 -1.4519 3.1673 -0.6224 0 0 0 + 1329 34 2 -2.3774 3.2153 -0.7161 0 0 0 + 1330 34 2 -3.1013 3.8097 -1.0113 0 0 0 + 1331 34 2 -3.6261 4.6856 -0.9732 0 0 0 + 1332 34 2 -2.8513 5.2603 -0.6419 0 0 0 + 1333 34 2 -1.8725 5.3495 -0.4935 0 0 0 + 1334 34 2 -0.9411 5.4275 -0.1198 0 0 0 + 1335 34 2 -0.8359 6.2241 -0.5745 0 0 0 + 1336 34 2 -1.5118 6.1127 -1.2628 0 0 0 + 1337 34 2 -1.9079 6.9521 -1.6054 0 0 0 + 1338 34 2 -2.7317 7.4121 -1.6090 0 0 0 + 1339 34 2 -3.4666 8.0289 -1.3943 0 0 0 + 1340 34 2 -4.2552 -8.0321 -1.0579 0 1 0 + 1341 34 2 -4.7029 -7.2298 -1.0757 0 1 0 + 1342 34 2 -5.6060 -7.4985 -1.1609 0 1 0 + 1343 34 2 -6.4074 -6.8425 -1.1900 0 1 0 + 1344 34 2 -7.0415 -6.5306 -1.8340 0 1 0 + 1345 34 2 -7.7161 -5.8219 -1.8713 0 1 0 + 1346 34 2 -7.9741 -5.5817 -2.7660 0 1 0 + 1347 34 2 8.0254 -6.4097 -2.4327 -1 1 0 + 1348 34 2 -7.5507 -6.6087 -2.7872 0 1 0 + 1349 34 2 -6.5867 -6.7552 -2.9808 0 1 0 + 1350 34 2 -6.3672 -7.6597 -3.2591 0 1 0 + 1351 34 2 -6.3287 -7.1039 -4.0192 0 1 0 + 1352 34 2 -5.8712 -6.2635 -3.9620 0 1 0 + 1353 34 2 -5.0462 -5.7811 -3.6667 0 1 0 + 1354 34 2 -4.9413 -5.0504 -3.0048 0 1 0 + 1355 34 2 -4.6051 -4.3177 -2.4094 0 1 0 + 1356 34 2 -3.7886 -3.7452 -2.4746 0 1 0 + 1357 34 2 -4.3120 -3.0209 -2.0915 0 1 0 + 1358 34 2 -4.7389 -2.1924 -2.4553 0 1 0 + 1359 34 2 -4.3895 -1.4591 -1.9306 0 1 0 + 1360 34 2 -4.9661 -1.5195 -1.1874 0 1 0 + 1361 35 1 -2.4598 -1.4739 -6.9290 0 0 0 + 1362 35 1 -1.5313 -1.3843 -7.2260 0 0 0 + 1363 35 1 -0.6175 -1.4965 -7.3896 0 0 0 + 1364 35 1 0.2580 -1.6403 -7.8711 0 0 0 + 1365 35 1 1.2244 -2.0090 -7.7274 0 0 0 + 1366 35 1 1.6661 -2.8717 -7.9651 0 0 0 + 1367 35 1 1.4779 -3.7683 -7.5648 0 0 0 + 1368 35 1 1.7900 -4.0787 7.9390 0 0 -1 + 1369 35 1 1.0453 -3.5577 7.6209 0 0 -1 + 1370 35 1 0.9106 -2.6415 7.7367 0 0 -1 + 1371 35 1 0.4695 -2.0376 7.1858 0 0 -1 + 1372 35 1 0.5170 -1.0914 7.2906 0 0 -1 + 1373 35 1 1.0175 -0.3672 6.9128 0 0 -1 + 1374 35 1 0.7609 -0.2629 5.9522 0 0 -1 + 1375 35 1 1.0389 -1.0314 5.4356 0 0 -1 + 1376 35 1 0.0783 -1.0234 5.6500 0 0 -1 + 1377 35 1 -0.2184 -1.3511 6.4738 0 0 -1 + 1378 35 1 0.7215 -1.4790 6.3276 0 0 -1 + 1379 35 1 1.5929 -1.0017 6.3829 0 0 -1 + 1380 35 1 2.4027 -0.9060 5.9024 0 0 -1 + 1381 35 1 3.3172 -0.9652 6.2006 0 0 -1 + 1382 35 1 4.3331 -1.0920 5.9833 0 0 -1 + 1383 35 1 5.1331 -0.9517 5.4249 0 0 -1 + 1384 35 1 5.5334 -0.7893 4.6219 0 0 -1 + 1385 35 1 4.8434 -1.3113 4.1711 0 0 -1 + 1386 35 1 3.9277 -1.5242 3.8489 0 0 -1 + 1387 35 1 3.4956 -0.7837 3.3559 0 0 -1 + 1388 35 1 2.6452 -0.5255 3.2392 0 0 -1 + 1389 35 1 2.7067 0.4274 3.1816 0 0 -1 + 1390 35 1 2.7826 1.1593 3.8184 0 0 -1 + 1391 35 1 2.9814 0.8689 4.6893 0 0 -1 + 1392 35 1 2.3349 0.3427 5.2377 0 0 -1 + 1393 35 1 2.0124 -0.4739 4.8539 0 0 -1 + 1394 35 1 1.8862 -1.1274 4.1457 0 0 -1 + 1395 35 1 1.2452 -0.5079 3.7714 0 0 -1 + 1396 35 1 0.6321 0.1662 3.5852 0 0 -1 + 1397 35 1 0.5772 1.1138 3.2520 0 0 -1 + 1398 35 1 0.0790 0.3730 2.7546 0 0 -1 + 1399 35 1 0.4436 1.0913 2.1893 0 0 -1 + 1400 35 1 1.2378 0.7045 1.8813 0 0 -1 + 1401 36 2 -0.2287 -0.3096 6.6549 0 0 0 + 1402 36 2 -0.4463 0.4412 7.1150 0 0 0 + 1403 36 2 -1.3455 0.2952 7.2860 0 0 0 + 1404 36 2 -2.2059 0.7251 7.0747 0 0 0 + 1405 36 2 -1.9118 0.2048 6.3405 0 0 0 + 1406 36 2 -1.7675 1.1329 6.2385 0 0 0 + 1407 36 2 -2.0690 2.0222 6.3552 0 0 0 + 1408 36 2 -2.3845 2.8102 6.8574 0 0 0 + 1409 36 2 -2.8743 2.6080 7.6803 0 0 0 + 1410 36 2 -3.7085 2.7763 8.0591 0 0 0 + 1411 36 2 -4.2924 2.1569 -8.0523 0 0 1 + 1412 36 2 -5.0301 1.6496 -7.7493 0 0 1 + 1413 36 2 -4.6042 1.8749 -6.9621 0 0 1 + 1414 36 2 -4.0668 1.8532 -6.1971 0 0 1 + 1415 36 2 -4.1067 1.1565 -5.5130 0 0 1 + 1416 36 2 -3.6899 1.8879 -5.0768 0 0 1 + 1417 36 2 -4.0240 2.7062 -4.7223 0 0 1 + 1418 36 2 -3.4255 3.4282 -4.3468 0 0 1 + 1419 36 2 -3.7901 4.1616 -3.8724 0 0 1 + 1420 36 2 -4.1536 3.9423 -2.9404 0 0 1 + 1421 36 2 -4.5804 4.5809 -2.4126 0 0 1 + 1422 36 2 -3.6375 4.7810 -2.2666 0 0 1 + 1423 36 2 -3.9575 5.4094 -1.5444 0 0 1 + 1424 36 2 -3.8758 6.3700 -1.9311 0 0 1 + 1425 36 2 -3.1222 6.6318 -2.5061 0 0 1 + 1426 36 2 -2.4920 7.3943 -2.6061 0 0 1 + 1427 36 2 -1.7412 7.8917 -2.2653 0 0 1 + 1428 36 2 -1.6292 7.9646 -1.3756 0 0 1 + 1429 36 2 -0.6903 7.6677 -1.2050 0 0 1 + 1430 36 2 -0.1249 -7.8869 -1.1391 0 1 1 + 1431 36 2 0.4182 -7.1237 -0.9699 0 1 1 + 1432 36 2 1.1716 -7.0720 -0.4392 0 1 1 + 1433 36 2 1.6103 -7.2367 0.4045 0 1 1 + 1434 36 2 1.8270 -7.9085 1.0989 0 1 1 + 1435 36 2 2.6136 8.0014 1.1770 0 0 1 + 1436 36 2 2.7774 7.3740 1.8692 0 0 1 + 1437 36 2 2.2071 6.5811 1.7407 0 0 1 + 1438 36 2 1.4532 5.9359 1.6168 0 0 1 + 1439 36 2 1.6383 5.3742 2.3544 0 0 1 + 1440 36 2 1.9594 5.2903 3.2556 0 0 1 + 1441 37 1 -7.6768 6.7893 -5.1347 0 0 0 + 1442 37 1 -7.4507 5.8697 -5.0645 0 0 0 + 1443 37 1 -6.7082 5.6527 -4.4692 0 0 0 + 1444 37 1 -6.7792 6.5925 -4.1762 0 0 0 + 1445 37 1 -7.2442 6.6922 -3.3589 0 0 0 + 1446 37 1 -6.9943 5.7912 -3.5018 0 0 0 + 1447 37 1 -6.4597 4.9705 -3.7014 0 0 0 + 1448 37 1 -6.2450 4.8239 -2.7791 0 0 0 + 1449 37 1 -5.7483 4.5065 -2.0209 0 0 0 + 1450 37 1 -6.4816 3.9400 -2.2302 0 0 0 + 1451 37 1 -7.3324 4.1696 -1.7704 0 0 0 + 1452 37 1 -8.0461 3.8782 -2.2938 0 0 0 + 1453 37 1 -7.2826 4.2562 -2.7937 0 0 0 + 1454 37 1 -7.6185 4.2443 -3.6484 0 0 0 + 1455 37 1 7.9385 3.7235 -3.5464 -1 0 0 + 1456 37 1 7.7962 3.1546 -2.7747 -1 0 0 + 1457 37 1 7.5695 2.3754 -2.3736 -1 0 0 + 1458 37 1 7.2425 1.8418 -1.6574 -1 0 0 + 1459 37 1 7.1399 2.5751 -1.0520 -1 0 0 + 1460 37 1 6.2552 2.8697 -1.0055 -1 0 0 + 1461 37 1 6.1935 3.7875 -1.2985 -1 0 0 + 1462 37 1 6.6611 4.5841 -1.5927 -1 0 0 + 1463 37 1 7.2392 5.3226 -1.7131 -1 0 0 + 1464 37 1 7.7636 5.7741 -2.3397 -1 0 0 + 1465 37 1 7.6579 6.7914 -2.4334 -1 0 0 + 1466 37 1 8.1295 6.8730 -3.2469 -1 0 0 + 1467 37 1 7.5012 7.2192 -3.9123 -1 0 0 + 1468 37 1 7.5035 7.5087 -4.8261 -1 0 0 + 1469 37 1 6.5772 7.5695 -5.1935 -1 0 0 + 1470 37 1 5.9562 -8.1151 -5.2916 -1 1 0 + 1471 37 1 5.6797 -7.3561 -4.8353 -1 1 0 + 1472 37 1 5.9665 -6.6248 -4.2162 -1 1 0 + 1473 37 1 5.4127 -5.7952 -4.3606 -1 1 0 + 1474 37 1 5.4153 -4.9847 -3.8510 -1 1 0 + 1475 37 1 6.0373 -5.3426 -3.1535 -1 1 0 + 1476 37 1 6.2837 -5.7448 -2.3760 -1 1 0 + 1477 37 1 6.8267 -6.5318 -2.6128 -1 1 0 + 1478 37 1 7.3521 -7.2669 -2.1803 -1 1 0 + 1479 37 1 6.9759 -7.4648 -1.3355 -1 1 0 + 1480 37 1 7.0244 8.1910 -0.8438 -1 0 0 + 1481 38 2 1.6262 -7.7338 -5.6136 0 0 0 + 1482 38 2 1.8553 7.8353 -5.2341 0 -1 0 + 1483 38 2 2.2108 7.4241 -4.3260 0 -1 0 + 1484 38 2 2.2827 7.9419 -3.5497 0 -1 0 + 1485 38 2 1.4705 -8.1156 -3.1458 0 0 0 + 1486 38 2 1.8984 -7.3442 -2.7753 0 0 0 + 1487 38 2 2.7663 -7.6211 -2.4794 0 0 0 + 1488 38 2 3.3286 8.1143 -1.9988 0 -1 0 + 1489 38 2 3.2541 7.4048 -1.3969 0 -1 0 + 1490 38 2 2.3790 7.1135 -1.4671 0 -1 0 + 1491 38 2 1.6417 6.6320 -1.9568 0 -1 0 + 1492 38 2 2.0995 5.9166 -1.6229 0 -1 0 + 1493 38 2 3.0322 6.1630 -1.8010 0 -1 0 + 1494 38 2 3.9666 6.4421 -1.5343 0 -1 0 + 1495 38 2 4.3373 7.2908 -1.6226 0 -1 0 + 1496 38 2 4.8751 7.4219 -0.8355 0 -1 0 + 1497 38 2 5.5541 7.8929 -0.3321 0 -1 0 + 1498 38 2 6.4329 8.0411 -0.0129 0 -1 0 + 1499 38 2 6.0685 7.1921 0.3235 0 -1 0 + 1500 38 2 6.1004 6.2513 0.3501 0 -1 0 + 1501 38 2 6.0469 6.1090 1.3447 0 -1 0 + 1502 38 2 5.4808 5.3455 1.5562 0 -1 0 + 1503 38 2 5.8030 5.1803 0.6617 0 -1 0 + 1504 38 2 4.9496 4.6359 0.6543 0 -1 0 + 1505 38 2 4.3362 5.2111 1.1013 0 -1 0 + 1506 38 2 4.6079 5.6144 1.9351 0 -1 0 + 1507 38 2 4.7526 6.7135 1.9995 0 -1 0 + 1508 38 2 4.8771 7.6848 1.8567 0 -1 0 + 1509 38 2 4.8462 -7.7809 1.5556 0 0 0 + 1510 38 2 4.6495 -7.3523 0.6686 0 0 0 + 1511 38 2 4.6870 -7.2032 -0.3062 0 0 0 + 1512 38 2 5.4567 -7.4937 -0.8514 0 0 0 + 1513 38 2 5.4929 -6.5491 -1.1156 0 0 0 + 1514 38 2 5.9976 -6.4239 -0.3486 0 0 0 + 1515 38 2 6.4112 -7.3022 -0.3325 0 0 0 + 1516 38 2 7.2811 -7.5930 0.0465 0 0 0 + 1517 38 2 7.8139 -7.5126 -0.7500 0 0 0 + 1518 38 2 -8.1639 -7.3838 -1.6244 1 0 0 + 1519 38 2 8.1274 -7.8838 -2.4608 0 0 0 + 1520 38 2 7.8787 -7.2076 -3.1252 0 0 0 + 1521 39 1 -3.5941 0.1628 -7.3327 0 0 0 + 1522 39 1 -3.0208 0.9217 -7.2859 0 0 0 + 1523 39 1 -2.1712 1.4990 -7.2565 0 0 0 + 1524 39 1 -1.4173 1.4127 -7.7872 0 0 0 + 1525 39 1 -1.0781 1.2784 7.7853 0 0 -1 + 1526 39 1 -1.0602 1.4272 6.8606 0 0 -1 + 1527 39 1 -0.2123 1.8170 6.7634 0 0 -1 + 1528 39 1 0.6348 2.1954 7.1088 0 0 -1 + 1529 39 1 1.0064 2.1185 7.9368 0 0 -1 + 1530 39 1 0.5113 2.9026 7.8996 0 0 -1 + 1531 39 1 0.9668 3.3192 7.2758 0 0 -1 + 1532 39 1 0.5481 4.2144 7.2406 0 0 -1 + 1533 39 1 0.2836 4.7296 6.4692 0 0 -1 + 1534 39 1 -0.2649 4.5881 5.7376 0 0 -1 + 1535 39 1 -0.5840 4.3785 4.7419 0 0 -1 + 1536 39 1 -1.5757 4.3522 4.6625 0 0 -1 + 1537 39 1 -2.4630 4.2993 5.0467 0 0 -1 + 1538 39 1 -3.3150 4.2221 4.5639 0 0 -1 + 1539 39 1 -3.1731 3.2384 4.4634 0 0 -1 + 1540 39 1 -4.0874 3.3709 4.2459 0 0 -1 + 1541 39 1 -4.4588 3.6254 5.1359 0 0 -1 + 1542 39 1 -4.7227 2.7186 5.2808 0 0 -1 + 1543 39 1 -4.0889 2.4940 6.0053 0 0 -1 + 1544 39 1 -3.5160 2.7506 6.8038 0 0 -1 + 1545 39 1 -3.2189 3.6247 6.7466 0 0 -1 + 1546 39 1 -3.2208 3.8093 7.7169 0 0 -1 + 1547 39 1 -2.2950 3.5873 7.7873 0 0 -1 + 1548 39 1 -1.7018 2.9412 8.1169 0 0 -1 + 1549 39 1 -1.7298 2.3939 -7.5165 0 0 0 + 1550 39 1 -1.8887 2.3712 -6.5574 0 0 0 + 1551 39 1 -0.9285 2.4482 -6.6955 0 0 0 + 1552 39 1 -0.0887 2.1188 -6.5766 0 0 0 + 1553 39 1 0.5940 1.4508 -6.2836 0 0 0 + 1554 39 1 1.3980 1.7025 -5.8932 0 0 0 + 1555 39 1 2.0799 1.1018 -6.2630 0 0 0 + 1556 39 1 2.7245 1.8129 -6.1154 0 0 0 + 1557 39 1 3.2605 2.5230 -6.1241 0 0 0 + 1558 39 1 2.8839 2.9913 -5.4186 0 0 0 + 1559 39 1 3.2666 3.8169 -5.0578 0 0 0 + 1560 39 1 4.1713 4.0971 -5.1054 0 0 0 + 1561 40 2 5.1484 6.5758 3.2338 0 0 0 + 1562 40 2 4.2584 6.7042 2.9981 0 0 0 + 1563 40 2 4.3077 5.9356 3.5833 0 0 0 + 1564 40 2 4.1232 5.3284 2.8474 0 0 0 + 1565 40 2 3.7241 4.4956 2.5406 0 0 0 + 1566 40 2 4.3446 4.3550 1.8082 0 0 0 + 1567 40 2 5.2719 4.2473 1.6688 0 0 0 + 1568 40 2 6.2010 4.2828 1.5943 0 0 0 + 1569 40 2 7.2855 4.3320 1.7297 0 0 0 + 1570 40 2 7.7573 5.1296 1.2643 0 0 0 + 1571 40 2 -8.1481 4.5108 1.7741 1 0 0 + 1572 40 2 -7.9213 4.7290 2.6803 1 0 0 + 1573 40 2 -7.5849 4.1041 3.3228 1 0 0 + 1574 40 2 -7.4256 4.2021 4.2907 1 0 0 + 1575 40 2 -7.0015 4.7123 5.0427 1 0 0 + 1576 40 2 -6.8654 5.2370 5.8782 1 0 0 + 1577 40 2 -6.4043 4.6291 6.4598 1 0 0 + 1578 40 2 -7.0322 4.2527 7.1547 1 0 0 + 1579 40 2 -6.9860 3.4465 7.6128 1 0 0 + 1580 40 2 -6.6749 2.5668 7.4061 1 0 0 + 1581 40 2 -5.9698 3.0349 6.9513 1 0 0 + 1582 40 2 -6.0625 3.9374 7.1919 1 0 0 + 1583 40 2 -5.1560 3.9270 7.6179 1 0 0 + 1584 40 2 -4.8100 3.0672 7.9278 1 0 0 + 1585 40 2 -5.2632 2.6453 -7.8094 1 0 1 + 1586 40 2 -5.8155 2.1841 -7.1705 1 0 1 + 1587 40 2 -5.5620 2.3413 -6.2587 1 0 1 + 1588 40 2 -6.2120 1.6834 -5.8894 1 0 1 + 1589 40 2 -6.7314 1.6288 -6.6601 1 0 1 + 1590 40 2 -7.0055 1.2188 -7.4469 1 0 1 + 1591 40 2 -7.1647 1.2247 7.8996 1 0 0 + 1592 40 2 -7.2899 0.2911 7.7167 1 0 0 + 1593 40 2 -6.6115 -0.4521 7.4703 1 0 0 + 1594 40 2 -5.7394 -0.6674 7.6212 1 0 0 + 1595 40 2 -4.8986 -0.5339 8.1020 1 0 0 + 1596 40 2 -4.2964 0.1854 7.8492 1 0 0 + 1597 40 2 -3.4032 0.0949 7.4226 1 0 0 + 1598 40 2 -3.4686 0.9380 7.8357 1 0 0 + 1599 40 2 -3.9038 1.2665 -7.7917 1 0 1 + 1600 40 2 -4.0352 1.1382 -6.8857 1 0 1 + 1601 41 1 3.8411 4.1552 -3.6346 0 0 0 + 1602 41 1 4.7759 4.3472 -4.1432 0 0 0 + 1603 41 1 5.0187 5.1409 -4.6770 0 0 0 + 1604 41 1 4.1179 5.4516 -4.4336 0 0 0 + 1605 41 1 4.1247 5.9399 -3.6672 0 0 0 + 1606 41 1 4.3542 5.8699 -2.8071 0 0 0 + 1607 41 1 5.1691 5.6010 -2.4558 0 0 0 + 1608 41 1 6.0859 5.2725 -2.5349 0 0 0 + 1609 41 1 6.9248 5.1177 -2.9484 0 0 0 + 1610 41 1 7.4177 5.0466 -3.7679 0 0 0 + 1611 41 1 7.7958 4.4573 -4.3316 0 0 0 + 1612 41 1 -7.8421 3.9724 -4.6341 1 0 0 + 1613 41 1 -6.9382 4.2623 -4.5953 1 0 0 + 1614 41 1 -6.5331 3.9012 -3.7752 1 0 0 + 1615 41 1 -6.8979 3.3452 -3.1082 1 0 0 + 1616 41 1 -7.1779 3.1319 -2.2177 1 0 0 + 1617 41 1 -6.9805 3.1886 -1.2613 1 0 0 + 1618 41 1 -6.2995 3.4873 -0.5977 1 0 0 + 1619 41 1 -6.4033 4.2817 -1.0838 1 0 0 + 1620 41 1 -6.7698 5.0292 -1.6805 1 0 0 + 1621 41 1 -7.2913 5.8024 -2.0194 1 0 0 + 1622 41 1 -7.8259 6.5583 -2.2911 1 0 0 + 1623 41 1 -8.1597 7.4314 -1.9481 1 0 0 + 1624 41 1 -8.0739 7.9459 -1.0750 1 0 0 + 1625 41 1 -7.5134 -7.7429 -0.7283 1 1 0 + 1626 41 1 -7.3144 -6.8450 -0.4019 1 1 0 + 1627 41 1 -7.4301 -6.1072 0.1407 1 1 0 + 1628 41 1 -7.6729 -6.5247 0.9492 1 1 0 + 1629 41 1 -6.6873 -6.6661 0.9960 1 1 0 + 1630 41 1 -5.9395 -6.8219 1.5682 1 1 0 + 1631 41 1 -6.0667 -7.7402 1.8955 1 1 0 + 1632 41 1 -5.7418 -7.7082 2.8010 1 1 0 + 1633 41 1 -5.7043 7.7583 3.0952 1 0 0 + 1634 41 1 -6.4336 7.1498 3.2049 1 0 0 + 1635 41 1 -6.0793 6.9050 2.3050 1 0 0 + 1636 41 1 -6.6793 6.8513 1.4136 1 0 0 + 1637 41 1 -7.1115 6.5122 2.2175 1 0 0 + 1638 41 1 -7.2253 5.9916 3.0072 1 0 0 + 1639 41 1 -6.9222 6.0662 3.9414 1 0 0 + 1640 41 1 -6.5720 5.7459 4.8019 1 0 0 + 1641 42 2 -6.1782 4.0638 -8.2021 0 0 0 + 1642 42 2 -5.9249 3.1611 7.9770 0 0 -1 + 1643 42 2 -5.4200 2.4365 7.5178 0 0 -1 + 1644 42 2 -5.9076 1.5973 7.3205 0 0 -1 + 1645 42 2 -6.4148 0.7781 7.4163 0 0 -1 + 1646 42 2 -6.4354 0.7290 6.5136 0 0 -1 + 1647 42 2 -6.5908 0.8042 5.5809 0 0 -1 + 1648 42 2 -6.9058 0.3251 4.8200 0 0 -1 + 1649 42 2 -6.4957 -0.3410 4.2257 0 0 -1 + 1650 42 2 -5.7026 -0.8078 4.0968 0 0 -1 + 1651 42 2 -5.9337 -1.8013 4.0953 0 0 -1 + 1652 42 2 -5.2746 -2.4454 4.5612 0 0 -1 + 1653 42 2 -5.0874 -2.7710 5.4128 0 0 -1 + 1654 42 2 -4.1898 -2.5215 5.5233 0 0 -1 + 1655 42 2 -4.2298 -1.8951 4.7696 0 0 -1 + 1656 42 2 -3.6780 -1.5211 4.1160 0 0 -1 + 1657 42 2 -2.7480 -1.3949 4.1502 0 0 -1 + 1658 42 2 -2.2549 -1.8633 4.8084 0 0 -1 + 1659 42 2 -2.1260 -1.4290 5.6492 0 0 -1 + 1660 42 2 -2.8489 -1.5713 6.2579 0 0 -1 + 1661 42 2 -3.3335 -2.2627 6.7226 0 0 -1 + 1662 42 2 -3.4442 -1.5306 7.3258 0 0 -1 + 1663 42 2 -3.0996 -1.6747 8.1988 0 0 -1 + 1664 42 2 -2.8324 -2.3470 -7.6406 0 0 0 + 1665 42 2 -3.6849 -2.7474 -7.4487 0 0 0 + 1666 42 2 -3.6947 -3.4975 -6.8384 0 0 0 + 1667 42 2 -4.1358 -3.4550 -5.9822 0 0 0 + 1668 42 2 -4.9124 -3.1528 -5.5058 0 0 0 + 1669 42 2 -5.0514 -2.3132 -4.9119 0 0 0 + 1670 42 2 -4.5495 -1.6767 -5.3295 0 0 0 + 1671 42 2 -3.8095 -1.0609 -5.0477 0 0 0 + 1672 42 2 -3.3034 -1.2629 -4.2402 0 0 0 + 1673 42 2 -2.8637 -1.7576 -4.9453 0 0 0 + 1674 42 2 -2.2398 -2.3973 -4.6438 0 0 0 + 1675 42 2 -2.3107 -3.3429 -4.5569 0 0 0 + 1676 42 2 -2.4033 -3.0383 -3.6760 0 0 0 + 1677 42 2 -1.9107 -2.1782 -3.5723 0 0 0 + 1678 42 2 -1.7259 -1.4351 -4.0977 0 0 0 + 1679 42 2 -2.3477 -0.6934 -4.1338 0 0 0 + 1680 42 2 -2.0362 0.1301 -3.6557 0 0 0 + 1681 43 1 3.1026 -6.6714 -0.2992 0 0 0 + 1682 43 1 3.2189 -5.9432 0.3643 0 0 0 + 1683 43 1 3.1742 -5.8345 1.3151 0 0 0 + 1684 43 1 3.6327 -5.4751 2.0459 0 0 0 + 1685 43 1 3.5935 -4.8252 2.6944 0 0 0 + 1686 43 1 4.1944 -4.5598 2.0278 0 0 0 + 1687 43 1 5.1012 -4.8248 2.0924 0 0 0 + 1688 43 1 5.5750 -5.5289 2.4934 0 0 0 + 1689 43 1 5.8044 -4.9193 3.2616 0 0 0 + 1690 43 1 6.3202 -4.2634 3.7405 0 0 0 + 1691 43 1 6.2838 -3.5447 3.0816 0 0 0 + 1692 43 1 6.8832 -4.0329 2.4180 0 0 0 + 1693 43 1 7.2778 -3.2439 2.9037 0 0 0 + 1694 43 1 8.1103 -2.8264 3.0404 0 0 0 + 1695 43 1 -7.8752 -2.0655 2.7445 1 0 0 + 1696 43 1 -7.4160 -1.2722 2.6485 1 0 0 + 1697 43 1 -6.7480 -0.7727 3.0707 1 0 0 + 1698 43 1 -6.7194 -1.2273 3.8716 1 0 0 + 1699 43 1 -6.8707 -1.7629 4.7070 1 0 0 + 1700 43 1 -6.6565 -1.6771 5.6405 1 0 0 + 1701 43 1 -6.0965 -2.2170 6.0443 1 0 0 + 1702 43 1 -5.2781 -2.4051 6.4823 1 0 0 + 1703 43 1 -5.4839 -3.2578 6.0937 1 0 0 + 1704 43 1 -6.1562 -3.8476 5.7571 1 0 0 + 1705 43 1 -6.6391 -4.5840 5.5145 1 0 0 + 1706 43 1 -6.9219 -5.4674 5.5116 1 0 0 + 1707 43 1 -6.9197 -6.3870 4.9140 1 0 0 + 1708 43 1 -7.1772 -7.1116 4.4712 1 0 0 + 1709 43 1 -7.0971 -8.0237 4.1757 1 0 0 + 1710 43 1 -7.2457 7.6612 3.6870 1 -1 0 + 1711 43 1 -7.7011 6.8851 3.4903 1 -1 0 + 1712 43 1 7.8543 6.5594 3.7122 0 -1 0 + 1713 43 1 7.3780 6.1442 2.9679 0 -1 0 + 1714 43 1 8.0285 5.6551 2.4208 0 -1 0 + 1715 43 1 -8.1937 5.6627 3.3531 1 -1 0 + 1716 43 1 -7.5210 5.1709 3.8531 1 -1 0 + 1717 43 1 8.0397 4.7652 3.9914 0 -1 0 + 1718 43 1 7.2701 4.5727 3.4944 0 -1 0 + 1719 43 1 7.5938 4.1718 2.7047 0 -1 0 + 1720 43 1 7.8961 3.4621 2.1048 0 -1 0 + 1721 44 2 -3.4106 -0.3385 0.6545 0 0 0 + 1722 44 2 -3.3033 -0.5771 -0.2436 0 0 0 + 1723 44 2 -2.9173 0.1939 -0.6531 0 0 0 + 1724 44 2 -2.7333 1.1663 -0.6597 0 0 0 + 1725 44 2 -2.6681 1.9342 -1.2542 0 0 0 + 1726 44 2 -2.3630 1.5323 -1.9970 0 0 0 + 1727 44 2 -2.0145 2.4476 -1.9823 0 0 0 + 1728 44 2 -2.4612 2.9102 -2.6775 0 0 0 + 1729 44 2 -2.1133 3.7887 -2.8123 0 0 0 + 1730 44 2 -1.6921 4.3829 -2.2615 0 0 0 + 1731 44 2 -1.5047 5.2459 -2.6238 0 0 0 + 1732 44 2 -1.4611 6.1055 -3.1176 0 0 0 + 1733 44 2 -0.7019 5.6254 -3.4643 0 0 0 + 1734 44 2 -0.5183 6.2549 -4.2573 0 0 0 + 1735 44 2 -0.6024 7.0354 -4.7796 0 0 0 + 1736 44 2 -1.5998 7.2420 -4.6736 0 0 0 + 1737 44 2 -2.4625 6.9654 -5.0470 0 0 0 + 1738 44 2 -3.0617 6.6905 -5.6933 0 0 0 + 1739 44 2 -3.8372 6.9456 -5.2416 0 0 0 + 1740 44 2 -3.6602 7.5210 -4.4843 0 0 0 + 1741 44 2 -2.9087 6.9343 -4.1540 0 0 0 + 1742 44 2 -2.1815 6.8723 -3.4733 0 0 0 + 1743 44 2 -1.3025 7.2371 -3.6346 0 0 0 + 1744 44 2 -1.6078 8.1461 -3.2640 0 0 0 + 1745 44 2 -2.4307 -8.0383 -2.9558 0 1 0 + 1746 44 2 -3.2597 8.1136 -2.5961 0 0 0 + 1747 44 2 -3.6678 7.3759 -2.1953 0 0 0 + 1748 44 2 -4.2800 7.7192 -2.8090 0 0 0 + 1749 44 2 -4.7053 7.5951 -3.6425 0 0 0 + 1750 44 2 -4.6785 7.1652 -4.5188 0 0 0 + 1751 44 2 -4.5939 7.6317 -5.3645 0 0 0 + 1752 44 2 -4.7678 7.0844 -6.1035 0 0 0 + 1753 44 2 -4.9881 7.4220 -6.9695 0 0 0 + 1754 44 2 -4.9295 6.7992 -7.6127 0 0 0 + 1755 44 2 -5.3097 6.2535 8.1851 0 0 -1 + 1756 44 2 -5.3551 6.1413 7.1931 0 0 -1 + 1757 44 2 -4.8622 6.6091 6.5319 0 0 -1 + 1758 44 2 -5.4720 6.3969 5.8442 0 0 -1 + 1759 44 2 -6.0216 6.5835 5.0839 0 0 -1 + 1760 44 2 -6.5549 7.0890 4.3884 0 0 -1 + 1761 45 1 -4.9266 -7.8814 -7.2710 0 0 0 + 1762 45 1 -5.6916 8.0536 -7.4910 0 -1 0 + 1763 45 1 -5.9097 -7.6860 -6.8862 0 0 0 + 1764 45 1 -5.5398 -6.7905 -7.1421 0 0 0 + 1765 45 1 -5.4762 -6.2472 -7.9075 0 0 0 + 1766 45 1 -4.6838 -6.8096 -7.9382 0 0 0 + 1767 45 1 -4.2626 -6.8795 -7.0993 0 0 0 + 1768 45 1 -3.5906 -6.2560 -6.8806 0 0 0 + 1769 45 1 -2.8736 -5.6540 -6.5602 0 0 0 + 1770 45 1 -2.4426 -5.0651 -5.9834 0 0 0 + 1771 45 1 -2.4310 -4.2797 -5.4547 0 0 0 + 1772 45 1 -2.8534 -4.7403 -4.7634 0 0 0 + 1773 45 1 -3.1699 -5.1456 -4.0054 0 0 0 + 1774 45 1 -3.6551 -5.7575 -4.5567 0 0 0 + 1775 45 1 -3.1436 -6.5642 -4.6055 0 0 0 + 1776 45 1 -2.3543 -6.9341 -5.0249 0 0 0 + 1777 45 1 -1.7061 -7.2961 -5.7519 0 0 0 + 1778 45 1 -1.4997 -7.9407 -6.4279 0 0 0 + 1779 45 1 -1.7414 7.8376 -7.0625 0 -1 0 + 1780 45 1 -2.0958 7.4670 -6.2460 0 -1 0 + 1781 45 1 -2.6923 7.7615 -5.6460 0 -1 0 + 1782 45 1 -2.3109 -7.9752 -5.0782 0 0 0 + 1783 45 1 -1.3784 -8.1115 -5.2780 0 0 0 + 1784 45 1 -1.2136 7.4078 -5.7285 0 -1 0 + 1785 45 1 -1.7444 6.5968 -5.8170 0 -1 0 + 1786 45 1 -1.1540 6.2498 -5.2094 0 -1 0 + 1787 45 1 -1.1303 5.3243 -4.8247 0 -1 0 + 1788 45 1 -2.0083 5.0777 -4.7558 0 -1 0 + 1789 45 1 -2.9175 4.9370 -4.6265 0 -1 0 + 1790 45 1 -3.8889 4.8350 -4.6829 0 -1 0 + 1791 45 1 -4.7565 4.4822 -4.8634 0 -1 0 + 1792 45 1 -4.2119 3.7417 -4.9971 0 -1 0 + 1793 45 1 -4.2681 3.9036 -5.9274 0 -1 0 + 1794 45 1 -4.1758 4.5775 -6.6680 0 -1 0 + 1795 45 1 -3.8599 5.4484 -6.8713 0 -1 0 + 1796 45 1 -4.8367 5.4206 -7.0781 0 -1 0 + 1797 45 1 -5.5678 5.3688 -7.6741 0 -1 0 + 1798 45 1 -5.4642 4.9165 7.9410 0 -1 -1 + 1799 45 1 -6.2927 5.0490 7.4439 0 -1 -1 + 1800 45 1 -7.0449 5.4109 6.9169 0 -1 -1 + 1801 46 2 -5.0734 7.5316 -0.3499 0 0 0 + 1802 46 2 -5.2719 7.8281 -1.2529 0 0 0 + 1803 46 2 -5.0214 -7.9469 -1.8774 0 1 0 + 1804 46 2 -4.3312 -7.6413 -2.4997 0 1 0 + 1805 46 2 -5.1972 -7.8289 -2.8721 0 1 0 + 1806 46 2 -5.4596 -8.0687 -3.7145 0 1 0 + 1807 46 2 -5.7066 7.6529 -4.2796 0 0 0 + 1808 46 2 -5.6931 6.7716 -3.9927 0 0 0 + 1809 46 2 -5.9227 5.9074 -3.7542 0 0 0 + 1810 46 2 -5.4668 5.6649 -3.0010 0 0 0 + 1811 46 2 -4.6632 5.8968 -2.4222 0 0 0 + 1812 46 2 -4.1567 5.4296 -3.0748 0 0 0 + 1813 46 2 -3.5212 5.1852 -3.6929 0 0 0 + 1814 46 2 -2.8912 5.8662 -3.9581 0 0 0 + 1815 46 2 -2.5520 5.8796 -3.1025 0 0 0 + 1816 46 2 -2.0864 6.0010 -2.2059 0 0 0 + 1817 46 2 -2.0788 5.2508 -1.6313 0 0 0 + 1818 46 2 -2.6659 4.5579 -1.6752 0 0 0 + 1819 46 2 -3.0493 3.9078 -2.1747 0 0 0 + 1820 46 2 -3.1290 3.9178 -3.1621 0 0 0 + 1821 46 2 -2.4388 3.5815 -3.7168 0 0 0 + 1822 46 2 -1.6341 3.0635 -3.8064 0 0 0 + 1823 46 2 -1.2418 3.9532 -3.8469 0 0 0 + 1824 46 2 -1.8643 4.1238 -4.5160 0 0 0 + 1825 46 2 -2.4272 4.2211 -5.3349 0 0 0 + 1826 46 2 -2.2434 3.2709 -5.3844 0 0 0 + 1827 46 2 -1.3919 2.9138 -5.7560 0 0 0 + 1828 46 2 -0.5906 2.3963 -5.6612 0 0 0 + 1829 46 2 -0.8982 1.5417 -5.9970 0 0 0 + 1830 46 2 -1.7761 1.8046 -5.6164 0 0 0 + 1831 46 2 -2.0665 1.3630 -4.7865 0 0 0 + 1832 46 2 -2.9463 1.4318 -4.3533 0 0 0 + 1833 46 2 -3.6084 0.7454 -4.5125 0 0 0 + 1834 46 2 -4.1523 0.1391 -4.0850 0 0 0 + 1835 46 2 -4.7853 -0.5558 -4.0503 0 0 0 + 1836 46 2 -4.8225 -0.2681 -5.0089 0 0 0 + 1837 46 2 -5.2194 0.6267 -5.1452 0 0 0 + 1838 46 2 -5.6539 1.3977 -4.9418 0 0 0 + 1839 46 2 -5.6221 1.8203 -4.1154 0 0 0 + 1840 46 2 -6.1786 2.3169 -3.5213 0 0 0 + 1841 47 1 4.0372 -5.4311 3.5153 0 0 0 + 1842 47 1 3.8396 -4.7442 4.1617 0 0 0 + 1843 47 1 3.5098 -4.1710 3.4376 0 0 0 + 1844 47 1 3.8390 -3.4590 2.8270 0 0 0 + 1845 47 1 4.7546 -3.3806 2.6944 0 0 0 + 1846 47 1 5.2035 -3.3399 3.5734 0 0 0 + 1847 47 1 5.4228 -3.7441 4.3328 0 0 0 + 1848 47 1 5.7688 -4.1997 5.1025 0 0 0 + 1849 47 1 5.4999 -4.4422 5.9703 0 0 0 + 1850 47 1 5.7639 -3.9384 6.7484 0 0 0 + 1851 47 1 5.7824 -3.5249 7.6170 0 0 0 + 1852 47 1 5.8787 -2.6491 8.0564 0 0 0 + 1853 47 1 5.3909 -1.9476 -7.8926 0 0 1 + 1854 47 1 5.9140 -1.2419 8.1591 0 0 0 + 1855 47 1 6.8253 -0.9041 8.1743 0 0 0 + 1856 47 1 7.3073 -0.4056 -7.5522 0 0 1 + 1857 47 1 6.8346 0.1837 -6.9397 0 0 1 + 1858 47 1 7.4189 -0.0101 -6.1767 0 0 1 + 1859 47 1 8.1319 -0.6638 -6.0268 0 0 1 + 1860 47 1 -7.9139 -1.3801 -5.5417 1 0 1 + 1861 47 1 -7.1808 -1.9357 -5.2996 1 0 1 + 1862 47 1 -6.2654 -2.0831 -5.5055 1 0 1 + 1863 47 1 -5.4899 -2.0088 -6.0590 1 0 1 + 1864 47 1 -4.7162 -1.6702 -6.5209 1 0 1 + 1865 47 1 -4.5809 -2.6158 -6.5291 1 0 1 + 1866 47 1 -4.6708 -3.5086 -6.9437 1 0 1 + 1867 47 1 -4.2819 -4.3534 -6.6539 1 0 1 + 1868 47 1 -3.5720 -4.9585 -7.0711 1 0 1 + 1869 47 1 -3.5100 -4.7696 -6.1491 1 0 1 + 1870 47 1 -2.8354 -4.1971 -6.5649 1 0 1 + 1871 47 1 -3.1075 -3.5929 -5.9117 1 0 1 + 1872 47 1 -3.4290 -3.6169 -4.8968 1 0 1 + 1873 47 1 -3.2943 -2.7736 -4.4300 1 0 1 + 1874 47 1 -3.9330 -2.1146 -4.2322 1 0 1 + 1875 47 1 -4.7399 -1.6895 -4.1317 1 0 1 + 1876 47 1 -4.9011 -1.3787 -3.2777 1 0 1 + 1877 47 1 -4.9515 -0.6124 -2.6964 1 0 1 + 1878 47 1 -4.6618 0.0720 -2.1079 1 0 1 + 1879 47 1 -4.8633 0.0536 -1.1540 1 0 1 + 1880 47 1 -3.9142 0.3294 -1.2998 1 0 1 + 1881 48 2 5.5604 -4.0450 2.5597 0 0 0 + 1882 48 2 5.9687 -4.4908 1.8495 0 0 0 + 1883 48 2 5.2428 -4.1243 1.2759 0 0 0 + 1884 48 2 4.3590 -4.3252 0.9307 0 0 0 + 1885 48 2 3.8359 -5.0487 1.0735 0 0 0 + 1886 48 2 3.2781 -4.6394 0.3692 0 0 0 + 1887 48 2 2.3503 -4.2660 0.2865 0 0 0 + 1888 48 2 1.9453 -3.6522 0.9902 0 0 0 + 1889 48 2 1.1626 -3.2826 1.2991 0 0 0 + 1890 48 2 0.5285 -2.5793 1.0078 0 0 0 + 1891 48 2 1.2812 -1.9849 1.0635 0 0 0 + 1892 48 2 0.7533 -1.3335 0.5966 0 0 0 + 1893 48 2 1.2147 -1.7298 -0.1436 0 0 0 + 1894 48 2 2.1344 -2.0638 -0.0780 0 0 0 + 1895 48 2 2.7107 -1.3587 0.2974 0 0 0 + 1896 48 2 3.2149 -0.6337 0.6668 0 0 0 + 1897 48 2 2.9941 -0.2828 1.5733 0 0 0 + 1898 48 2 3.4645 -0.3800 2.4473 0 0 0 + 1899 48 2 3.3203 0.5027 2.2683 0 0 0 + 1900 48 2 3.9305 1.2057 2.4907 0 0 0 + 1901 48 2 3.9097 2.1046 2.5775 0 0 0 + 1902 48 2 3.6335 2.9223 2.2402 0 0 0 + 1903 48 2 3.1909 3.7791 1.9131 0 0 0 + 1904 48 2 3.4556 4.3352 1.1222 0 0 0 + 1905 48 2 2.7582 4.4892 0.5075 0 0 0 + 1906 48 2 2.6728 4.3720 -0.3976 0 0 0 + 1907 48 2 2.6877 3.8905 -1.2136 0 0 0 + 1908 48 2 3.4323 3.7544 -1.7870 0 0 0 + 1909 48 2 4.3030 4.2557 -1.5666 0 0 0 + 1910 48 2 4.7522 4.5932 -2.3263 0 0 0 + 1911 48 2 5.3080 4.2348 -3.0073 0 0 0 + 1912 48 2 6.2097 4.0788 -2.8362 0 0 0 + 1913 48 2 6.5609 3.3752 -3.3798 0 0 0 + 1914 48 2 7.2197 2.8865 -3.8320 0 0 0 + 1915 48 2 7.5423 2.1580 -4.3181 0 0 0 + 1916 48 2 7.8261 1.8086 -3.4782 0 0 0 + 1917 48 2 8.0460 0.8895 -3.2968 0 0 0 + 1918 48 2 -7.5878 0.7733 -2.8593 1 0 0 + 1919 48 2 -7.1484 0.4114 -3.6581 1 0 0 + 1920 48 2 -7.6254 0.4736 -4.4389 1 0 0 + 1921 49 1 -3.2336 -3.8108 3.8502 0 0 0 + 1922 49 1 -3.6852 -3.5671 4.7024 0 0 0 + 1923 49 1 -4.6033 -3.4409 4.9636 0 0 0 + 1924 49 1 -5.5384 -3.6745 4.8493 0 0 0 + 1925 49 1 -5.8645 -3.7823 3.9552 0 0 0 + 1926 49 1 -6.0210 -4.6346 3.5206 0 0 0 + 1927 49 1 -6.0247 -5.4106 3.9748 0 0 0 + 1928 49 1 -6.4274 -6.3685 3.8191 0 0 0 + 1929 49 1 -6.4003 -7.3163 3.8117 0 0 0 + 1930 49 1 -6.9096 -7.5405 3.0281 0 0 0 + 1931 49 1 -6.3819 -6.6628 2.8463 0 0 0 + 1932 49 1 -6.5092 -5.6828 2.8083 0 0 0 + 1933 49 1 -6.0236 -4.9484 2.4346 0 0 0 + 1934 49 1 -6.5962 -4.3574 1.9415 0 0 0 + 1935 49 1 -6.5184 -3.5144 1.4515 0 0 0 + 1936 49 1 -6.8107 -2.5398 1.5534 0 0 0 + 1937 49 1 -6.6342 -1.7354 1.9324 0 0 0 + 1938 49 1 -5.6455 -1.9978 2.1662 0 0 0 + 1939 49 1 -4.7746 -1.7208 2.0526 0 0 0 + 1940 49 1 -5.3154 -0.9070 2.1239 0 0 0 + 1941 49 1 -5.3627 -1.3682 1.2361 0 0 0 + 1942 49 1 -6.0149 -2.0111 0.9432 0 0 0 + 1943 49 1 -5.6063 -2.8799 1.2338 0 0 0 + 1944 49 1 -4.8072 -2.2359 1.0783 0 0 0 + 1945 49 1 -3.9195 -1.8692 1.0119 0 0 0 + 1946 49 1 -3.0800 -1.5893 0.6752 0 0 0 + 1947 49 1 -2.3457 -2.1933 0.3433 0 0 0 + 1948 49 1 -2.1825 -2.4463 -0.6220 0 0 0 + 1949 49 1 -2.2167 -2.6163 -1.5458 0 0 0 + 1950 49 1 -1.8533 -3.3541 -2.0711 0 0 0 + 1951 49 1 -1.4946 -4.0298 -2.6181 0 0 0 + 1952 49 1 -0.5987 -4.2851 -2.8035 0 0 0 + 1953 49 1 0.2847 -4.1054 -3.0282 0 0 0 + 1954 49 1 0.9979 -4.4964 -3.4521 0 0 0 + 1955 49 1 1.8552 -4.8014 -3.7785 0 0 0 + 1956 49 1 2.2676 -4.3018 -3.0885 0 0 0 + 1957 49 1 2.7500 -4.0274 -2.3037 0 0 0 + 1958 49 1 3.0649 -3.7011 -1.4653 0 0 0 + 1959 49 1 2.9505 -3.8817 -0.5466 0 0 0 + 1960 49 1 2.6630 -4.7629 -0.5789 0 0 0 + 1961 50 2 6.1498 3.5818 -0.1900 0 0 0 + 1962 50 2 7.1252 3.6743 -0.2234 0 0 0 + 1963 50 2 7.4267 4.4367 -0.7327 0 0 0 + 1964 50 2 7.7667 4.5303 -1.5912 0 0 0 + 1965 50 2 -8.0328 4.2108 -0.9752 1 0 0 + 1966 50 2 -7.2321 4.3219 -0.5641 1 0 0 + 1967 50 2 -7.1422 5.2589 -0.0497 1 0 0 + 1968 50 2 -8.1215 5.1427 -0.3926 1 0 0 + 1969 50 2 7.4439 5.5507 -0.6975 0 0 0 + 1970 50 2 7.1692 6.4224 -0.5032 0 0 0 + 1971 50 2 7.1329 7.3099 -0.1246 0 0 0 + 1972 50 2 7.0416 6.7055 0.5897 0 0 0 + 1973 50 2 6.8991 5.7319 0.5194 0 0 0 + 1974 50 2 6.7458 4.7867 0.6418 0 0 0 + 1975 50 2 6.7706 5.2816 1.4749 0 0 0 + 1976 50 2 6.8495 5.1612 2.4625 0 0 0 + 1977 50 2 6.4027 5.6039 3.2477 0 0 0 + 1978 50 2 6.1305 6.4830 3.3082 0 0 0 + 1979 50 2 5.6979 7.3156 3.5356 0 0 0 + 1980 50 2 5.6513 7.2361 2.5520 0 0 0 + 1981 50 2 5.0943 7.9108 2.8617 0 0 0 + 1982 50 2 4.9692 -7.5279 2.8354 0 1 0 + 1983 50 2 4.7868 -6.6690 3.1331 0 1 0 + 1984 50 2 5.1637 -5.8650 3.5928 0 1 0 + 1985 50 2 6.1450 -5.8784 3.5099 0 1 0 + 1986 50 2 6.7702 -5.2378 3.1413 0 1 0 + 1987 50 2 7.6340 -4.8478 3.5021 0 1 0 + 1988 50 2 -7.9268 -4.6769 3.9261 1 1 0 + 1989 50 2 -7.2552 -3.9764 4.0372 1 1 0 + 1990 50 2 -7.5669 -3.2682 3.5791 1 1 0 + 1991 50 2 -7.2080 -3.2593 2.6200 1 1 0 + 1992 50 2 -6.2563 -2.9543 2.5772 1 1 0 + 1993 50 2 -5.3233 -2.8902 2.8246 1 1 0 + 1994 50 2 -5.9965 -2.7817 3.5260 1 1 0 + 1995 50 2 -6.7993 -3.0242 4.0466 1 1 0 + 1996 50 2 -7.4506 -2.8407 4.7783 1 1 0 + 1997 50 2 8.0735 -2.5947 4.8483 0 1 0 + 1998 50 2 7.1702 -2.8045 4.6575 0 1 0 + 1999 50 2 7.3982 -1.9054 4.4658 0 1 0 + 2000 50 2 7.2047 -1.2756 3.8127 0 1 0 + 2001 51 1 6.5959 4.4721 5.7950 0 0 0 + 2002 51 1 7.3918 3.9882 6.1496 0 0 0 + 2003 51 1 7.3064 3.7873 5.2335 0 0 0 + 2004 51 1 6.9838 4.0633 4.4184 0 0 0 + 2005 51 1 6.9447 3.5633 3.5986 0 0 0 + 2006 51 1 6.5105 2.9848 2.9563 0 0 0 + 2007 51 1 6.1751 2.4254 2.2199 0 0 0 + 2008 51 1 5.3745 2.3557 1.7621 0 0 0 + 2009 51 1 4.5722 1.8916 1.6662 0 0 0 + 2010 51 1 3.7248 2.3347 1.4155 0 0 0 + 2011 51 1 3.1478 2.9304 0.9374 0 0 0 + 2012 51 1 2.7135 2.5658 1.7775 0 0 0 + 2013 51 1 2.7670 2.3295 2.6689 0 0 0 + 2014 51 1 2.7331 1.3598 2.8318 0 0 0 + 2015 51 1 3.1265 1.4734 1.9320 0 0 0 + 2016 51 1 3.7226 1.0249 1.2964 0 0 0 + 2017 51 1 3.8092 0.1282 0.8933 0 0 0 + 2018 51 1 3.9925 -0.0037 -0.0743 0 0 0 + 2019 51 1 4.6124 -0.1137 -0.7672 0 0 0 + 2020 51 1 5.4363 -0.1729 -1.2586 0 0 0 + 2021 51 1 5.8863 -0.2894 -0.4135 0 0 0 + 2022 51 1 6.7035 -0.4568 0.0069 0 0 0 + 2023 51 1 7.3719 -1.1295 0.0896 0 0 0 + 2024 51 1 7.9196 -0.7567 -0.6327 0 0 0 + 2025 51 1 7.5853 -0.6603 -1.5456 0 0 0 + 2026 51 1 6.6351 -0.4835 -1.2277 0 0 0 + 2027 51 1 6.2306 -0.0911 -2.0135 0 0 0 + 2028 51 1 6.0064 0.6241 -2.5924 0 0 0 + 2029 51 1 6.1694 0.7581 -3.4989 0 0 0 + 2030 51 1 6.1533 0.7402 -4.4484 0 0 0 + 2031 51 1 6.0450 0.9918 -5.3503 0 0 0 + 2032 51 1 5.1089 1.2345 -5.2004 0 0 0 + 2033 51 1 4.3645 1.0404 -5.8022 0 0 0 + 2034 51 1 3.8347 1.4329 -6.5100 0 0 0 + 2035 51 1 4.5203 1.8703 -7.0584 0 0 0 + 2036 51 1 5.5106 2.1912 -6.9424 0 0 0 + 2037 51 1 6.3876 2.3141 -7.3011 0 0 0 + 2038 51 1 6.8671 2.9308 -7.8711 0 0 0 + 2039 51 1 7.6948 3.1993 8.2083 0 0 -1 + 2040 51 1 -8.0665 3.6479 7.6208 1 0 -1 + 2041 52 2 -6.3218 5.9196 -6.8361 0 0 0 + 2042 52 2 -7.0661 6.3425 -7.2014 0 0 0 + 2043 52 2 -8.0019 6.5106 -7.5397 0 0 0 + 2044 52 2 7.8491 7.1712 -7.0994 -1 0 0 + 2045 52 2 7.2996 7.6073 -6.3772 -1 0 0 + 2046 52 2 7.8475 6.7708 -6.1485 -1 0 0 + 2047 52 2 8.2080 5.9814 -5.6864 -1 0 0 + 2048 52 2 -7.7851 5.1709 -5.6758 0 0 0 + 2049 52 2 -7.3919 4.3805 -5.5660 0 0 0 + 2050 52 2 -7.9684 3.7064 -5.7851 0 0 0 + 2051 52 2 -7.8289 4.3090 -6.5553 0 0 0 + 2052 52 2 -7.3166 5.1087 -6.6768 0 0 0 + 2053 52 2 -6.9653 5.3835 -7.5774 0 0 0 + 2054 52 2 -6.6091 6.0709 -8.1128 0 0 0 + 2055 52 2 -6.3963 6.1081 7.3850 0 0 -1 + 2056 52 2 -6.1121 5.8324 6.4696 0 0 -1 + 2057 52 2 -6.6267 6.1797 5.7459 0 0 -1 + 2058 52 2 -7.1862 6.5235 5.0107 0 0 -1 + 2059 52 2 -7.8607 6.1823 4.3454 0 0 -1 + 2060 52 2 7.8495 5.6444 4.6531 -1 0 -1 + 2061 52 2 -7.7747 5.3656 5.1423 0 0 -1 + 2062 52 2 -7.6827 5.9219 6.0098 0 0 -1 + 2063 52 2 -7.4966 6.8953 5.9517 0 0 -1 + 2064 52 2 -7.3037 7.8208 6.0902 0 0 -1 + 2065 52 2 -7.0041 7.8462 5.2138 0 0 -1 + 2066 52 2 -7.5671 -7.8396 5.0985 0 1 -1 + 2067 52 2 -7.7854 -7.0411 5.6035 0 1 -1 + 2068 52 2 8.1560 -6.4474 6.1421 -1 1 -1 + 2069 52 2 7.3316 -6.8247 6.2719 -1 1 -1 + 2070 52 2 6.8172 -7.6559 6.2348 -1 1 -1 + 2071 52 2 5.8644 -7.8776 6.3821 -1 1 -1 + 2072 52 2 5.3230 -7.7134 7.1758 -1 1 -1 + 2073 52 2 4.9089 -7.3274 7.9488 -1 1 -1 + 2074 52 2 4.6323 -6.4784 7.9880 -1 1 -1 + 2075 52 2 4.8947 -6.1639 -7.5671 -1 1 0 + 2076 52 2 4.1907 -6.3863 -6.9031 -1 1 0 + 2077 52 2 3.4676 -5.8197 -7.1483 -1 1 0 + 2078 52 2 2.5256 -5.9588 -6.8814 -1 1 0 + 2079 52 2 1.8487 -6.5810 -6.9706 -1 1 0 + 2080 52 2 2.4257 -7.2818 -6.7274 -1 1 0 + 2081 53 1 6.0399 0.0531 7.6725 0 0 0 + 2082 53 1 6.2895 0.7582 7.0754 0 0 0 + 2083 53 1 5.5607 0.7053 6.4081 0 0 0 + 2084 53 1 5.0316 0.8832 5.6553 0 0 0 + 2085 53 1 4.4810 1.4781 6.1645 0 0 0 + 2086 53 1 3.6084 1.6436 6.6688 0 0 0 + 2087 53 1 3.4209 2.3803 6.0491 0 0 0 + 2088 53 1 2.4454 2.2683 6.1228 0 0 0 + 2089 53 1 1.5340 1.9413 6.1418 0 0 0 + 2090 53 1 1.6413 0.9975 6.0891 0 0 0 + 2091 53 1 1.9226 0.0716 6.1168 0 0 0 + 2092 53 1 2.1649 -0.3647 6.9722 0 0 0 + 2093 53 1 3.1023 -0.6021 7.0736 0 0 0 + 2094 53 1 3.5317 -1.0957 7.8663 0 0 0 + 2095 53 1 3.6201 -2.0343 -8.1619 0 0 1 + 2096 53 1 2.8273 -1.9970 -7.6420 0 0 1 + 2097 53 1 2.8531 -1.0523 -7.8001 0 0 1 + 2098 53 1 3.0389 -0.2164 -7.5564 0 0 1 + 2099 53 1 3.8710 -0.1421 -8.0591 0 0 1 + 2100 53 1 4.0270 -0.0314 7.3920 0 0 0 + 2101 53 1 3.7701 0.4519 6.6359 0 0 0 + 2102 53 1 3.8052 0.7536 5.7870 0 0 0 + 2103 53 1 3.2230 0.0303 5.9788 0 0 0 + 2104 53 1 3.1564 -0.5238 5.2039 0 0 0 + 2105 53 1 2.8692 -0.7976 4.3223 0 0 0 + 2106 53 1 2.2382 -0.1136 4.0026 0 0 0 + 2107 53 1 1.7958 0.6784 4.3695 0 0 0 + 2108 53 1 1.1519 0.1450 4.8929 0 0 0 + 2109 53 1 0.4266 -0.3813 4.6360 0 0 0 + 2110 53 1 -0.4061 -0.6988 4.2468 0 0 0 + 2111 53 1 -0.0058 -1.4302 3.8334 0 0 0 + 2112 53 1 0.5911 -1.5410 4.6893 0 0 0 + 2113 53 1 1.2699 -2.0964 4.3120 0 0 0 + 2114 53 1 0.7270 -2.1187 3.5096 0 0 0 + 2115 53 1 1.6488 -1.9838 3.2431 0 0 0 + 2116 53 1 2.2559 -2.7163 3.2618 0 0 0 + 2117 53 1 2.7007 -3.4317 2.7939 0 0 0 + 2118 53 1 2.8048 -3.5975 1.8750 0 0 0 + 2119 53 1 3.5644 -3.8700 1.3217 0 0 0 + 2120 53 1 4.2412 -3.3356 1.7322 0 0 0 + 2121 54 2 -5.4967 -6.7887 -3.1496 0 0 0 + 2122 54 2 -5.6553 -7.0659 -2.2235 0 0 0 + 2123 54 2 -6.5388 -7.5023 -2.1782 0 0 0 + 2124 54 2 -7.3331 -7.9765 -1.8649 0 0 0 + 2125 54 2 -7.0792 7.5261 -1.7752 0 -1 0 + 2126 54 2 -7.1890 7.4218 -0.7827 0 -1 0 + 2127 54 2 -7.3952 7.9993 -0.0534 0 -1 0 + 2128 54 2 -6.5657 7.4977 0.1345 0 -1 0 + 2129 54 2 -6.0919 6.9290 -0.4711 0 -1 0 + 2130 54 2 -6.1053 7.0787 -1.4070 0 -1 0 + 2131 54 2 -5.5535 6.5328 -2.0617 0 -1 0 + 2132 54 2 -5.2731 6.9698 -2.8570 0 -1 0 + 2133 54 2 -6.1672 6.7515 -3.1270 0 -1 0 + 2134 54 2 -6.6876 6.6306 -2.3289 0 -1 0 + 2135 54 2 -6.2963 5.7723 -2.3776 0 -1 0 + 2136 54 2 -5.6983 5.4478 -1.7132 0 -1 0 + 2137 54 2 -4.9914 5.0971 -1.1895 0 -1 0 + 2138 54 2 -4.6343 4.2439 -1.3165 0 -1 0 + 2139 54 2 -4.1607 3.5158 -1.7319 0 -1 0 + 2140 54 2 -3.5894 3.0645 -2.4924 0 -1 0 + 2141 54 2 -4.1862 2.3904 -2.8494 0 -1 0 + 2142 54 2 -4.4095 2.1480 -1.8902 0 -1 0 + 2143 54 2 -3.8580 2.4053 -1.1694 0 -1 0 + 2144 54 2 -3.6606 3.0762 -0.4099 0 -1 0 + 2145 54 2 -3.2909 2.2079 -0.3580 0 -1 0 + 2146 54 2 -3.4362 1.5261 0.3072 0 -1 0 + 2147 54 2 -2.6693 1.6183 0.8396 0 -1 0 + 2148 54 2 -2.5530 2.2385 1.6647 0 -1 0 + 2149 54 2 -2.9860 2.8821 2.2696 0 -1 0 + 2150 54 2 -3.7115 3.3306 1.7913 0 -1 0 + 2151 54 2 -4.2868 2.9103 2.4507 0 -1 0 + 2152 54 2 -4.6677 2.8595 3.3286 0 -1 0 + 2153 54 2 -4.7361 2.2940 4.1479 0 -1 0 + 2154 54 2 -4.3010 1.6996 4.7108 0 -1 0 + 2155 54 2 -3.4093 2.0473 4.8769 0 -1 0 + 2156 54 2 -2.5536 1.9107 5.2870 0 -1 0 + 2157 54 2 -2.8317 2.5723 5.8923 0 -1 0 + 2158 54 2 -2.4157 3.3812 5.8551 0 -1 0 + 2159 54 2 -2.0048 3.8186 6.6135 0 -1 0 + 2160 54 2 -1.5137 4.6294 6.6768 0 -1 0 + 2161 55 1 -6.8435 2.0003 0.9931 0 0 0 + 2162 55 1 -6.1452 1.3536 0.8446 0 0 0 + 2163 55 1 -6.4173 1.3209 -0.0248 0 0 0 + 2164 55 1 -7.0821 1.5813 -0.6587 0 0 0 + 2165 55 1 -7.6354 2.3596 -1.0498 0 0 0 + 2166 55 1 -8.0594 3.0413 -1.5808 0 0 0 + 2167 55 1 7.5855 3.5225 -1.7055 -1 0 0 + 2168 55 1 7.1910 3.8876 -2.4584 -1 0 0 + 2169 55 1 7.7465 4.5382 -2.8472 -1 0 0 + 2170 55 1 7.0301 4.2036 -3.4513 -1 0 0 + 2171 55 1 6.1879 4.1840 -3.9175 -1 0 0 + 2172 55 1 5.6147 3.4793 -3.8223 -1 0 0 + 2173 55 1 5.2727 2.8993 -4.5031 -1 0 0 + 2174 55 1 4.7554 2.3057 -4.9718 -1 0 0 + 2175 55 1 4.3694 2.2299 -5.8199 -1 0 0 + 2176 55 1 5.3035 2.0983 -5.8490 -1 0 0 + 2177 55 1 6.1635 2.0490 -6.1706 -1 0 0 + 2178 55 1 7.0336 2.3695 -5.9808 -1 0 0 + 2179 55 1 7.7683 2.2168 -5.4481 -1 0 0 + 2180 55 1 -8.0210 2.7513 -4.9386 0 0 0 + 2181 55 1 7.5821 3.3254 -4.8164 -1 0 0 + 2182 55 1 6.7741 3.8285 -4.9031 -1 0 0 + 2183 55 1 6.4751 2.9972 -4.5589 -1 0 0 + 2184 55 1 6.1180 2.5761 -3.8123 -1 0 0 + 2185 55 1 6.6221 2.3601 -3.0294 -1 0 0 + 2186 55 1 6.7528 1.6674 -3.7066 -1 0 0 + 2187 55 1 7.1072 0.9508 -4.1617 -1 0 0 + 2188 55 1 7.8127 0.2825 -4.2460 -1 0 0 + 2189 55 1 -8.1059 -0.1952 -3.5940 0 0 0 + 2190 55 1 -7.2572 -0.6030 -3.7139 0 0 0 + 2191 55 1 -7.1943 -1.1110 -2.8900 0 0 0 + 2192 55 1 -6.9775 -1.7954 -2.2904 0 0 0 + 2193 55 1 -7.2460 -2.7449 -2.2477 0 0 0 + 2194 55 1 -6.6646 -2.7821 -2.9671 0 0 0 + 2195 55 1 -5.9624 -2.1983 -2.8207 0 0 0 + 2196 55 1 -5.8399 -1.1989 -2.7590 0 0 0 + 2197 55 1 -5.7213 -1.6876 -1.8608 0 0 0 + 2198 55 1 -6.0181 -1.3452 -1.0550 0 0 0 + 2199 55 1 -6.4533 -2.0124 -0.4868 0 0 0 + 2200 55 1 -6.4762 -2.3210 -1.4117 0 0 0 + 2201 56 2 -5.3216 -7.1080 -4.2424 0 0 0 + 2202 56 2 -4.5912 -6.8177 -3.7216 0 0 0 + 2203 56 2 -4.1219 -7.0469 -4.5876 0 0 0 + 2204 56 2 -3.7854 -6.8545 -5.4560 0 0 0 + 2205 56 2 -3.8694 -7.3240 -6.2758 0 0 0 + 2206 56 2 -3.6872 -7.8414 -7.0275 0 0 0 + 2207 56 2 -4.0756 7.9423 -7.6925 0 -1 0 + 2208 56 2 -4.8929 7.7142 -8.1229 0 -1 0 + 2209 56 2 -4.8914 7.0485 7.6274 0 -1 -1 + 2210 56 2 -3.9627 6.6401 7.6699 0 -1 -1 + 2211 56 2 -4.1015 7.2163 6.9505 0 -1 -1 + 2212 56 2 -4.3014 7.4527 6.0182 0 -1 -1 + 2213 56 2 -3.5028 7.6914 5.5467 0 -1 -1 + 2214 56 2 -3.5887 -7.8275 5.7753 0 0 -1 + 2215 56 2 -3.4267 -7.1745 5.0956 0 0 -1 + 2216 56 2 -2.5833 -7.0720 5.4933 0 0 -1 + 2217 56 2 -1.8515 -6.4957 5.6805 0 0 -1 + 2218 56 2 -1.7128 -5.6030 5.8167 0 0 -1 + 2219 56 2 -0.9829 -5.4999 6.4242 0 0 -1 + 2220 56 2 -0.0820 -5.8573 6.4811 0 0 -1 + 2221 56 2 0.9359 -5.7597 6.4878 0 0 -1 + 2222 56 2 1.6328 -5.8358 7.1142 0 0 -1 + 2223 56 2 1.6403 -5.3153 7.9759 0 0 -1 + 2224 56 2 1.1835 -4.6620 -7.9571 0 0 0 + 2225 56 2 0.4553 -4.1476 -8.0218 0 0 0 + 2226 56 2 -0.1210 -4.0471 7.6714 0 0 -1 + 2227 56 2 -0.9083 -4.5218 7.6187 0 0 -1 + 2228 56 2 -1.6867 -5.0668 7.2959 0 0 -1 + 2229 56 2 -2.2829 -5.2956 8.0015 0 0 -1 + 2230 56 2 -2.9532 -5.9988 7.8229 0 0 -1 + 2231 56 2 -2.4733 -6.8674 7.7615 0 0 -1 + 2232 56 2 -1.9011 -7.3252 7.0346 0 0 -1 + 2233 56 2 -1.6852 -7.5248 6.1461 0 0 -1 + 2234 56 2 -1.2737 -7.4066 5.3438 0 0 -1 + 2235 56 2 -1.0316 -7.8405 4.4581 0 0 -1 + 2236 56 2 -0.6947 7.7746 4.0575 0 -1 -1 + 2237 56 2 -1.1071 7.5619 3.2688 0 -1 -1 + 2238 56 2 -1.6870 7.7892 4.0133 0 -1 -1 + 2239 56 2 -2.5913 7.8964 3.9601 0 -1 -1 + 2240 56 2 -3.2663 7.4427 4.3838 0 -1 -1 + 2241 57 1 5.2547 8.1233 -1.4065 0 0 0 + 2242 57 1 6.1693 8.0749 -1.4869 0 0 0 + 2243 57 1 6.5142 7.2053 -1.1024 0 0 0 + 2244 57 1 7.4645 7.2774 -1.1647 0 0 0 + 2245 57 1 8.1287 6.9918 -0.5430 0 0 0 + 2246 57 1 -7.4999 6.8668 0.0416 1 0 0 + 2247 57 1 -6.7876 6.3305 0.4423 1 0 0 + 2248 57 1 -6.0754 5.8198 0.1010 1 0 0 + 2249 57 1 -5.5031 5.8329 -0.6159 1 0 0 + 2250 57 1 -4.9005 6.2821 -1.2837 1 0 0 + 2251 57 1 -4.6238 7.0936 -1.7757 1 0 0 + 2252 57 1 -4.1680 7.0642 -0.9409 1 0 0 + 2253 57 1 -3.2546 7.0792 -0.6167 1 0 0 + 2254 57 1 -3.6930 6.3165 -0.2120 1 0 0 + 2255 57 1 -4.2409 5.6355 -0.4382 1 0 0 + 2256 57 1 -3.7354 5.0297 0.0240 1 0 0 + 2257 57 1 -3.0364 5.6489 0.3930 1 0 0 + 2258 57 1 -2.7582 5.5562 1.2685 1 0 0 + 2259 57 1 -2.7369 6.4517 1.0834 1 0 0 + 2260 57 1 -3.0767 7.2327 1.6209 1 0 0 + 2261 57 1 -3.9289 6.7677 1.9483 1 0 0 + 2262 57 1 -4.2447 6.6394 2.7979 1 0 0 + 2263 57 1 -4.8967 7.0725 3.3263 1 0 0 + 2264 57 1 -4.0957 7.2531 3.7338 1 0 0 + 2265 57 1 -3.3924 7.1978 3.1077 1 0 0 + 2266 57 1 -3.9452 7.8870 2.7138 1 0 0 + 2267 57 1 -3.7113 8.1962 3.6248 1 0 0 + 2268 57 1 -3.7387 -7.9825 4.5427 1 1 0 + 2269 57 1 -2.8779 -8.0829 4.9168 1 1 0 + 2270 57 1 -2.0678 -7.6642 4.8280 1 1 0 + 2271 57 1 -1.9264 -6.7450 4.5397 1 1 0 + 2272 57 1 -2.0661 -6.4506 3.6169 1 1 0 + 2273 57 1 -1.4494 -6.3098 2.8791 1 1 0 + 2274 57 1 -0.5023 -6.0699 2.5486 1 1 0 + 2275 57 1 -1.0171 -5.3091 2.8475 1 1 0 + 2276 57 1 -1.9147 -5.4696 3.0772 1 1 0 + 2277 57 1 -2.7772 -5.8663 2.9750 1 1 0 + 2278 57 1 -3.2040 -6.5371 3.4906 1 1 0 + 2279 57 1 -3.7403 -7.0876 4.0514 1 1 0 + 2280 57 1 -4.3629 -7.2306 4.7463 1 1 0 + 2281 58 2 -7.5649 7.6417 -7.2687 0 0 0 + 2282 58 2 -8.0207 -7.9676 -7.2845 0 1 0 + 2283 58 2 7.5376 -7.5304 -7.2777 -1 1 0 + 2284 58 2 7.9588 -7.0700 -7.9890 -1 1 0 + 2285 58 2 -7.9959 -6.3401 7.9493 0 1 -1 + 2286 58 2 -8.0600 -6.0599 7.0744 0 1 -1 + 2287 58 2 -7.2749 -6.3689 6.5648 0 1 -1 + 2288 58 2 -6.5783 -6.2897 5.9544 0 1 -1 + 2289 58 2 -5.7613 -6.8594 5.8719 0 1 -1 + 2290 58 2 -5.4292 -7.6421 6.2776 0 1 -1 + 2291 58 2 -5.7531 -7.3466 7.2774 0 1 -1 + 2292 58 2 -6.6029 -7.0950 6.8119 0 1 -1 + 2293 58 2 -7.3225 -7.6688 6.6542 0 1 -1 + 2294 58 2 -8.1530 -7.3380 6.8662 0 1 -1 + 2295 58 2 7.5508 -6.9186 7.3935 -1 1 -1 + 2296 58 2 7.5370 -5.9241 7.6298 -1 1 -1 + 2297 58 2 6.9226 -5.1515 7.6150 -1 1 -1 + 2298 58 2 6.2106 -4.5674 7.7895 -1 1 -1 + 2299 58 2 5.2620 -4.7523 7.5564 -1 1 -1 + 2300 58 2 4.3601 -4.6058 7.3941 -1 1 -1 + 2301 58 2 3.5737 -4.5187 6.8029 -1 1 -1 + 2302 58 2 3.5103 -3.7490 7.3254 -1 1 -1 + 2303 58 2 2.7005 -3.7797 7.8145 -1 1 -1 + 2304 58 2 2.6043 -4.6598 7.4662 -1 1 -1 + 2305 58 2 1.8121 -4.8023 6.9971 -1 1 -1 + 2306 58 2 0.8718 -5.0926 7.3407 -1 1 -1 + 2307 58 2 0.0144 -4.8684 6.9787 -1 1 -1 + 2308 58 2 -0.5568 -4.3166 6.3847 -1 1 -1 + 2309 58 2 -0.8860 -3.5640 5.9884 -1 1 -1 + 2310 58 2 -1.4764 -3.5603 5.2184 -1 1 -1 + 2311 58 2 -2.4084 -3.3536 5.3528 -1 1 -1 + 2312 58 2 -3.1713 -3.3477 5.8943 -1 1 -1 + 2313 58 2 -3.0367 -2.4530 5.5947 -1 1 -1 + 2314 58 2 -3.3127 -1.6277 5.2752 -1 1 -1 + 2315 58 2 -3.2279 -0.7613 4.9326 -1 1 -1 + 2316 58 2 -3.7285 -0.2662 5.6249 -1 1 -1 + 2317 58 2 -4.2660 0.4728 5.9340 -1 1 -1 + 2318 58 2 -5.0553 0.9635 5.9190 -1 1 -1 + 2319 58 2 -4.9456 1.8473 6.2292 -1 1 -1 + 2320 58 2 -5.2544 2.7973 6.2206 -1 1 -1 + 2321 59 1 0.4525 -6.6704 -4.5988 0 0 0 + 2322 59 1 1.1994 -7.0538 -5.0188 0 0 0 + 2323 59 1 2.0204 -6.7913 -4.6227 0 0 0 + 2324 59 1 2.4453 -6.0560 -4.1878 0 0 0 + 2325 59 1 2.4566 -5.1931 -4.5691 0 0 0 + 2326 59 1 1.6126 -4.8582 -4.8726 0 0 0 + 2327 59 1 1.4155 -4.0196 -5.3727 0 0 0 + 2328 59 1 1.1300 -3.1718 -5.7385 0 0 0 + 2329 59 1 1.7841 -3.6113 -6.1831 0 0 0 + 2330 59 1 2.3584 -3.6381 -7.0290 0 0 0 + 2331 59 1 2.8001 -2.9735 -7.5767 0 0 0 + 2332 59 1 3.4681 -3.0193 -6.9256 0 0 0 + 2333 59 1 3.4081 -3.9459 -6.6789 0 0 0 + 2334 59 1 3.3172 -4.7749 -7.0975 0 0 0 + 2335 59 1 2.4705 -5.1371 -7.4261 0 0 0 + 2336 59 1 2.2894 -5.9936 -7.8728 0 0 0 + 2337 59 1 1.8001 -6.4968 7.8904 0 0 -1 + 2338 59 1 1.7324 -6.9218 7.0227 0 0 -1 + 2339 59 1 1.9784 -7.7806 6.6472 0 0 -1 + 2340 59 1 1.0182 -7.6639 6.6130 0 0 -1 + 2341 59 1 0.3444 -6.9405 6.7497 0 0 -1 + 2342 59 1 0.4486 -6.5874 5.8787 0 0 -1 + 2343 59 1 1.3635 -6.7856 5.8652 0 0 -1 + 2344 59 1 2.1985 -6.3757 6.1932 0 0 -1 + 2345 59 1 2.8236 -6.4609 5.5165 0 0 -1 + 2346 59 1 2.8237 -7.4397 5.4450 0 0 -1 + 2347 59 1 3.1969 -8.0860 4.7644 0 0 -1 + 2348 59 1 2.6678 -8.1384 3.9533 0 0 -1 + 2349 59 1 1.9361 -8.2027 3.4063 0 0 -1 + 2350 59 1 1.2897 7.5923 3.0653 0 -1 -1 + 2351 59 1 0.8154 8.1844 3.6479 0 -1 -1 + 2352 59 1 0.0034 -7.7516 3.8747 0 0 -1 + 2353 59 1 -0.6529 -7.0569 4.2315 0 0 -1 + 2354 59 1 -0.2934 -6.2185 4.6381 0 0 -1 + 2355 59 1 0.2775 -6.9366 4.7662 0 0 -1 + 2356 59 1 0.7171 -7.5724 5.2524 0 0 -1 + 2357 59 1 1.5508 -7.7951 5.6909 0 0 -1 + 2358 59 1 2.1618 -8.0119 4.9060 0 0 -1 + 2359 59 1 1.7051 -7.4673 4.2848 0 0 -1 + 2360 59 1 1.4254 -6.4888 3.9510 0 0 -1 + 2361 60 2 2.7955 0.4297 -1.6605 0 0 0 + 2362 60 2 1.9639 0.2729 -2.0769 0 0 0 + 2363 60 2 2.5947 0.2968 -2.7712 0 0 0 + 2364 60 2 2.1554 -0.5975 -2.9446 0 0 0 + 2365 60 2 2.5164 -1.3920 -3.3433 0 0 0 + 2366 60 2 3.1827 -2.0723 -3.6086 0 0 0 + 2367 60 2 3.4616 -2.4987 -4.4152 0 0 0 + 2368 60 2 2.5913 -2.2443 -4.7419 0 0 0 + 2369 60 2 2.2303 -2.8480 -5.4234 0 0 0 + 2370 60 2 2.7355 -3.2399 -6.1011 0 0 0 + 2371 60 2 3.0405 -2.3785 -6.2228 0 0 0 + 2372 60 2 3.6335 -1.9241 -6.8471 0 0 0 + 2373 60 2 4.3735 -2.4670 -6.7497 0 0 0 + 2374 60 2 4.6646 -3.3746 -6.7822 0 0 0 + 2375 60 2 4.3025 -3.3634 -5.9056 0 0 0 + 2376 60 2 3.4743 -3.6701 -5.5278 0 0 0 + 2377 60 2 2.6601 -4.0877 -5.3602 0 0 0 + 2378 60 2 2.8050 -4.9267 -5.7550 0 0 0 + 2379 60 2 1.9892 -4.7606 -6.0523 0 0 0 + 2380 60 2 1.4724 -4.6371 -6.8908 0 0 0 + 2381 60 2 0.5832 -4.9853 -7.0318 0 0 0 + 2382 60 2 1.2135 -5.6699 -7.3477 0 0 0 + 2383 60 2 1.4591 -5.8067 -6.4107 0 0 0 + 2384 60 2 2.2323 -5.8149 -5.8582 0 0 0 + 2385 60 2 2.0242 -6.7650 -5.8671 0 0 0 + 2386 60 2 1.0733 -6.7229 -6.0239 0 0 0 + 2387 60 2 0.6001 -6.3096 -6.7355 0 0 0 + 2388 60 2 0.0618 -6.0349 -7.4922 0 0 0 + 2389 60 2 0.7338 -6.1719 -8.1524 0 0 0 + 2390 60 2 1.1941 -6.9485 -7.8154 0 0 0 + 2391 60 2 0.9708 -7.1914 7.6436 0 0 -1 + 2392 60 2 0.4167 -7.9064 7.4576 0 0 -1 + 2393 60 2 -0.2795 7.8048 7.6898 0 -1 -1 + 2394 60 2 0.5334 7.3882 7.9695 0 -1 -1 + 2395 60 2 1.4072 7.6778 -8.0100 0 -1 0 + 2396 60 2 2.2600 7.5315 -7.7338 0 -1 0 + 2397 60 2 3.2285 7.2740 -7.7508 0 -1 0 + 2398 60 2 3.0753 6.3277 -7.6143 0 -1 0 + 2399 60 2 2.9738 6.5962 -6.6975 0 -1 0 + 2400 60 2 3.1539 6.1506 -5.8577 0 -1 0 + 2401 61 1 -7.3109 -6.6024 -4.7452 0 0 0 + 2402 61 1 -6.3991 -6.6687 -4.9991 0 0 0 + 2403 61 1 -6.8268 -7.2868 -5.6630 0 0 0 + 2404 61 1 -7.5506 -7.5618 -5.1304 0 0 0 + 2405 61 1 -7.2776 7.9848 -4.9660 0 -1 0 + 2406 61 1 -6.4466 -8.0588 -4.6079 0 0 0 + 2407 61 1 -5.8797 -7.6496 -5.2556 0 0 0 + 2408 61 1 -5.4136 8.0768 -5.6416 0 -1 0 + 2409 61 1 -5.7420 7.7905 -6.4680 0 -1 0 + 2410 61 1 -6.4136 7.8880 -5.8350 0 -1 0 + 2411 61 1 -6.5712 7.3256 -5.0883 0 -1 0 + 2412 61 1 -6.9428 6.9905 -5.9069 0 -1 0 + 2413 61 1 -7.5767 6.6851 -6.5258 0 -1 0 + 2414 61 1 -7.1908 5.9569 -6.0666 0 -1 0 + 2415 61 1 -6.4258 6.0532 -5.4516 0 -1 0 + 2416 61 1 -6.4994 5.0988 -5.4391 0 -1 0 + 2417 61 1 -5.7852 4.4169 -5.4667 0 -1 0 + 2418 61 1 -5.1719 3.6640 -5.3378 0 -1 0 + 2419 61 1 -4.6825 2.9142 -5.5838 0 -1 0 + 2420 61 1 -4.7760 2.0719 -5.2002 0 -1 0 + 2421 61 1 -5.0094 1.6095 -5.9836 0 -1 0 + 2422 61 1 -5.5020 1.2227 -6.6792 0 -1 0 + 2423 61 1 -6.1981 0.5681 -7.0778 0 -1 0 + 2424 61 1 -5.8583 -0.1209 -6.5559 0 -1 0 + 2425 61 1 -5.7014 -1.0070 -6.8794 0 -1 0 + 2426 61 1 -5.5045 -0.2122 -7.5798 0 -1 0 + 2427 61 1 -6.0092 0.2588 8.2093 0 -1 -1 + 2428 61 1 -6.0471 1.1986 -7.9541 0 -1 0 + 2429 61 1 -6.3272 2.0719 -8.1877 0 -1 0 + 2430 61 1 -7.2598 2.1078 -7.9935 0 -1 0 + 2431 61 1 -7.3345 2.4359 -7.0709 0 -1 0 + 2432 61 1 -7.6097 3.3638 -6.8807 0 -1 0 + 2433 61 1 -8.1067 3.9877 -7.4984 0 -1 0 + 2434 61 1 7.3830 3.6960 -7.2586 -1 -1 0 + 2435 61 1 6.4752 3.7006 -6.8756 -1 -1 0 + 2436 61 1 5.9803 3.0268 -6.5238 -1 -1 0 + 2437 61 1 5.1614 3.1042 -5.9654 -1 -1 0 + 2438 61 1 4.2981 3.1511 -5.3553 -1 -1 0 + 2439 61 1 4.0045 3.0575 -4.4276 -1 -1 0 + 2440 61 1 3.7408 3.0469 -3.4847 -1 -1 0 + 2441 62 2 3.7790 -1.9945 -2.6587 0 0 0 + 2442 62 2 4.3143 -1.5118 -1.9531 0 0 0 + 2443 62 2 5.1657 -1.7925 -1.8020 0 0 0 + 2444 62 2 4.7781 -2.6520 -2.1554 0 0 0 + 2445 62 2 5.4805 -3.2550 -2.4721 0 0 0 + 2446 62 2 6.1369 -3.0800 -3.0847 0 0 0 + 2447 62 2 6.5733 -2.3303 -3.5469 0 0 0 + 2448 62 2 6.3832 -2.0096 -4.4028 0 0 0 + 2449 62 2 7.1758 -2.4449 -4.4552 0 0 0 + 2450 62 2 7.2166 -3.1203 -5.2201 0 0 0 + 2451 62 2 8.1017 -3.4383 -5.4295 0 0 0 + 2452 62 2 -7.6417 -2.8487 -5.1132 1 0 0 + 2453 62 2 -6.7893 -2.7450 -4.6371 1 0 0 + 2454 62 2 -5.9118 -3.0081 -5.0090 1 0 0 + 2455 62 2 -6.6052 -3.3168 -5.5533 1 0 0 + 2456 62 2 -7.4195 -3.5017 -6.1185 1 0 0 + 2457 62 2 -7.4154 -4.4460 -6.4043 1 0 0 + 2458 62 2 -8.0079 -5.2222 -6.5635 1 0 0 + 2459 62 2 7.8155 -5.2011 -7.3184 0 0 0 + 2460 62 2 8.0192 -6.0835 -7.6024 0 0 0 + 2461 62 2 7.1901 -6.5274 -7.3836 0 0 0 + 2462 62 2 6.8484 -5.6547 -7.7269 0 0 0 + 2463 62 2 6.0232 -5.1236 -7.7581 0 0 0 + 2464 62 2 5.0682 -4.9501 -7.8299 0 0 0 + 2465 62 2 4.2081 -5.3688 -7.9587 0 0 0 + 2466 62 2 3.9150 -5.5640 7.5624 0 0 -1 + 2467 62 2 3.5865 -6.4108 7.6488 0 0 -1 + 2468 62 2 2.7212 -6.9003 7.4590 0 0 -1 + 2469 62 2 2.8712 -7.7636 7.6674 0 0 -1 + 2470 62 2 3.4768 7.9549 7.4509 0 -1 -1 + 2471 62 2 3.5094 7.0343 7.3892 0 -1 -1 + 2472 62 2 4.2937 6.7135 7.0629 0 -1 -1 + 2473 62 2 4.0474 6.0443 7.6606 0 -1 -1 + 2474 62 2 4.2381 6.8310 8.2084 0 -1 -1 + 2475 62 2 4.9156 7.0156 -7.5851 0 -1 0 + 2476 62 2 4.5888 7.3995 -6.7531 0 -1 0 + 2477 62 2 3.9874 6.9440 -6.0342 0 -1 0 + 2478 62 2 3.0571 7.0958 -5.6932 0 -1 0 + 2479 62 2 2.9693 6.6684 -4.8951 0 -1 0 + 2480 62 2 3.2755 5.9356 -4.3961 0 -1 0 + 2481 63 1 -1.0106 -5.9029 8.0002 0 0 0 + 2482 63 1 -1.8641 -6.2029 -8.0879 0 0 1 + 2483 63 1 -2.6450 -6.2661 -7.5304 0 0 1 + 2484 63 1 -2.9868 -5.3700 -7.7129 0 0 1 + 2485 63 1 -2.7310 -4.4366 -7.8839 0 0 1 + 2486 63 1 -2.5604 -3.5406 -7.6315 0 0 1 + 2487 63 1 -1.7583 -3.0271 -7.5872 0 0 1 + 2488 63 1 -1.1835 -2.2857 -7.7859 0 0 1 + 2489 63 1 -0.5323 -2.2329 7.9109 0 0 0 + 2490 63 1 0.1149 -2.5970 -7.9578 0 0 1 + 2491 63 1 -0.1320 -2.2603 -7.0663 0 0 1 + 2492 63 1 -0.9187 -1.9603 -6.5025 0 0 1 + 2493 63 1 -1.8387 -2.2155 -6.6599 0 0 1 + 2494 63 1 -2.3807 -2.9487 -6.4430 0 0 1 + 2495 63 1 -1.8498 -3.6767 -6.2721 0 0 1 + 2496 63 1 -1.2800 -4.3371 -5.8547 0 0 1 + 2497 63 1 -1.6868 -5.0663 -5.2299 0 0 1 + 2498 63 1 -0.9011 -5.4769 -4.9800 0 0 1 + 2499 63 1 -0.3310 -6.0887 -5.4542 0 0 1 + 2500 63 1 -1.0763 -5.8455 -5.9954 0 0 1 + 2501 63 1 -0.5828 -6.4126 -6.5693 0 0 1 + 2502 63 1 -0.7112 -6.9397 -5.8042 0 0 1 + 2503 63 1 -0.4402 -7.4214 -5.0315 0 0 1 + 2504 63 1 -0.6347 -6.5802 -4.5148 0 0 1 + 2505 63 1 -1.1430 -5.9991 -3.9684 0 0 1 + 2506 63 1 -0.9435 -5.2485 -3.4968 0 0 1 + 2507 63 1 -0.0937 -5.2965 -3.1319 0 0 1 + 2508 63 1 0.6012 -5.1489 -2.5877 0 0 1 + 2509 63 1 1.5477 -4.9489 -2.6636 0 0 1 + 2510 63 1 2.0372 -5.7198 -2.9513 0 0 1 + 2511 63 1 2.4284 -6.5887 -3.2498 0 0 1 + 2512 63 1 2.5217 -7.4870 -3.6839 0 0 1 + 2513 63 1 3.1006 -8.0628 -4.1552 0 0 1 + 2514 63 1 3.4022 7.4413 -4.1337 0 -1 1 + 2515 63 1 3.9184 6.6615 -4.3010 0 -1 1 + 2516 63 1 3.9833 6.1722 -5.1366 0 -1 1 + 2517 63 1 4.0168 5.2330 -5.5308 0 -1 1 + 2518 63 1 4.4321 5.0293 -6.4203 0 -1 1 + 2519 63 1 4.1434 5.9423 -6.4831 0 -1 1 + 2520 63 1 4.0593 6.6107 -7.1676 0 -1 1 + 2521 64 2 7.5004 -1.7882 -0.6491 0 0 0 + 2522 64 2 6.5455 -1.6748 -0.8188 0 0 0 + 2523 64 2 6.7408 -2.5918 -0.6773 0 0 0 + 2524 64 2 7.5901 -2.9880 -0.7586 0 0 0 + 2525 64 2 7.4659 -2.7865 -1.8138 0 0 0 + 2526 64 2 8.1814 -2.9663 -2.3725 0 0 0 + 2527 64 2 -7.5105 -3.3280 -3.0295 1 0 0 + 2528 64 2 -7.4497 -3.9423 -3.7382 1 0 0 + 2529 64 2 -7.9951 -3.9471 -4.5359 1 0 0 + 2530 64 2 -7.5529 -4.7676 -4.4850 1 0 0 + 2531 64 2 -6.6989 -4.6404 -4.0405 1 0 0 + 2532 64 2 -6.0565 -4.9517 -3.4203 1 0 0 + 2533 64 2 -5.9436 -4.7942 -2.5369 1 0 0 + 2534 64 2 -5.5849 -4.1620 -1.8861 1 0 0 + 2535 64 2 -4.7789 -3.8963 -1.2838 1 0 0 + 2536 64 2 -3.8916 -3.5212 -1.2918 1 0 0 + 2537 64 2 -3.0541 -3.3652 -1.7022 1 0 0 + 2538 64 2 -3.4087 -2.5827 -2.0451 1 0 0 + 2539 64 2 -3.2540 -1.6642 -2.1694 1 0 0 + 2540 64 2 -3.5814 -0.7471 -2.2107 1 0 0 + 2541 64 2 -3.2544 -0.5090 -1.3397 1 0 0 + 2542 64 2 -2.3611 -0.5143 -1.0364 1 0 0 + 2543 64 2 -1.4257 -0.6648 -0.8249 1 0 0 + 2544 64 2 -0.7191 -0.9952 -0.2550 1 0 0 + 2545 64 2 0.1899 -1.2046 -0.2202 1 0 0 + 2546 64 2 0.4706 -0.2370 -0.5132 1 0 0 + 2547 64 2 1.2653 -0.4908 -0.0917 1 0 0 + 2548 64 2 2.1877 -0.6042 -0.2028 1 0 0 + 2549 64 2 2.0214 0.2271 0.1697 1 0 0 + 2550 64 2 1.8119 1.1342 0.4030 1 0 0 + 2551 64 2 1.1103 1.6090 0.8666 1 0 0 + 2552 64 2 1.9019 2.0453 0.9337 1 0 0 + 2553 64 2 2.1591 2.2048 0.0373 1 0 0 + 2554 64 2 1.9392 1.9853 -0.8858 1 0 0 + 2555 64 2 1.2022 2.2839 -1.4324 1 0 0 + 2556 64 2 0.6273 2.3686 -2.1277 1 0 0 + 2557 64 2 0.4632 1.5859 -2.8061 1 0 0 + 2558 64 2 0.3692 0.7006 -3.1473 1 0 0 + 2559 64 2 0.4065 0.0187 -3.8058 1 0 0 + 2560 64 2 -0.4008 -0.1243 -4.3242 1 0 0 + 2561 65 1 6.1127 -2.9504 4.3889 0 0 0 + 2562 65 1 6.6546 -3.7448 4.4490 0 0 0 + 2563 65 1 6.7366 -3.4606 5.3684 0 0 0 + 2564 65 1 6.4877 -3.0457 6.1934 0 0 0 + 2565 65 1 5.9012 -2.7075 5.5710 0 0 0 + 2566 65 1 5.4770 -1.8852 5.2083 0 0 0 + 2567 65 1 4.6174 -1.9746 5.6189 0 0 0 + 2568 65 1 3.9863 -2.6584 5.4912 0 0 0 + 2569 65 1 3.6435 -2.9055 4.6730 0 0 0 + 2570 65 1 4.3526 -2.1907 4.6394 0 0 0 + 2571 65 1 5.2785 -2.1873 4.1895 0 0 0 + 2572 65 1 5.1328 -2.8533 4.8202 0 0 0 + 2573 65 1 4.9161 -3.6226 5.3260 0 0 0 + 2574 65 1 4.9945 -3.0281 6.1064 0 0 0 + 2575 65 1 5.3199 -2.8786 6.9625 0 0 0 + 2576 65 1 4.8255 -3.6167 7.3350 0 0 0 + 2577 65 1 4.8789 -3.9819 8.2074 0 0 0 + 2578 65 1 4.2694 -4.0996 -7.5151 0 0 1 + 2579 65 1 3.4197 -3.8088 -7.6816 0 0 1 + 2580 65 1 3.5521 -4.5081 8.0266 0 0 0 + 2581 65 1 3.1654 -5.3558 -8.1497 0 0 1 + 2582 65 1 2.6254 -5.8461 7.5475 0 0 0 + 2583 65 1 3.2622 -6.0245 6.7559 0 0 0 + 2584 65 1 2.7621 -5.2364 6.5503 0 0 0 + 2585 65 1 2.6571 -4.3850 6.1078 0 0 0 + 2586 65 1 2.3210 -3.9718 5.3209 0 0 0 + 2587 65 1 2.8168 -3.1479 5.2459 0 0 0 + 2588 65 1 2.0255 -2.6887 5.1678 0 0 0 + 2589 65 1 1.7772 -3.2777 4.4245 0 0 0 + 2590 65 1 1.2744 -3.0983 3.6158 0 0 0 + 2591 65 1 0.5764 -3.7407 3.4885 0 0 0 + 2592 65 1 -0.0466 -3.9803 4.1640 0 0 0 + 2593 65 1 -0.8916 -3.5943 3.9297 0 0 0 + 2594 65 1 -1.1044 -4.3427 4.4857 0 0 0 + 2595 65 1 -1.5842 -4.4872 3.6658 0 0 0 + 2596 65 1 -2.0318 -3.7199 4.1589 0 0 0 + 2597 65 1 -2.5478 -2.9484 4.4240 0 0 0 + 2598 65 1 -3.3922 -2.4505 4.4863 0 0 0 + 2599 65 1 -4.2434 -2.8204 4.1720 0 0 0 + 2600 65 1 -4.4719 -2.1920 3.4650 0 0 0 + 2601 66 2 0.5194 2.4211 -3.2965 0 0 0 + 2602 66 2 0.2680 2.6413 -4.2426 0 0 0 + 2603 66 2 -0.0430 1.7684 -4.5338 0 0 0 + 2604 66 2 -0.1831 0.9362 -5.0820 0 0 0 + 2605 66 2 0.7249 0.8417 -4.9114 0 0 0 + 2606 66 2 1.4764 0.2381 -4.8637 0 0 0 + 2607 66 2 2.0778 -0.0353 -5.5045 0 0 0 + 2608 66 2 2.5138 0.0994 -4.6498 0 0 0 + 2609 66 2 2.6623 -0.2900 -3.7902 0 0 0 + 2610 66 2 3.5105 -0.1422 -3.2599 0 0 0 + 2611 66 2 4.2521 0.3643 -3.6107 0 0 0 + 2612 66 2 4.3600 -0.4896 -3.9821 0 0 0 + 2613 66 2 4.8230 -0.3846 -4.7743 0 0 0 + 2614 66 2 4.3521 0.4394 -4.9560 0 0 0 + 2615 66 2 4.2123 1.3020 -4.5038 0 0 0 + 2616 66 2 3.6931 1.8169 -3.8908 0 0 0 + 2617 66 2 3.0889 2.4933 -4.1815 0 0 0 + 2618 66 2 3.5859 2.1796 -4.9867 0 0 0 + 2619 66 2 3.4465 1.3330 -5.3666 0 0 0 + 2620 66 2 2.5410 1.0870 -5.2168 0 0 0 + 2621 66 2 1.6687 1.3922 -4.8965 0 0 0 + 2622 66 2 1.0646 2.1347 -4.7193 0 0 0 + 2623 66 2 0.4094 2.4992 -5.3462 0 0 0 + 2624 66 2 0.7833 3.3728 -5.5449 0 0 0 + 2625 66 2 0.5585 3.5558 -4.6667 0 0 0 + 2626 66 2 0.8427 4.0434 -3.8861 0 0 0 + 2627 66 2 1.7022 4.0579 -3.5839 0 0 0 + 2628 66 2 2.4479 4.6269 -3.3758 0 0 0 + 2629 66 2 1.5859 5.1269 -3.5848 0 0 0 + 2630 66 2 0.8067 5.0814 -4.1635 0 0 0 + 2631 66 2 -0.0211 5.2648 -4.5378 0 0 0 + 2632 66 2 -0.1919 4.7442 -3.7759 0 0 0 + 2633 66 2 -0.1816 3.7828 -3.6232 0 0 0 + 2634 66 2 -0.4372 2.9001 -3.3399 0 0 0 + 2635 66 2 -0.5090 2.0175 -3.6039 0 0 0 + 2636 66 2 -0.6915 1.3985 -2.8059 0 0 0 + 2637 66 2 -0.1230 1.4579 -2.0375 0 0 0 + 2638 66 2 -0.0970 0.6893 -1.5296 0 0 0 + 2639 66 2 -0.9338 0.4002 -1.2727 0 0 0 + 2640 66 2 -1.6302 0.3394 -0.5358 0 0 0 + 2641 67 1 2.9089 -4.6563 1.6843 0 0 0 + 2642 67 1 2.5384 -5.4174 2.1933 0 0 0 + 2643 67 1 1.5946 -5.5676 2.1571 0 0 0 + 2644 67 1 1.2012 -6.3834 2.4062 0 0 0 + 2645 67 1 1.7204 -5.9170 3.1102 0 0 0 + 2646 67 1 2.3568 -6.1821 3.7537 0 0 0 + 2647 67 1 3.1630 -5.9086 4.2129 0 0 0 + 2648 67 1 3.5699 -5.6927 5.0534 0 0 0 + 2649 67 1 3.4957 -5.1300 5.8238 0 0 0 + 2650 67 1 2.5926 -5.3310 5.4756 0 0 0 + 2651 67 1 1.6957 -5.0506 5.8114 0 0 0 + 2652 67 1 1.3054 -4.1324 5.6567 0 0 0 + 2653 67 1 1.1944 -3.1963 5.4557 0 0 0 + 2654 67 1 0.6325 -2.4912 5.1196 0 0 0 + 2655 67 1 -0.2041 -2.2854 5.6096 0 0 0 + 2656 67 1 -0.9468 -1.6039 5.6513 0 0 0 + 2657 67 1 -1.2516 -0.7865 6.1049 0 0 0 + 2658 67 1 -0.7578 -0.5816 5.3796 0 0 0 + 2659 67 1 -1.6591 -0.6246 5.0991 0 0 0 + 2660 67 1 -2.1899 -0.2281 4.4247 0 0 0 + 2661 67 1 -3.1558 0.0066 4.2486 0 0 0 + 2662 67 1 -3.9646 -0.5102 4.0584 0 0 0 + 2663 67 1 -4.6836 -1.0793 3.7974 0 0 0 + 2664 67 1 -5.3321 -1.2683 3.0637 0 0 0 + 2665 67 1 -6.1662 -1.7170 3.0254 0 0 0 + 2666 67 1 -6.9156 -2.3495 3.1627 0 0 0 + 2667 67 1 -7.5074 -2.1536 3.9362 0 0 0 + 2668 67 1 -7.9478 -1.5486 4.5476 0 0 0 + 2669 67 1 7.9585 -0.8088 4.6752 -1 0 0 + 2670 67 1 7.8608 -0.2365 3.9586 -1 0 0 + 2671 67 1 8.0102 0.4611 3.3583 -1 0 0 + 2672 67 1 -7.6888 1.0010 2.9876 0 0 0 + 2673 67 1 -7.1775 1.5428 2.4006 0 0 0 + 2674 67 1 -6.5265 1.2903 1.8199 0 0 0 + 2675 67 1 -6.7651 0.6198 1.1518 0 0 0 + 2676 67 1 -7.1119 0.4806 0.2795 0 0 0 + 2677 67 1 -6.2429 0.1787 0.3377 0 0 0 + 2678 67 1 -5.4802 0.4032 0.9182 0 0 0 + 2679 67 1 -5.9503 0.2247 1.7328 0 0 0 + 2680 67 1 -6.0209 -0.3647 2.4861 0 0 0 + 2681 68 2 -4.4384 5.6996 8.1227 0 0 0 + 2682 68 2 -4.5282 5.4047 7.2103 0 0 0 + 2683 68 2 -5.1953 4.8586 6.8323 0 0 0 + 2684 68 2 -5.2143 4.0487 6.2947 0 0 0 + 2685 68 2 -6.1018 3.6620 6.0101 0 0 0 + 2686 68 2 -6.5315 3.0579 5.4021 0 0 0 + 2687 68 2 -7.0775 3.1102 4.6263 0 0 0 + 2688 68 2 -7.5286 3.1533 3.7173 0 0 0 + 2689 68 2 -8.0364 3.0699 2.8867 0 0 0 + 2690 68 2 7.9263 2.2143 2.9823 -1 0 0 + 2691 68 2 7.2224 1.7646 2.5443 -1 0 0 + 2692 68 2 7.1997 2.4932 1.8819 -1 0 0 + 2693 68 2 7.1897 2.2603 0.9867 -1 0 0 + 2694 68 2 7.2998 1.5172 0.3895 -1 0 0 + 2695 68 2 8.1244 1.9499 0.4755 -1 0 0 + 2696 68 2 -7.4590 2.3279 0.1851 0 0 0 + 2697 68 2 -6.6920 2.6125 -0.3005 0 0 0 + 2698 68 2 -7.3685 3.2606 -0.2089 0 0 0 + 2699 68 2 -8.1725 3.7863 -0.0666 0 0 0 + 2700 68 2 7.6517 4.5039 0.2503 -1 0 0 + 2701 68 2 -7.8339 4.5086 0.5050 0 0 0 + 2702 68 2 -7.9361 5.5194 0.7012 0 0 0 + 2703 68 2 7.9288 6.2555 0.3681 -1 0 0 + 2704 68 2 7.8883 7.2200 0.5625 -1 0 0 + 2705 68 2 7.9469 8.0450 0.0701 -1 0 0 + 2706 68 2 -8.0726 -7.4881 0.2345 0 1 0 + 2707 68 2 -7.7076 -8.0529 0.9047 0 1 0 + 2708 68 2 -7.6802 7.4155 1.1007 0 0 0 + 2709 68 2 -7.6732 6.4950 1.3320 0 0 0 + 2710 68 2 -8.0665 6.8498 2.1233 0 0 0 + 2711 68 2 -7.5123 7.5002 2.5139 0 0 0 + 2712 68 2 -6.7122 8.0247 2.4504 0 0 0 + 2713 68 2 -6.8009 7.9757 1.4777 0 0 0 + 2714 68 2 -5.9905 7.9282 0.9028 0 0 0 + 2715 68 2 -5.0200 7.6086 0.6620 0 0 0 + 2716 68 2 -4.3907 7.1263 1.0847 0 0 0 + 2717 68 2 -4.1808 7.3274 0.1406 0 0 0 + 2718 68 2 -3.3601 7.6234 0.4430 0 0 0 + 2719 68 2 -3.4119 8.1216 -0.3709 0 0 0 + 2720 68 2 -2.9322 -7.6882 0.1671 0 1 0 + 2721 69 1 -1.5976 0.6749 -7.1646 0 0 0 + 2722 69 1 -2.1315 0.5175 -6.3512 0 0 0 + 2723 69 1 -2.9993 0.1467 -6.3137 0 0 0 + 2724 69 1 -3.3516 -0.7366 -6.5492 0 0 0 + 2725 69 1 -2.7909 -1.1999 -5.9807 0 0 0 + 2726 69 1 -2.0415 -1.6779 -5.5993 0 0 0 + 2727 69 1 -1.2610 -1.1775 -5.8379 0 0 0 + 2728 69 1 -1.9102 -0.5448 -6.2433 0 0 0 + 2729 69 1 -1.2406 0.1623 -6.1369 0 0 0 + 2730 69 1 -1.4093 0.6913 -5.3762 0 0 0 + 2731 69 1 -1.0273 1.5430 -4.9017 0 0 0 + 2732 69 1 -1.5857 2.2690 -4.5824 0 0 0 + 2733 69 1 -0.7495 2.7360 -4.4447 0 0 0 + 2734 69 1 -1.1388 3.4970 -4.8416 0 0 0 + 2735 69 1 -0.4263 3.5937 -5.4453 0 0 0 + 2736 69 1 -0.2908 3.5126 -6.4598 0 0 0 + 2737 69 1 0.5868 3.1585 -6.5957 0 0 0 + 2738 69 1 1.2834 2.5356 -6.5041 0 0 0 + 2739 69 1 2.1458 2.5809 -6.9349 0 0 0 + 2740 69 1 2.6535 3.2653 -6.5329 0 0 0 + 2741 69 1 2.4754 3.9802 -5.8938 0 0 0 + 2742 69 1 3.4124 3.8845 -6.1233 0 0 0 + 2743 69 1 4.3763 3.9680 -6.1726 0 0 0 + 2744 69 1 4.0718 4.1178 -7.0260 0 0 0 + 2745 69 1 4.4153 3.9091 -7.8789 0 0 0 + 2746 69 1 4.8669 3.9573 7.7050 0 0 -1 + 2747 69 1 5.3510 3.1369 7.6474 0 0 -1 + 2748 69 1 5.4599 2.4181 -8.1441 0 0 0 + 2749 69 1 5.4514 2.0915 7.2739 0 0 -1 + 2750 69 1 5.2729 2.3059 6.4146 0 0 -1 + 2751 69 1 5.3358 3.2542 6.4250 0 0 -1 + 2752 69 1 4.6858 3.9427 6.3564 0 0 -1 + 2753 69 1 4.1976 4.6515 6.7140 0 0 -1 + 2754 69 1 4.2365 5.0819 7.5687 0 0 -1 + 2755 69 1 4.7578 5.5213 6.8509 0 0 -1 + 2756 69 1 5.1419 6.2796 6.4756 0 0 -1 + 2757 69 1 5.9286 6.4882 5.9507 0 0 -1 + 2758 69 1 5.5729 6.1576 5.1549 0 0 -1 + 2759 69 1 5.4868 5.7911 4.1922 0 0 -1 + 2760 69 1 5.1694 5.0736 3.6068 0 0 -1 + 2761 70 2 6.8320 -2.3961 6.9270 0 0 0 + 2762 70 2 6.0783 -1.9102 7.1338 0 0 0 + 2763 70 2 5.2770 -1.7705 7.5052 0 0 0 + 2764 70 2 4.5699 -1.3471 7.9960 0 0 0 + 2765 70 2 4.3302 -1.3296 -7.5186 0 0 1 + 2766 70 2 5.1629 -0.9539 -7.4435 0 0 1 + 2767 70 2 5.0303 -1.5219 -6.6932 0 0 1 + 2768 70 2 5.7180 -1.8397 -6.1184 0 0 1 + 2769 70 2 6.6582 -1.6170 -6.1856 0 0 1 + 2770 70 2 7.0253 -0.8748 -6.6388 0 0 1 + 2771 70 2 7.6467 -1.6162 -6.5826 0 0 1 + 2772 70 2 7.5971 -2.0239 -5.7063 0 0 1 + 2773 70 2 -8.1341 -2.6121 -6.3428 1 0 1 + 2774 70 2 -7.9561 -2.1857 -7.2162 1 0 1 + 2775 70 2 -7.5885 -1.8463 -8.0285 1 0 1 + 2776 70 2 -6.8111 -2.4563 -8.0157 1 0 1 + 2777 70 2 -6.3958 -2.0553 -7.2652 1 0 1 + 2778 70 2 -6.3949 -1.5745 -6.4574 1 0 1 + 2779 70 2 -6.7703 -1.0339 -5.7560 1 0 1 + 2780 70 2 -7.3890 -1.5921 -6.3373 1 0 1 + 2781 70 2 -7.0388 -2.4769 -6.3631 1 0 1 + 2782 70 2 -6.1914 -2.8632 -6.7224 1 0 1 + 2783 70 2 -5.5281 -3.4190 -6.2590 1 0 1 + 2784 70 2 -6.1158 -4.1275 -6.1646 1 0 1 + 2785 70 2 -6.5208 -4.9857 -6.4159 1 0 1 + 2786 70 2 -6.5686 -5.8009 -5.8363 1 0 1 + 2787 70 2 -5.7518 -5.7842 -5.3562 1 0 1 + 2788 70 2 -6.2435 -4.9061 -5.1825 1 0 1 + 2789 70 2 -5.6850 -4.1094 -5.1404 1 0 1 + 2790 70 2 -5.8102 -4.1556 -4.1748 1 0 1 + 2791 70 2 -6.4581 -3.4840 -3.9120 1 0 1 + 2792 70 2 -6.9191 -3.8801 -4.6813 1 0 1 + 2793 70 2 -7.1748 -4.4859 -5.4586 1 0 1 + 2794 70 2 -7.7213 -5.3001 -5.4669 1 0 1 + 2795 70 2 -7.6776 -6.2613 -5.7934 1 0 1 + 2796 70 2 -7.2982 -6.0847 -6.6370 1 0 1 + 2797 70 2 -6.5952 -6.7239 -6.6917 1 0 1 + 2798 70 2 -5.8274 -6.8110 -6.0265 1 0 1 + 2799 70 2 -5.1728 -6.8317 -5.3331 1 0 1 + 2800 70 2 -5.0116 -6.1772 -4.6863 1 0 1 + 2801 71 1 0.4162 6.0322 -3.4019 0 0 0 + 2802 71 1 0.6219 5.1261 -3.0897 0 0 0 + 2803 71 1 1.2527 5.8407 -2.9367 0 0 0 + 2804 71 1 1.3914 6.9046 -2.9730 0 0 0 + 2805 71 1 1.1846 7.5396 -2.3495 0 0 0 + 2806 71 1 1.8094 8.2016 -2.0883 0 0 0 + 2807 71 1 2.0157 -7.5271 -1.5117 0 1 0 + 2808 71 1 1.2253 -7.0739 -1.6122 0 1 0 + 2809 71 1 1.4520 -6.3805 -2.2578 0 1 0 + 2810 71 1 0.8350 -7.0145 -2.7146 0 1 0 + 2811 71 1 0.8228 -7.8674 -2.2592 0 1 0 + 2812 71 1 0.4465 -8.0736 -3.1855 0 1 0 + 2813 71 1 -0.4735 8.1900 -3.0575 0 0 0 + 2814 71 1 -0.9685 -7.7322 -2.4739 0 1 0 + 2815 71 1 -0.1654 -7.4123 -2.0916 0 1 0 + 2816 71 1 0.1818 -6.5348 -2.0419 0 1 0 + 2817 71 1 -0.4268 -5.7404 -2.0002 0 1 0 + 2818 71 1 -1.1987 -5.2354 -2.2543 0 1 0 + 2819 71 1 -2.1763 -5.3984 -2.2662 0 1 0 + 2820 71 1 -3.1053 -5.7011 -2.1997 0 1 0 + 2821 71 1 -4.0505 -5.5000 -2.0332 0 1 0 + 2822 71 1 -3.9139 -4.7316 -1.4829 0 1 0 + 2823 71 1 -2.9947 -4.4213 -1.1548 0 1 0 + 2824 71 1 -2.1207 -4.0526 -0.8745 0 1 0 + 2825 71 1 -2.8878 -3.4684 -0.6574 0 1 0 + 2826 71 1 -3.6129 -4.1016 -0.4541 0 1 0 + 2827 71 1 -3.9613 -4.9452 -0.2105 0 1 0 + 2828 71 1 -4.3625 -5.4519 -0.9283 0 1 0 + 2829 71 1 -4.5143 -6.2263 -0.3886 0 1 0 + 2830 71 1 -3.5413 -6.1604 -0.2444 0 1 0 + 2831 71 1 -3.1747 -5.3937 -0.6363 0 1 0 + 2832 71 1 -2.3643 -4.9725 -0.2860 0 1 0 + 2833 71 1 -2.0372 -4.2093 0.1375 0 1 0 + 2834 71 1 -2.4017 -3.4047 0.5090 0 1 0 + 2835 71 1 -1.9475 -3.8077 1.2357 0 1 0 + 2836 71 1 -1.4346 -4.5171 0.8644 0 1 0 + 2837 71 1 -2.2775 -4.9999 0.8410 0 1 0 + 2838 71 1 -3.1193 -5.0385 0.4440 0 1 0 + 2839 71 1 -3.7680 -4.3967 0.6715 0 1 0 + 2840 71 1 -3.4917 -3.5296 0.4755 0 1 0 + 2841 72 2 2.2052 -3.0770 -1.6560 0 0 0 + 2842 72 2 1.7247 -3.7608 -2.2275 0 0 0 + 2843 72 2 0.9435 -4.2536 -2.1236 0 0 0 + 2844 72 2 1.1512 -4.7158 -1.3417 0 0 0 + 2845 72 2 0.5981 -4.1904 -0.7393 0 0 0 + 2846 72 2 1.2922 -4.2027 -0.0367 0 0 0 + 2847 72 2 1.6837 -4.9806 -0.3833 0 0 0 + 2848 72 2 2.3334 -5.6649 -0.1521 0 0 0 + 2849 72 2 2.4515 -5.3527 0.7860 0 0 0 + 2850 72 2 1.9155 -4.6825 1.1666 0 0 0 + 2851 72 2 1.3595 -5.3600 0.7279 0 0 0 + 2852 72 2 1.1771 -6.1205 1.2399 0 0 0 + 2853 72 2 0.9675 -7.0596 1.3991 0 0 0 + 2854 72 2 0.0614 -7.3980 1.5681 0 0 0 + 2855 72 2 -0.4532 -7.9220 0.9893 0 0 0 + 2856 72 2 -1.1781 7.8937 1.1199 0 -1 0 + 2857 72 2 -0.4163 7.3162 1.1825 0 -1 0 + 2858 72 2 0.0591 7.3911 0.3189 0 -1 0 + 2859 72 2 -0.6193 7.9560 -0.0046 0 -1 0 + 2860 72 2 -1.2355 -8.0459 -0.5408 0 0 0 + 2861 72 2 -1.3034 -7.3745 -1.3272 0 0 0 + 2862 72 2 -0.7116 -6.7042 -0.9020 0 0 0 + 2863 72 2 0.0773 -6.2414 -0.5338 0 0 0 + 2864 72 2 0.7869 -5.6879 -0.1662 0 0 0 + 2865 72 2 0.5039 -4.8306 0.1575 0 0 0 + 2866 72 2 0.8009 -4.2132 0.8042 0 0 0 + 2867 72 2 0.1640 -3.8767 1.4086 0 0 0 + 2868 72 2 0.8524 -4.1034 2.0106 0 0 0 + 2869 72 2 1.7769 -4.1193 2.0836 0 0 0 + 2870 72 2 2.4693 -4.5044 2.6736 0 0 0 + 2871 72 2 1.6417 -4.9026 3.0593 0 0 0 + 2872 72 2 1.5420 -3.9638 3.0425 0 0 0 + 2873 72 2 1.6948 -3.2039 2.4392 0 0 0 + 2874 72 2 2.0352 -2.7152 1.6846 0 0 0 + 2875 72 2 2.7977 -2.3047 1.2260 0 0 0 + 2876 72 2 3.5877 -2.7740 1.1227 0 0 0 + 2877 72 2 4.4018 -3.1156 0.7097 0 0 0 + 2878 72 2 4.8043 -2.6334 -0.0242 0 0 0 + 2879 72 2 4.7271 -2.8401 -0.9948 0 0 0 + 2880 72 2 5.2014 -3.6112 -1.1305 0 0 0 + 2881 73 1 6.0593 -7.8306 7.7923 0 0 0 + 2882 73 1 6.7361 -7.1806 8.1031 0 0 0 + 2883 73 1 7.4007 -7.8601 8.0135 0 0 0 + 2884 73 1 7.5445 -7.9231 7.0918 0 0 0 + 2885 73 1 -8.0458 8.0072 7.0844 1 -1 0 + 2886 73 1 -7.7306 7.0759 6.9960 1 -1 0 + 2887 73 1 -7.0245 6.5600 6.7767 1 -1 0 + 2888 73 1 -6.1124 6.8904 6.6002 1 -1 0 + 2889 73 1 -5.3373 7.5149 6.5857 1 -1 0 + 2890 73 1 -4.8968 8.1471 7.2132 1 -1 0 + 2891 73 1 -5.2331 -7.8458 7.9896 1 0 0 + 2892 73 1 -5.9243 -7.3084 -8.0557 1 0 1 + 2893 73 1 -6.3815 -6.6278 7.9940 1 0 0 + 2894 73 1 -7.0199 -6.0613 7.6251 1 0 0 + 2895 73 1 -7.1005 -5.8981 -7.8415 1 0 1 + 2896 73 1 -7.0136 -4.9746 -7.4516 1 0 1 + 2897 73 1 -6.3913 -5.6690 -7.1684 1 0 1 + 2898 73 1 -5.7122 -5.8369 -6.4673 1 0 1 + 2899 73 1 -5.3764 -5.0394 -6.1426 1 0 1 + 2900 73 1 -4.8091 -4.3288 -5.8471 1 0 1 + 2901 73 1 -4.5821 -4.1063 -4.9633 1 0 1 + 2902 73 1 -3.9791 -4.7901 -4.8939 1 0 1 + 2903 73 1 -4.7114 -5.2558 -5.2823 1 0 1 + 2904 73 1 -5.2945 -5.0933 -4.5262 1 0 1 + 2905 73 1 -4.8751 -4.4976 -3.8335 1 0 1 + 2906 73 1 -5.3680 -4.0570 -3.1849 1 0 1 + 2907 73 1 -6.2234 -3.8208 -2.9087 1 0 1 + 2908 73 1 -7.0425 -4.3574 -2.9862 1 0 1 + 2909 73 1 -7.6860 -4.5283 -2.3209 1 0 1 + 2910 73 1 7.8662 -4.6450 -1.9802 0 0 1 + 2911 73 1 6.9494 -4.5846 -1.8176 0 0 1 + 2912 73 1 6.0248 -4.6923 -1.6617 0 0 1 + 2913 73 1 6.0712 -4.5434 -0.7359 0 0 1 + 2914 73 1 6.7546 -3.8851 -0.5006 0 0 1 + 2915 73 1 7.3399 -3.8454 -1.2447 0 0 1 + 2916 73 1 -8.1863 -3.7556 -1.7323 1 0 1 + 2917 73 1 -7.2354 -3.7069 -1.7711 1 0 1 + 2918 73 1 -6.3172 -3.4973 -1.5452 1 0 1 + 2919 73 1 -6.5111 -4.4185 -1.6620 1 0 1 + 2920 73 1 -6.8208 -5.2693 -1.9328 1 0 1 + 2921 74 2 3.9712 -2.9641 6.4727 0 0 0 + 2922 74 2 3.7953 -3.5939 5.7713 0 0 0 + 2923 74 2 3.4889 -4.0366 4.9609 0 0 0 + 2924 74 2 2.7959 -4.4581 4.5145 0 0 0 + 2925 74 2 2.6904 -4.9813 3.7385 0 0 0 + 2926 74 2 2.9251 -5.6697 3.1165 0 0 0 + 2927 74 2 3.4534 -6.4125 2.9289 0 0 0 + 2928 74 2 2.7413 -7.0254 2.8470 0 0 0 + 2929 74 2 1.8777 -7.1106 3.1872 0 0 0 + 2930 74 2 0.9159 -7.2220 3.3590 0 0 0 + 2931 74 2 0.2628 -6.5680 3.6869 0 0 0 + 2932 74 2 0.5742 -5.8446 3.0916 0 0 0 + 2933 74 2 0.5068 -5.6867 2.1574 0 0 0 + 2934 74 2 0.5045 -4.9640 1.5558 0 0 0 + 2935 74 2 -0.2377 -4.6383 2.1167 0 0 0 + 2936 74 2 -1.1062 -4.9220 1.8509 0 0 0 + 2937 74 2 -1.6984 -5.6387 1.5183 0 0 0 + 2938 74 2 -2.2100 -5.2307 2.1900 0 0 0 + 2939 74 2 -2.9242 -5.6879 1.6975 0 0 0 + 2940 74 2 -3.7235 -5.0836 1.5673 0 0 0 + 2941 74 2 -4.3143 -5.1528 2.3276 0 0 0 + 2942 74 2 -4.9179 -4.8094 1.7001 0 0 0 + 2943 74 2 -4.6726 -5.2451 0.8968 0 0 0 + 2944 74 2 -4.0052 -5.9147 0.6191 0 0 0 + 2945 74 2 -3.5210 -6.6770 0.9622 0 0 0 + 2946 74 2 -2.7164 -6.9827 1.3075 0 0 0 + 2947 74 2 -1.8157 -7.3230 1.6910 0 0 0 + 2948 74 2 -0.8976 -7.0637 1.8576 0 0 0 + 2949 74 2 -0.8469 -7.9980 2.0320 0 0 0 + 2950 74 2 -0.7153 7.4919 2.2553 0 -1 0 + 2951 74 2 -1.0061 6.6390 1.8962 0 -1 0 + 2952 74 2 -1.7005 6.2922 1.2825 0 -1 0 + 2953 74 2 -1.1152 5.6569 0.8604 0 -1 0 + 2954 74 2 -0.4460 4.9572 0.7140 0 -1 0 + 2955 74 2 0.0861 4.2943 0.9934 0 -1 0 + 2956 74 2 0.9390 4.3773 0.6487 0 -1 0 + 2957 74 2 1.5352 5.2000 0.6343 0 -1 0 + 2958 74 2 1.6205 4.6248 -0.1811 0 -1 0 + 2959 74 2 1.6115 3.6434 -0.2147 0 -1 0 + 2960 74 2 1.7634 3.2384 -1.0709 0 -1 0 + 2961 75 1 6.9342 0.5823 -5.0870 0 0 0 + 2962 75 1 6.7740 -0.2816 -4.7481 0 0 0 + 2963 75 1 6.8070 -0.1934 -3.7187 0 0 0 + 2964 75 1 6.1329 -0.3231 -3.1066 0 0 0 + 2965 75 1 6.9775 -0.8707 -2.8982 0 0 0 + 2966 75 1 7.4574 -0.0558 -2.7352 0 0 0 + 2967 75 1 6.9904 0.6676 -3.0617 0 0 0 + 2968 75 1 7.0433 1.3720 -2.5419 0 0 0 + 2969 75 1 7.9779 1.2648 -2.3569 0 0 0 + 2970 75 1 -7.8678 1.3403 -1.6224 1 0 0 + 2971 75 1 -7.6618 2.1674 -2.0714 1 0 0 + 2972 75 1 -7.7303 2.5825 -2.9449 1 0 0 + 2973 75 1 -8.0851 2.7617 -3.8777 1 0 0 + 2974 75 1 -7.1600 3.0226 -4.0742 1 0 0 + 2975 75 1 -6.2896 2.9428 -4.4428 1 0 0 + 2976 75 1 -5.6914 2.5186 -5.0789 1 0 0 + 2977 75 1 -5.1478 2.8991 -4.4133 1 0 0 + 2978 75 1 -4.6102 2.3171 -3.9774 1 0 0 + 2979 75 1 -4.3406 3.1294 -3.6253 1 0 0 + 2980 75 1 -4.7868 3.9082 -3.9850 1 0 0 + 2981 75 1 -5.5744 4.2865 -4.3239 1 0 0 + 2982 75 1 -5.7796 5.1955 -4.5687 1 0 0 + 2983 75 1 -5.5576 6.0725 -4.7381 1 0 0 + 2984 75 1 -5.6325 6.7513 -5.4743 1 0 0 + 2985 75 1 -5.8566 6.7071 -6.3672 1 0 0 + 2986 75 1 -6.0665 6.9692 -7.2628 1 0 0 + 2987 75 1 -6.0248 6.9972 8.1915 1 0 -1 + 2988 75 1 -5.7664 7.8061 7.6094 1 0 -1 + 2989 75 1 -6.4924 7.9835 6.8254 1 0 -1 + 2990 75 1 -6.7996 7.3973 7.5078 1 0 -1 + 2991 75 1 -7.1398 7.0054 -8.0462 1 0 0 + 2992 75 1 -6.6210 7.7979 -7.9479 1 0 0 + 2993 75 1 -6.8441 -7.8060 -7.6166 1 1 0 + 2994 75 1 -6.8975 -8.0963 -6.7354 1 1 0 + 2995 75 1 -7.6972 -7.9115 -6.2602 1 1 0 + 2996 75 1 -7.7437 7.6612 -5.8181 1 0 0 + 2997 75 1 7.9529 8.1948 -5.5797 0 0 0 + 2998 75 1 7.9572 -7.2812 -5.6822 0 1 0 + 2999 75 1 8.0706 -6.5887 -5.1105 0 1 0 + 3000 75 1 -8.1006 -5.8448 -4.5805 1 1 0 + 3001 76 2 -1.2817 -1.4459 4.6417 0 0 0 + 3002 76 2 -1.5550 -0.9458 3.9243 0 0 0 + 3003 76 2 -1.7657 -0.4986 3.0806 0 0 0 + 3004 76 2 -2.5235 -1.0329 2.8672 0 0 0 + 3005 76 2 -3.4207 -1.2651 2.9530 0 0 0 + 3006 76 2 -4.2880 -1.0084 2.7139 0 0 0 + 3007 76 2 -3.7989 -1.8206 2.2710 0 0 0 + 3008 76 2 -2.9706 -2.2995 2.2170 0 0 0 + 3009 76 2 -2.4426 -2.5364 1.4391 0 0 0 + 3010 76 2 -1.6504 -2.8062 1.9911 0 0 0 + 3011 76 2 -1.8923 -2.1602 2.7060 0 0 0 + 3012 76 2 -2.6296 -2.0983 3.2592 0 0 0 + 3013 76 2 -3.4115 -2.6017 3.0926 0 0 0 + 3014 76 2 -4.1253 -3.1984 2.9040 0 0 0 + 3015 76 2 -4.0659 -3.8545 2.1806 0 0 0 + 3016 76 2 -3.2609 -3.5633 2.6174 0 0 0 + 3017 76 2 -2.4587 -3.1519 2.8731 0 0 0 + 3018 76 2 -1.4788 -3.1211 2.9561 0 0 0 + 3019 76 2 -1.5651 -2.7924 3.8302 0 0 0 + 3020 76 2 -1.2288 -1.9586 3.5857 0 0 0 + 3021 76 2 -0.8677 -1.0994 3.2096 0 0 0 + 3022 76 2 -0.0119 -0.6477 3.2099 0 0 0 + 3023 76 2 0.5280 -0.5058 2.3917 0 0 0 + 3024 76 2 1.2041 0.0316 2.7753 0 0 0 + 3025 76 2 1.5986 0.6220 3.3671 0 0 0 + 3026 76 2 1.5860 1.4829 2.8643 0 0 0 + 3027 76 2 1.2693 1.9757 3.7173 0 0 0 + 3028 76 2 0.7292 2.6441 4.0742 0 0 0 + 3029 76 2 0.2422 3.3387 4.5966 0 0 0 + 3030 76 2 1.1257 3.6586 4.3508 0 0 0 + 3031 76 2 1.0423 3.4077 3.4276 0 0 0 + 3032 76 2 1.7950 4.0017 3.2022 0 0 0 + 3033 76 2 2.1550 3.3090 3.7335 0 0 0 + 3034 76 2 1.8640 2.8698 4.5271 0 0 0 + 3035 76 2 1.1154 2.7083 5.0388 0 0 0 + 3036 76 2 1.3910 1.8104 4.8281 0 0 0 + 3037 76 2 2.2991 1.6809 4.5480 0 0 0 + 3038 76 2 2.3122 2.2059 3.7482 0 0 0 + 3039 76 2 1.7799 2.6092 3.0626 0 0 0 + 3040 76 2 1.4281 3.2741 2.4595 0 0 0 + 3041 77 1 -1.8315 5.5893 6.2620 0 0 0 + 3042 77 1 -2.4674 5.7019 5.5694 0 0 0 + 3043 77 1 -3.0441 5.2930 4.9227 0 0 0 + 3044 77 1 -3.4259 5.2972 4.0762 0 0 0 + 3045 77 1 -4.0494 4.6488 4.0111 0 0 0 + 3046 77 1 -4.8058 4.2801 4.4482 0 0 0 + 3047 77 1 -5.5411 4.1606 5.0775 0 0 0 + 3048 77 1 -6.2021 3.9297 4.4189 0 0 0 + 3049 77 1 -6.4192 3.5183 3.6054 0 0 0 + 3050 77 1 -6.2622 3.4131 2.6147 0 0 0 + 3051 77 1 -6.2505 3.3400 1.6362 0 0 0 + 3052 77 1 -5.6075 3.3997 0.9667 0 0 0 + 3053 77 1 -5.8485 2.5623 0.6288 0 0 0 + 3054 77 1 -5.1063 2.0430 0.5823 0 0 0 + 3055 77 1 -5.3775 1.4730 -0.2050 0 0 0 + 3056 77 1 -4.8140 0.9978 -0.7989 0 0 0 + 3057 77 1 -4.8026 1.2084 -1.7987 0 0 0 + 3058 77 1 -5.7620 1.2550 -1.7990 0 0 0 + 3059 77 1 -6.2712 1.7999 -2.4255 0 0 0 + 3060 77 1 -6.9910 1.7089 -2.9882 0 0 0 + 3061 77 1 -7.5555 1.8035 -3.8054 0 0 0 + 3062 77 1 -7.5052 1.6475 -4.7822 0 0 0 + 3063 77 1 -7.8312 1.5967 -5.6538 0 0 0 + 3064 77 1 7.7354 1.2156 -5.9110 -1 0 0 + 3065 77 1 6.8572 0.9468 -6.1843 -1 0 0 + 3066 77 1 6.3632 0.1786 -5.8624 -1 0 0 + 3067 77 1 5.9758 -0.6707 -5.9288 -1 0 0 + 3068 77 1 6.0363 -1.0977 -6.8274 -1 0 0 + 3069 77 1 6.5269 -1.7933 -7.2356 -1 0 0 + 3070 77 1 6.8594 -1.9949 -8.1140 -1 0 0 + 3071 77 1 7.0473 -2.8569 7.9839 -1 0 -1 + 3072 77 1 7.2085 -3.7922 7.9840 -1 0 -1 + 3073 77 1 6.8554 -4.1697 7.1288 -1 0 -1 + 3074 77 1 6.6687 -4.9003 6.5755 -1 0 -1 + 3075 77 1 5.8194 -5.2925 6.7968 -1 0 -1 + 3076 77 1 5.4828 -6.1114 6.4093 -1 0 -1 + 3077 77 1 5.3889 -6.6957 7.1820 -1 0 -1 + 3078 77 1 6.3215 -7.0370 7.1217 -1 0 -1 + 3079 77 1 6.4387 -6.2449 7.5754 -1 0 -1 + 3080 77 1 6.6548 -6.1188 6.7047 -1 0 -1 + 3081 78 2 -0.1144 5.6959 -5.5731 0 0 0 + 3082 78 2 0.5363 5.0237 -5.7555 0 0 0 + 3083 78 2 0.7649 4.1408 -6.2806 0 0 0 + 3084 78 2 0.4312 4.3368 -7.1589 0 0 0 + 3085 78 2 -0.3565 4.2460 -7.8534 0 0 0 + 3086 78 2 -1.2519 4.1110 8.1531 0 0 -1 + 3087 78 2 -1.8538 4.7273 7.6672 0 0 -1 + 3088 78 2 -0.9889 5.0411 7.8806 0 0 -1 + 3089 78 2 -0.4565 4.5466 7.3694 0 0 -1 + 3090 78 2 -0.6182 4.0205 6.6269 0 0 -1 + 3091 78 2 -1.1819 3.6024 7.2484 0 0 -1 + 3092 78 2 -1.3548 2.6809 7.0174 0 0 -1 + 3093 78 2 -0.8919 2.3698 6.2240 0 0 -1 + 3094 78 2 0.0060 2.2917 5.7702 0 0 -1 + 3095 78 2 0.1852 2.0898 4.8117 0 0 -1 + 3096 78 2 0.2475 1.7127 3.9644 0 0 -1 + 3097 78 2 0.7443 1.0365 4.4913 0 0 -1 + 3098 78 2 0.5446 0.9964 5.4356 0 0 -1 + 3099 78 2 0.7008 0.7449 6.3406 0 0 -1 + 3100 78 2 -0.1419 0.4801 6.0336 0 0 -1 + 3101 78 2 -1.0332 0.4454 5.6882 0 0 -1 + 3102 78 2 -1.2409 0.3176 4.7706 0 0 -1 + 3103 78 2 -1.6957 0.7961 3.9699 0 0 -1 + 3104 78 2 -1.1422 0.0552 3.6764 0 0 -1 + 3105 78 2 -0.3302 0.4836 3.9764 0 0 -1 + 3106 78 2 -0.2820 0.9524 4.8036 0 0 -1 + 3107 78 2 -0.5845 1.4288 5.5895 0 0 -1 + 3108 78 2 -1.4592 1.3218 5.1290 0 0 -1 + 3109 78 2 -2.1333 0.6468 5.3721 0 0 -1 + 3110 78 2 -2.4826 -0.2116 5.6582 0 0 -1 + 3111 78 2 -3.0180 -0.3755 6.3910 0 0 -1 + 3112 78 2 -2.6795 -0.7867 7.2467 0 0 -1 + 3113 78 2 -2.2935 -0.0539 7.7751 0 0 -1 + 3114 78 2 -1.7200 0.5145 -8.1975 0 0 0 + 3115 78 2 -0.7647 0.4276 -8.1330 0 0 0 + 3116 78 2 0.1856 0.6136 -7.9183 0 0 0 + 3117 78 2 0.6616 1.3907 -7.7027 0 0 0 + 3118 78 2 0.6946 2.3051 -7.3666 0 0 0 + 3119 78 2 -0.2844 2.3614 -7.6186 0 0 0 + 3120 78 2 -0.9296 2.2674 8.0967 0 0 -1 + 3121 79 1 -8.0941 2.6759 4.9747 0 0 0 + 3122 79 1 -7.6157 3.3722 5.4347 0 0 0 + 3123 79 1 -7.1003 3.9935 6.0455 0 0 0 + 3124 79 1 -7.0933 3.0918 6.5466 0 0 0 + 3125 79 1 -7.2080 2.3740 5.9164 0 0 0 + 3126 79 1 -6.9138 1.9214 5.1566 0 0 0 + 3127 79 1 -6.4246 1.3576 4.6159 0 0 0 + 3128 79 1 -5.8571 0.8659 3.9300 0 0 0 + 3129 79 1 -5.9144 0.1116 3.3629 0 0 0 + 3130 79 1 -5.0659 0.0628 3.8891 0 0 0 + 3131 79 1 -4.7708 -0.4477 4.6477 0 0 0 + 3132 79 1 -4.4853 -0.8688 5.4274 0 0 0 + 3133 79 1 -4.2955 -1.6414 5.9900 0 0 0 + 3134 79 1 -5.1853 -1.6998 5.6826 0 0 0 + 3135 79 1 -5.0988 -1.4298 4.7860 0 0 0 + 3136 79 1 -5.9610 -1.2211 5.0177 0 0 0 + 3137 79 1 -5.4716 -0.5485 5.4255 0 0 0 + 3138 79 1 -5.7130 0.1909 5.9274 0 0 0 + 3139 79 1 -5.6818 0.4380 4.9185 0 0 0 + 3140 79 1 -4.8376 0.8873 4.8537 0 0 0 + 3141 79 1 -5.3301 1.6993 4.8322 0 0 0 + 3142 79 1 -5.9495 1.6832 5.5168 0 0 0 + 3143 79 1 -6.0888 2.1984 6.2602 0 0 0 + 3144 79 1 -6.8318 1.7552 6.7369 0 0 0 + 3145 79 1 -7.4307 1.2980 6.1721 0 0 0 + 3146 79 1 -7.6507 0.4642 5.6465 0 0 0 + 3147 79 1 8.0203 0.4001 5.0932 -1 0 0 + 3148 79 1 7.4313 0.6006 4.3732 -1 0 0 + 3149 79 1 6.5206 0.4132 4.1884 -1 0 0 + 3150 79 1 6.3158 -0.4789 3.9429 -1 0 0 + 3151 79 1 6.0411 -1.4253 4.0369 -1 0 0 + 3152 79 1 6.3784 -1.9618 4.7345 -1 0 0 + 3153 79 1 6.8196 -2.1411 5.5833 -1 0 0 + 3154 79 1 7.5996 -2.6124 5.9755 -1 0 0 + 3155 79 1 7.7464 -3.4518 5.4314 -1 0 0 + 3156 79 1 -7.7777 -3.2166 5.7260 0 0 0 + 3157 79 1 -7.6438 -3.1974 6.7293 0 0 0 + 3158 79 1 -7.3382 -3.5114 7.5899 0 0 0 + 3159 79 1 -7.8103 -4.0197 8.1482 0 0 0 + 3160 79 1 -7.9347 -4.4569 -7.3933 0 0 1 + 3161 80 2 -7.5891 -5.2874 7.9547 0 0 0 + 3162 80 2 -6.9871 -4.5784 7.6441 0 0 0 + 3163 80 2 -6.4150 -4.4882 6.8386 0 0 0 + 3164 80 2 -5.5313 -4.2697 6.6682 0 0 0 + 3165 80 2 -4.8372 -3.6055 6.7143 0 0 0 + 3166 80 2 -4.0589 -3.1064 6.4477 0 0 0 + 3167 80 2 -4.0936 -3.2095 7.3810 0 0 0 + 3168 80 2 -4.7128 -3.9233 7.6706 0 0 0 + 3169 80 2 -5.1956 -4.1100 -7.9116 0 0 1 + 3170 80 2 -5.5378 -4.1453 -6.9820 0 0 1 + 3171 80 2 -5.0120 -4.8925 -7.0881 0 0 1 + 3172 80 2 -4.6158 -5.8050 -7.1836 0 0 1 + 3173 80 2 -4.4083 -5.4022 -6.3706 0 0 1 + 3174 80 2 -3.8373 -5.7521 -5.7152 0 0 1 + 3175 80 2 -2.9850 -6.0000 -5.3578 0 0 1 + 3176 80 2 -2.0502 -5.9952 -5.7025 0 0 1 + 3177 80 2 -1.4274 -6.5009 -5.2261 0 0 1 + 3178 80 2 -1.3955 -7.2929 -4.6706 0 0 1 + 3179 80 2 -1.3599 -8.1603 -4.1951 0 0 1 + 3180 80 2 -2.2356 7.8876 -4.0969 0 -1 1 + 3181 80 2 -3.0769 7.9674 -3.7280 0 -1 1 + 3182 80 2 -3.4862 7.2498 -3.2879 0 -1 1 + 3183 80 2 -4.1697 6.7320 -2.9419 0 -1 1 + 3184 80 2 -4.6713 6.3526 -3.7217 0 -1 1 + 3185 80 2 -3.8060 6.3117 -4.0619 0 -1 1 + 3186 80 2 -3.2834 6.1696 -4.8608 0 -1 1 + 3187 80 2 -2.3440 5.9486 -4.7910 0 -1 1 + 3188 80 2 -1.6836 6.3336 -4.1419 0 -1 1 + 3189 80 2 -1.7995 5.4374 -3.7977 0 -1 1 + 3190 80 2 -2.1763 4.6022 -3.6147 0 -1 1 + 3191 80 2 -2.6015 4.8160 -2.7150 0 -1 1 + 3192 80 2 -3.0024 5.5359 -2.2200 0 -1 1 + 3193 80 2 -2.7350 6.1103 -1.4854 0 -1 1 + 3194 80 2 -2.3259 6.5185 -0.7205 0 -1 1 + 3195 80 2 -2.1796 6.1758 0.2398 0 -1 1 + 3196 80 2 -2.0711 5.3155 0.6096 0 -1 1 + 3197 80 2 -1.4964 4.5998 0.6437 0 -1 1 + 3198 80 2 -1.3284 4.4775 -0.2668 0 -1 1 + 3199 80 2 -1.2092 4.1177 -1.0795 0 -1 1 + 3200 80 2 -0.5103 4.2055 -1.7125 0 -1 1 + 3201 81 1 2.0033 6.8319 3.7207 0 0 0 + 3202 81 1 2.8698 6.6677 4.1319 0 0 0 + 3203 81 1 3.0299 6.0722 3.4814 0 0 0 + 3204 81 1 3.0646 5.1769 3.1667 0 0 0 + 3205 81 1 3.4298 4.4601 3.6173 0 0 0 + 3206 81 1 2.9378 3.8412 3.0576 0 0 0 + 3207 81 1 2.3302 3.7509 2.3123 0 0 0 + 3208 81 1 2.0286 3.4078 1.4806 0 0 0 + 3209 81 1 2.3126 3.4764 0.5326 0 0 0 + 3210 81 1 2.6501 3.1391 -0.3302 0 0 0 + 3211 81 1 2.7101 2.5634 -1.0810 0 0 0 + 3212 81 1 2.5486 2.0625 -1.9444 0 0 0 + 3213 81 1 2.7357 1.4122 -2.6292 0 0 0 + 3214 81 1 3.5080 0.9971 -2.1118 0 0 0 + 3215 81 1 3.6540 0.1128 -2.2834 0 0 0 + 3216 81 1 3.9842 -0.5815 -1.7188 0 0 0 + 3217 81 1 3.7038 -0.6103 -0.7882 0 0 0 + 3218 81 1 3.8569 -1.1996 -0.0919 0 0 0 + 3219 81 1 3.6434 -1.8700 0.6035 0 0 0 + 3220 81 1 3.2325 -2.4924 0.0348 0 0 0 + 3221 81 1 2.8472 -2.8769 -0.7445 0 0 0 + 3222 81 1 2.9113 -2.2440 -1.4138 0 0 0 + 3223 81 1 3.4418 -1.4270 -1.5531 0 0 0 + 3224 81 1 2.8876 -0.6259 -1.7148 0 0 0 + 3225 81 1 2.2139 -0.1700 -1.1807 0 0 0 + 3226 81 1 1.3499 0.1763 -1.1777 0 0 0 + 3227 81 1 2.0099 0.6981 -0.7027 0 0 0 + 3228 81 1 2.7981 1.0348 -0.3277 0 0 0 + 3229 81 1 2.8708 1.4349 -1.1313 0 0 0 + 3230 81 1 2.0807 1.1607 -1.6354 0 0 0 + 3231 81 1 1.2100 0.9960 -1.9521 0 0 0 + 3232 81 1 1.4753 1.7965 -2.3903 0 0 0 + 3233 81 1 1.7493 2.7084 -2.3187 0 0 0 + 3234 81 1 1.9693 3.6098 -2.1284 0 0 0 + 3235 81 1 1.0972 3.4337 -1.7316 0 0 0 + 3236 81 1 0.8740 4.2069 -1.1945 0 0 0 + 3237 81 1 1.8211 4.4632 -1.1505 0 0 0 + 3238 81 1 1.4442 5.0508 -1.8094 0 0 0 + 3239 81 1 1.6942 4.6790 -2.6288 0 0 0 + 3240 81 1 2.5193 4.4397 -2.1799 0 0 0 + 3241 82 2 2.8035 5.4342 0.1406 0 0 0 + 3242 82 2 2.4059 5.3175 -0.6869 0 0 0 + 3243 82 2 1.4657 5.4770 -0.8288 0 0 0 + 3244 82 2 0.5472 5.6197 -0.8903 0 0 0 + 3245 82 2 -0.0632 4.9012 -1.0594 0 0 0 + 3246 82 2 -0.9943 5.1669 -1.3321 0 0 0 + 3247 82 2 -0.4703 5.9728 -1.4514 0 0 0 + 3248 82 2 -0.0613 6.7430 -1.0974 0 0 0 + 3249 82 2 0.2803 6.3037 -0.3104 0 0 0 + 3250 82 2 0.3915 5.5363 0.2314 0 0 0 + 3251 82 2 0.1658 4.6483 -0.0237 0 0 0 + 3252 82 2 0.1882 3.6062 0.0509 0 0 0 + 3253 82 2 -0.7526 3.7446 0.2834 0 0 0 + 3254 82 2 -1.7144 3.6854 0.3574 0 0 0 + 3255 82 2 -2.2547 3.6602 1.1012 0 0 0 + 3256 82 2 -2.7178 3.8188 1.9408 0 0 0 + 3257 82 2 -3.0884 4.0781 2.7354 0 0 0 + 3258 82 2 -3.0772 4.4458 3.5928 0 0 0 + 3259 82 2 -2.4402 4.8646 4.0815 0 0 0 + 3260 82 2 -2.1679 5.6419 4.5417 0 0 0 + 3261 82 2 -2.1752 6.5997 4.6722 0 0 0 + 3262 82 2 -2.2748 7.4591 5.1067 0 0 0 + 3263 82 2 -1.2773 7.5528 4.9973 0 0 0 + 3264 82 2 -1.1718 6.8584 4.2710 0 0 0 + 3265 82 2 -0.4208 6.2829 4.1256 0 0 0 + 3266 82 2 0.4135 6.0437 4.5138 0 0 0 + 3267 82 2 0.9012 6.0770 5.3176 0 0 0 + 3268 82 2 1.6452 6.4923 4.7634 0 0 0 + 3269 82 2 1.7342 5.7460 4.0970 0 0 0 + 3270 82 2 2.3130 4.9240 4.1370 0 0 0 + 3271 82 2 1.3879 4.7148 4.2637 0 0 0 + 3272 82 2 0.5044 4.5856 4.7137 0 0 0 + 3273 82 2 0.0272 5.3027 5.0995 0 0 0 + 3274 82 2 -0.7555 5.4781 4.5416 0 0 0 + 3275 82 2 -0.1894 5.1195 3.7988 0 0 0 + 3276 82 2 -1.0140 4.5855 3.7190 0 0 0 + 3277 82 2 -1.5623 3.9266 3.3659 0 0 0 + 3278 82 2 -2.1905 3.4657 2.8247 0 0 0 + 3279 82 2 -2.6714 2.7706 3.4397 0 0 0 + 3280 82 2 -3.5433 3.0764 3.2039 0 0 0 + 3281 83 1 0.6668 -8.0107 -7.8989 0 0 0 + 3282 83 1 -0.1957 8.0294 -7.7013 0 -1 0 + 3283 83 1 -0.2364 -7.5422 -8.0857 0 0 0 + 3284 83 1 -0.2792 -6.6855 7.8964 0 0 -1 + 3285 83 1 -0.1022 -5.8121 7.5085 0 0 -1 + 3286 83 1 -0.2693 -5.0966 8.1156 0 0 -1 + 3287 83 1 -0.6624 -4.4139 -7.7318 0 0 0 + 3288 83 1 -0.1924 -4.1306 -7.0123 0 0 0 + 3289 83 1 0.5369 -4.2046 -6.3660 0 0 0 + 3290 83 1 0.9324 -5.0394 -5.9691 0 0 0 + 3291 83 1 0.6851 -5.9001 -5.5309 0 0 0 + 3292 83 1 1.4679 -5.9725 -5.0555 0 0 0 + 3293 83 1 1.3546 -6.0824 -4.1029 0 0 0 + 3294 83 1 0.8026 -6.0304 -3.3255 0 0 0 + 3295 83 1 -0.0281 -6.1107 -3.7997 0 0 0 + 3296 83 1 0.0519 -5.5832 -4.5631 0 0 0 + 3297 83 1 0.4431 -4.7297 -4.8507 0 0 0 + 3298 83 1 0.1938 -4.2544 -4.0775 0 0 0 + 3299 83 1 1.0549 -3.8919 -4.3424 0 0 0 + 3300 83 1 1.9328 -3.5775 -4.5334 0 0 0 + 3301 83 1 2.8535 -3.4042 -4.6631 0 0 0 + 3302 83 1 3.0281 -3.9561 -3.9257 0 0 0 + 3303 83 1 3.8332 -4.3885 -3.5710 0 0 0 + 3304 83 1 4.5037 -5.2506 -3.5141 0 0 0 + 3305 83 1 4.9699 -6.0853 -3.2613 0 0 0 + 3306 83 1 5.8597 -6.3504 -3.1677 0 0 0 + 3307 83 1 6.7163 -6.0074 -3.5795 0 0 0 + 3308 83 1 7.2193 -5.8823 -4.3384 0 0 0 + 3309 83 1 7.6121 -5.0428 -4.6991 0 0 0 + 3310 83 1 7.6528 -4.2680 -5.2117 0 0 0 + 3311 83 1 6.8180 -4.2509 -4.7667 0 0 0 + 3312 83 1 6.6556 -5.0404 -4.2498 0 0 0 + 3313 83 1 7.4391 -5.0059 -3.6999 0 0 0 + 3314 83 1 -7.9661 -4.8599 -3.4998 1 0 0 + 3315 83 1 7.8676 -4.3946 -2.9344 0 0 0 + 3316 83 1 7.9898 -3.5889 -3.3957 0 0 0 + 3317 83 1 7.4032 -2.8143 -3.2650 0 0 0 + 3318 83 1 7.0450 -3.3456 -2.5716 0 0 0 + 3319 83 1 6.4933 -3.0102 -1.8268 0 0 0 + 3320 83 1 5.6903 -2.8069 -1.3697 0 0 0 + 3321 84 2 -3.5540 -4.7927 4.6395 0 0 0 + 3322 84 2 -4.2580 -5.3775 4.4543 0 0 0 + 3323 84 2 -5.1207 -5.5486 4.6318 0 0 0 + 3324 84 2 -6.0659 -5.6897 4.8918 0 0 0 + 3325 84 2 -5.8741 -5.4467 5.7689 0 0 0 + 3326 84 2 -5.8484 -5.7301 6.6404 0 0 0 + 3327 84 2 -6.7371 -5.4697 6.5802 0 0 0 + 3328 84 2 -7.6269 -5.3856 6.3342 0 0 0 + 3329 84 2 -8.1019 -4.8477 5.6968 0 0 0 + 3330 84 2 -7.8309 -5.3344 4.8946 0 0 0 + 3331 84 2 8.1603 -6.2179 4.9639 -1 0 0 + 3332 84 2 7.6730 -7.0114 5.1511 -1 0 0 + 3333 84 2 6.8141 -7.0485 4.8060 -1 0 0 + 3334 84 2 6.4552 -6.9840 3.9096 -1 0 0 + 3335 84 2 5.7781 -6.8471 3.2014 -1 0 0 + 3336 84 2 5.3792 -6.5919 2.3728 -1 0 0 + 3337 84 2 5.8140 -7.3512 1.8998 -1 0 0 + 3338 84 2 6.3585 -6.6927 1.5244 -1 0 0 + 3339 84 2 6.0040 -5.8205 1.2705 -1 0 0 + 3340 84 2 6.3506 -5.0591 0.8383 -1 0 0 + 3341 84 2 6.4833 -4.1646 0.6080 -1 0 0 + 3342 84 2 5.8449 -3.4696 0.8456 -1 0 0 + 3343 84 2 5.4978 -2.5982 0.9060 -1 0 0 + 3344 84 2 6.3793 -2.6885 1.3261 -1 0 0 + 3345 84 2 6.2560 -3.3729 1.9817 -1 0 0 + 3346 84 2 5.3244 -3.1192 1.8703 -1 0 0 + 3347 84 2 5.6760 -2.6973 2.6545 -1 0 0 + 3348 84 2 6.1335 -2.4734 3.4905 -1 0 0 + 3349 84 2 7.1003 -2.5036 3.6302 -1 0 0 + 3350 84 2 7.8349 -1.9735 3.4939 -1 0 0 + 3351 84 2 -8.0876 -1.1897 3.5194 0 0 0 + 3352 84 2 -7.7467 -0.3782 3.1008 0 0 0 + 3353 84 2 -7.1129 0.1569 3.4700 0 0 0 + 3354 84 2 -7.4553 -0.5607 4.0476 0 0 0 + 3355 84 2 -7.5756 -0.4134 5.0667 0 0 0 + 3356 84 2 -8.1936 -0.6078 5.7863 0 0 0 + 3357 84 2 7.3288 -0.7421 5.9752 -1 0 0 + 3358 84 2 6.5007 -1.1859 6.0650 -1 0 0 + 3359 84 2 6.4572 -0.9608 5.1400 -1 0 0 + 3360 84 2 6.9117 -0.1462 5.0619 -1 0 0 + 3361 85 1 6.2235 -6.8960 5.8323 0 0 0 + 3362 85 1 6.6344 -6.1622 5.4501 0 0 0 + 3363 85 1 7.3343 -5.5147 5.4893 0 0 0 + 3364 85 1 7.6228 -5.4155 6.3544 0 0 0 + 3365 85 1 7.9044 -5.0268 7.1765 0 0 0 + 3366 85 1 7.8313 -4.7427 8.0588 0 0 0 + 3367 85 1 7.4549 -4.3525 -7.6034 0 0 1 + 3368 85 1 6.7288 -4.6916 -7.0658 0 0 1 + 3369 85 1 6.1011 -5.2377 -6.6340 0 0 1 + 3370 85 1 5.2096 -5.5577 -6.7611 0 0 1 + 3371 85 1 4.3041 -5.3915 -6.7868 0 0 1 + 3372 85 1 4.2789 -4.5044 -6.4749 0 0 1 + 3373 85 1 3.8010 -4.7392 -5.6396 0 0 1 + 3374 85 1 3.3597 -4.7634 -4.7755 0 0 1 + 3375 85 1 3.8478 -3.9504 -4.6073 0 0 1 + 3376 85 1 4.2974 -3.1628 -4.8490 0 0 1 + 3377 85 1 5.2178 -3.2176 -4.9810 0 0 1 + 3378 85 1 5.8949 -3.8850 -4.9987 0 0 1 + 3379 85 1 5.6961 -4.8167 -4.9661 0 0 1 + 3380 85 1 5.5515 -5.4731 -5.6487 0 0 1 + 3381 85 1 4.6361 -5.5580 -5.8681 0 0 1 + 3382 85 1 4.0846 -5.9724 -5.2883 0 0 1 + 3383 85 1 3.3827 -5.7411 -5.9648 0 0 1 + 3384 85 1 3.2656 -6.6019 -6.3394 0 0 1 + 3385 85 1 3.3408 -6.9568 -7.2497 0 0 1 + 3386 85 1 2.5908 -6.9775 -7.7931 0 0 1 + 3387 85 1 2.1273 -7.8612 -7.7466 0 0 1 + 3388 85 1 3.1037 -8.0650 -7.7829 0 0 1 + 3389 85 1 3.9665 7.8799 -7.9023 0 -1 1 + 3390 85 1 4.8408 8.1543 -7.7710 0 -1 1 + 3391 85 1 5.7501 7.8176 -7.8515 0 -1 1 + 3392 85 1 5.5954 7.6539 -6.9403 0 -1 1 + 3393 85 1 6.2278 -8.1790 -6.4592 0 0 1 + 3394 85 1 6.9191 -7.7721 -5.9915 0 0 1 + 3395 85 1 7.1172 -6.8701 -6.2283 0 0 1 + 3396 85 1 7.2903 -5.9747 -5.6796 0 0 1 + 3397 85 1 7.5587 -5.1182 -6.0055 0 0 1 + 3398 85 1 7.9012 -4.2789 -6.2956 0 0 1 + 3399 85 1 8.0693 -3.5124 -6.7963 0 0 1 + 3400 85 1 7.6254 -2.8340 -7.4615 0 0 1 + 3401 86 2 2.9781 0.0867 -0.1631 0 0 0 + 3402 86 2 3.5378 0.4403 -0.8823 0 0 0 + 3403 86 2 3.8897 1.3755 -0.9045 0 0 0 + 3404 86 2 3.9547 2.3039 -1.0643 0 0 0 + 3405 86 2 3.7488 2.9538 -0.3535 0 0 0 + 3406 86 2 3.5480 3.7543 0.1384 0 0 0 + 3407 86 2 3.6341 4.7020 0.1604 0 0 0 + 3408 86 2 3.7670 5.5070 -0.3364 0 0 0 + 3409 86 2 4.3623 6.1065 -0.6640 0 0 0 + 3410 86 2 4.8710 6.7310 -0.0918 0 0 0 + 3411 86 2 5.7183 6.5944 -0.5843 0 0 0 + 3412 86 2 5.4510 6.5146 -1.5240 0 0 0 + 3413 86 2 4.9209 6.5587 -2.3506 0 0 0 + 3414 86 2 5.3426 7.4093 -2.4317 0 0 0 + 3415 86 2 6.0878 6.9621 -2.7926 0 0 0 + 3416 86 2 6.7977 7.2819 -2.1707 0 0 0 + 3417 86 2 7.2697 8.0861 -1.8814 0 0 0 + 3418 86 2 6.6276 -8.1473 -2.5574 0 1 0 + 3419 86 2 7.0227 7.5743 -3.0753 0 0 0 + 3420 86 2 6.1498 7.7096 -3.5444 0 0 0 + 3421 86 2 6.1893 -7.7879 -3.4235 0 1 0 + 3422 86 2 6.8534 -7.1277 -3.7612 0 1 0 + 3423 86 2 7.6638 -7.0398 -4.1915 0 1 0 + 3424 86 2 -7.9784 -6.6111 -3.8438 1 1 0 + 3425 86 2 7.8246 -5.9967 -3.4596 0 1 0 + 3426 86 2 7.3431 -5.5950 -2.7351 0 1 0 + 3427 86 2 7.2672 -5.6387 -1.7745 0 1 0 + 3428 86 2 7.8618 -5.2440 -1.0848 0 1 0 + 3429 86 2 8.1403 -5.2822 -0.1746 0 1 0 + 3430 86 2 7.4344 -5.0307 0.4050 0 1 0 + 3431 86 2 7.2956 -4.8470 1.3359 0 1 0 + 3432 86 2 7.1875 -3.9449 1.2890 0 1 0 + 3433 86 2 7.5401 -3.0687 1.0339 0 1 0 + 3434 86 2 7.2945 -2.9488 1.9531 0 1 0 + 3435 86 2 7.5170 -2.0791 2.2437 0 1 0 + 3436 86 2 8.0812 -1.2960 2.1261 0 1 0 + 3437 86 2 -7.9684 -0.4646 1.9857 1 1 0 + 3438 86 2 -7.2039 -0.5794 1.4803 1 1 0 + 3439 86 2 -6.2631 -0.8277 1.2176 1 1 0 + 3440 86 2 -5.6301 -0.6821 0.5419 1 1 0 + 3441 87 1 -0.0448 0.8323 1.0716 0 0 0 + 3442 87 1 -0.9474 0.7492 1.0191 0 0 0 + 3443 87 1 -1.8881 0.7017 1.0203 0 0 0 + 3444 87 1 -2.2336 0.2673 0.3087 0 0 0 + 3445 87 1 -3.0412 0.6471 0.7287 0 0 0 + 3446 87 1 -3.7201 0.8882 1.3643 0 0 0 + 3447 87 1 -4.4875 0.6928 1.8393 0 0 0 + 3448 87 1 -5.1444 1.1911 1.4048 0 0 0 + 3449 87 1 -5.6616 1.9601 1.5318 0 0 0 + 3450 87 1 -6.3641 2.3117 2.0717 0 0 0 + 3451 87 1 -6.7929 2.5948 2.8942 0 0 0 + 3452 87 1 -5.9867 2.5202 3.3927 0 0 0 + 3453 87 1 -5.4869 1.8087 3.6768 0 0 0 + 3454 87 1 -5.1564 1.0165 3.2516 0 0 0 + 3455 87 1 -5.0482 0.2700 2.6807 0 0 0 + 3456 87 1 -4.1118 0.2457 3.0262 0 0 0 + 3457 87 1 -3.3951 0.6840 2.6201 0 0 0 + 3458 87 1 -2.8768 0.5555 1.8470 0 0 0 + 3459 87 1 -2.6302 -0.2483 1.3211 0 0 0 + 3460 87 1 -2.0053 -0.6378 1.9118 0 0 0 + 3461 87 1 -1.3882 -1.2437 2.3210 0 0 0 + 3462 87 1 -0.8255 -1.9856 2.5561 0 0 0 + 3463 87 1 0.0327 -1.5342 2.6898 0 0 0 + 3464 87 1 0.9186 -1.2711 2.9974 0 0 0 + 3465 87 1 1.7716 -0.9566 2.7566 0 0 0 + 3466 87 1 2.2909 -0.2780 2.3590 0 0 0 + 3467 87 1 2.1603 0.6519 2.3735 0 0 0 + 3468 87 1 2.0956 1.5459 1.9548 0 0 0 + 3469 87 1 1.5001 2.2940 1.9789 0 0 0 + 3470 87 1 0.7212 2.7594 1.6255 0 0 0 + 3471 87 1 0.8724 3.2618 0.8741 0 0 0 + 3472 87 1 1.0332 3.8553 1.6221 0 0 0 + 3473 87 1 0.8776 4.0841 2.5429 0 0 0 + 3474 87 1 0.8233 4.9387 2.9434 0 0 0 + 3475 87 1 0.6931 5.7571 3.5115 0 0 0 + 3476 87 1 0.8310 6.6649 3.5854 0 0 0 + 3477 87 1 0.0250 7.1392 3.8031 0 0 0 + 3478 87 1 -0.0960 7.8566 3.1308 0 0 0 + 3479 87 1 -0.1007 -7.6711 2.7569 0 1 0 + 3480 87 1 0.3778 -6.8511 2.5943 0 1 0 + 3481 88 2 -6.6948 -5.6882 -4.6239 0 0 0 + 3482 88 2 -6.8627 -6.3409 -3.8571 0 0 0 + 3483 88 2 -6.7923 -5.7756 -3.0541 0 0 0 + 3484 88 2 -5.9892 -5.7854 -2.5083 0 0 0 + 3485 88 2 -6.0490 -5.9335 -1.5552 0 0 0 + 3486 88 2 -5.4764 -6.3360 -0.9533 0 0 0 + 3487 88 2 -5.2465 -6.9160 -0.2544 0 0 0 + 3488 88 2 -5.5579 -7.0685 0.6410 0 0 0 + 3489 88 2 -5.2326 -7.8520 1.1785 0 0 0 + 3490 88 2 -4.2822 -7.9898 1.0474 0 0 0 + 3491 88 2 -3.7480 -7.4763 1.6376 0 0 0 + 3492 88 2 -3.1197 -8.0842 1.2649 0 0 0 + 3493 88 2 -2.2280 8.0768 1.7061 0 -1 0 + 3494 88 2 -2.8343 -7.8666 2.3211 0 0 0 + 3495 88 2 -2.5844 -7.7234 3.2201 0 0 0 + 3496 88 2 -2.7071 -7.4216 4.1596 0 0 0 + 3497 88 2 -1.7883 -7.5856 3.7842 0 0 0 + 3498 88 2 -1.0481 -7.6483 3.1967 0 0 0 + 3499 88 2 -0.6266 -6.8418 3.1045 0 0 0 + 3500 88 2 -0.5728 -5.9506 3.5605 0 0 0 + 3501 88 2 -1.2470 -5.4023 3.9583 0 0 0 + 3502 88 2 -2.1051 -5.4959 4.2593 0 0 0 + 3503 88 2 -1.7608 -4.9961 4.9790 0 0 0 + 3504 88 2 -1.2513 -4.4699 5.6193 0 0 0 + 3505 88 2 -1.6596 -4.1544 6.4360 0 0 0 + 3506 88 2 -2.3487 -3.5515 6.5585 0 0 0 + 3507 88 2 -3.2682 -3.7096 6.8461 0 0 0 + 3508 88 2 -3.4251 -4.1290 7.6603 0 0 0 + 3509 88 2 -2.4667 -4.2190 7.4218 0 0 0 + 3510 88 2 -1.7971 -3.8715 8.0876 0 0 0 + 3511 88 2 -0.8986 -3.4412 8.0322 0 0 0 + 3512 88 2 -0.5530 -3.3261 -7.5194 0 0 1 + 3513 88 2 -1.0784 -3.2006 -6.7166 0 0 1 + 3514 88 2 -1.5278 -3.9655 -7.2724 0 0 1 + 3515 88 2 -1.8153 -4.7738 -7.6352 0 0 1 + 3516 88 2 -1.8768 -5.4578 -6.9598 0 0 1 + 3517 88 2 -1.7597 -6.3563 -6.7357 0 0 1 + 3518 88 2 -2.4363 -6.7644 -6.2542 0 0 1 + 3519 88 2 -2.9158 -7.3857 -5.7338 0 0 1 + 3520 88 2 -2.6078 -8.0157 -6.4453 0 0 1 + 3521 89 1 3.7846 3.1327 5.3316 0 0 0 + 3522 89 1 4.5047 3.7549 5.3536 0 0 0 + 3523 89 1 5.3586 4.1023 5.5276 0 0 0 + 3524 89 1 6.2577 3.6417 5.3720 0 0 0 + 3525 89 1 6.0906 4.3720 4.8806 0 0 0 + 3526 89 1 5.2258 4.3774 4.5110 0 0 0 + 3527 89 1 4.7096 5.2400 4.5753 0 0 0 + 3528 89 1 4.2566 4.4452 4.2162 0 0 0 + 3529 89 1 3.6462 3.7492 4.5780 0 0 0 + 3530 89 1 2.7294 3.9074 4.4941 0 0 0 + 3531 89 1 1.8992 3.9868 4.8936 0 0 0 + 3532 89 1 1.0908 4.0939 5.4963 0 0 0 + 3533 89 1 1.2180 3.9570 6.4464 0 0 0 + 3534 89 1 1.8155 4.0828 7.1549 0 0 0 + 3535 89 1 1.5573 3.8628 8.0508 0 0 0 + 3536 89 1 1.4098 3.0585 -7.8699 0 0 1 + 3537 89 1 0.5625 3.4171 -7.6039 0 0 1 + 3538 89 1 0.6328 4.1707 -8.1340 0 0 1 + 3539 89 1 0.5035 5.0068 7.8467 0 0 0 + 3540 89 1 0.8449 5.4174 -7.7805 0 0 1 + 3541 89 1 -0.1037 5.2298 -7.5860 0 0 1 + 3542 89 1 -1.0991 5.4429 -7.4726 0 0 1 + 3543 89 1 -1.9551 4.9007 -7.4986 0 0 1 + 3544 89 1 -2.1370 3.9412 -7.4740 0 0 1 + 3545 89 1 -2.0167 4.1875 -6.5724 0 0 1 + 3546 89 1 -2.7038 4.9368 -6.6287 0 0 1 + 3547 89 1 -3.1830 4.2038 -6.4941 0 0 1 + 3548 89 1 -2.6626 3.4162 -6.4457 0 0 1 + 3549 89 1 -2.8408 2.6134 -6.0348 0 0 1 + 3550 89 1 -2.7635 2.2724 -5.1207 0 0 1 + 3551 89 1 -2.6970 2.5293 -4.1724 0 0 1 + 3552 89 1 -3.4074 2.6371 -3.4844 0 0 1 + 3553 89 1 -3.5392 1.6793 -3.3614 0 0 1 + 3554 89 1 -3.5168 0.6847 -3.5172 0 0 1 + 3555 89 1 -2.9917 -0.0916 -3.1048 0 0 1 + 3556 89 1 -3.1566 -0.1637 -4.0596 0 0 1 + 3557 89 1 -2.6263 0.3132 -4.6675 0 0 1 + 3558 89 1 -2.8150 0.8462 -5.4007 0 0 1 + 3559 89 1 -2.7621 1.4230 -6.1834 0 0 1 + 3560 89 1 -3.2965 1.8910 -6.8309 0 0 1 + 3561 90 2 7.6430 -1.9244 -3.6326 0 0 0 + 3562 90 2 7.5318 -1.9794 -2.6484 0 0 0 + 3563 90 2 7.5430 -1.7062 -1.6900 0 0 0 + 3564 90 2 6.7098 -1.3034 -1.7163 0 0 0 + 3565 90 2 5.9208 -1.1095 -2.1616 0 0 0 + 3566 90 2 5.0118 -0.6761 -2.0928 0 0 0 + 3567 90 2 4.7187 0.1293 -2.6038 0 0 0 + 3568 90 2 5.2397 0.2105 -3.3839 0 0 0 + 3569 90 2 5.0265 0.8220 -4.0741 0 0 0 + 3570 90 2 5.4840 1.5948 -3.7431 0 0 0 + 3571 90 2 5.0436 2.3527 -3.3666 0 0 0 + 3572 90 2 4.7761 3.2389 -3.1256 0 0 0 + 3573 90 2 4.1680 3.8315 -2.6317 0 0 0 + 3574 90 2 4.2421 3.2276 -1.9214 0 0 0 + 3575 90 2 3.5122 2.6162 -2.0163 0 0 0 + 3576 90 2 2.8229 3.1637 -2.4324 0 0 0 + 3577 90 2 2.5042 3.4289 -3.2910 0 0 0 + 3578 90 2 2.9829 3.7351 -4.0688 0 0 0 + 3579 90 2 3.0575 4.6517 -4.4093 0 0 0 + 3580 90 2 3.3119 5.1563 -3.6485 0 0 0 + 3581 90 2 3.1831 5.9780 -3.2149 0 0 0 + 3582 90 2 2.4392 5.5052 -2.7810 0 0 0 + 3583 90 2 2.3800 6.4623 -2.6267 0 0 0 + 3584 90 2 2.4468 7.4342 -2.4789 0 0 0 + 3585 90 2 3.2840 7.5883 -3.1152 0 0 0 + 3586 90 2 2.7291 6.8680 -3.5010 0 0 0 + 3587 90 2 2.1911 6.1352 -3.5642 0 0 0 + 3588 90 2 2.4399 5.4688 -4.2253 0 0 0 + 3589 90 2 2.0504 4.6451 -4.5137 0 0 0 + 3590 90 2 2.1882 5.3795 -5.2458 0 0 0 + 3591 90 2 1.5376 5.1334 -5.9552 0 0 0 + 3592 90 2 0.9660 5.3945 -6.6808 0 0 0 + 3593 90 2 0.7929 6.2700 -7.1188 0 0 0 + 3594 90 2 1.0864 6.6711 -7.9480 0 0 0 + 3595 90 2 0.1407 6.4988 -8.0057 0 0 0 + 3596 90 2 -0.0064 7.1197 -7.2982 0 0 0 + 3597 90 2 -0.4815 7.6825 -6.6807 0 0 0 + 3598 90 2 -0.2730 -8.1013 -5.9029 0 1 0 + 3599 90 2 -0.2516 7.9491 -4.9528 0 0 0 + 3600 90 2 -0.5070 7.8787 -4.0280 0 0 0 + 3601 91 1 0.6223 -4.7095 2.7945 0 0 0 + 3602 91 1 0.7569 -4.7830 3.7632 0 0 0 + 3603 91 1 0.8296 -4.7011 4.7468 0 0 0 + 3604 91 1 0.8229 -3.7360 4.6554 0 0 0 + 3605 91 1 0.3845 -2.9559 4.2514 0 0 0 + 3606 91 1 -0.2964 -2.5611 3.7200 0 0 0 + 3607 91 1 -0.2820 -2.0971 4.6000 0 0 0 + 3608 91 1 -1.0418 -2.7487 4.8396 0 0 0 + 3609 91 1 -0.3278 -3.2755 5.0093 0 0 0 + 3610 91 1 0.2260 -3.6621 5.6597 0 0 0 + 3611 91 1 -0.0864 -4.4345 5.2561 0 0 0 + 3612 91 1 0.2662 -5.3256 5.4393 0 0 0 + 3613 91 1 0.6071 -4.6709 6.0704 0 0 0 + 3614 91 1 1.1085 -4.1290 6.6853 0 0 0 + 3615 91 1 1.9173 -3.7325 6.9972 0 0 0 + 3616 91 1 2.0567 -2.9408 7.4996 0 0 0 + 3617 91 1 2.4505 -2.1883 7.8871 0 0 0 + 3618 91 1 2.5560 -1.2386 7.6676 0 0 0 + 3619 91 1 2.5152 -0.2378 8.0337 0 0 0 + 3620 91 1 2.1280 0.6061 -8.1650 0 0 1 + 3621 91 1 1.3822 1.0683 7.9757 0 0 0 + 3622 91 1 0.6052 1.1811 7.4819 0 0 0 + 3623 91 1 -0.0126 1.8197 7.8920 0 0 0 + 3624 91 1 -0.3811 1.4478 -7.7050 0 0 1 + 3625 91 1 -0.1606 1.0380 -6.8800 0 0 1 + 3626 91 1 -0.1481 0.5705 -6.0248 0 0 1 + 3627 91 1 -0.3447 -0.2268 -5.5177 0 0 1 + 3628 91 1 -0.0775 -1.0934 -5.1781 0 0 1 + 3629 91 1 0.6574 -1.3480 -5.7742 0 0 1 + 3630 91 1 0.0879 -2.1068 -5.7543 0 0 1 + 3631 91 1 -0.3576 -2.7902 -5.2361 0 0 1 + 3632 91 1 0.0254 -2.9423 -4.3472 0 0 1 + 3633 91 1 -0.3613 -3.4714 -3.6089 0 0 1 + 3634 91 1 -0.1642 -2.6916 -3.0436 0 0 1 + 3635 91 1 -0.8741 -2.1141 -3.3529 0 0 1 + 3636 91 1 -1.1906 -1.3007 -3.0277 0 0 1 + 3637 91 1 -1.1741 -0.5922 -3.6176 0 0 1 + 3638 91 1 -0.4676 -0.4699 -3.0283 0 0 1 + 3639 91 1 -0.3009 -0.3478 -2.1091 0 0 1 + 3640 91 1 -0.1885 -0.6961 -1.1832 0 0 1 + 3641 92 2 -0.9911 -4.2988 -1.5795 0 0 0 + 3642 92 2 -1.8063 -4.7628 -1.5485 0 0 0 + 3643 92 2 -2.3638 -4.3270 -2.2405 0 0 0 + 3644 92 2 -2.4481 -4.1665 -3.1721 0 0 0 + 3645 92 2 -1.5754 -3.8175 -3.6807 0 0 0 + 3646 92 2 -1.2625 -2.9782 -3.9715 0 0 0 + 3647 92 2 -1.4869 -2.9451 -3.0271 0 0 0 + 3648 92 2 -0.8642 -3.3345 -2.3194 0 0 0 + 3649 92 2 -0.1218 -3.7872 -1.9106 0 0 0 + 3650 92 2 0.1336 -4.7546 -1.6780 0 0 0 + 3651 92 2 0.5096 -5.7030 -1.4842 0 0 0 + 3652 92 2 1.2181 -6.0868 -1.0024 0 0 0 + 3653 92 2 2.0704 -6.5264 -0.8645 0 0 0 + 3654 92 2 2.2224 -7.3431 -0.4004 0 0 0 + 3655 92 2 2.9083 -7.8229 -0.9674 0 0 0 + 3656 92 2 3.5186 -7.2218 -1.3121 0 0 0 + 3657 92 2 3.7235 -7.3489 -2.2234 0 0 0 + 3658 92 2 3.2919 -6.7889 -2.7696 0 0 0 + 3659 92 2 2.7340 -6.5851 -2.0199 0 0 0 + 3660 92 2 2.8506 -5.6275 -2.1346 0 0 0 + 3661 92 2 3.1697 -4.9592 -2.6934 0 0 0 + 3662 92 2 2.7534 -5.1649 -3.5137 0 0 0 + 3663 92 2 3.2863 -5.9430 -3.3552 0 0 0 + 3664 92 2 3.5813 -6.7340 -3.7205 0 0 0 + 3665 92 2 4.0903 -7.5130 -4.0241 0 0 0 + 3666 92 2 4.6066 -7.8031 -4.7657 0 0 0 + 3667 92 2 5.1451 7.8302 -4.9908 0 -1 0 + 3668 92 2 5.8601 7.3116 -4.5359 0 -1 0 + 3669 92 2 6.6248 6.7741 -4.3327 0 -1 0 + 3670 92 2 7.0689 5.8764 -4.3380 0 -1 0 + 3671 92 2 7.9754 5.5530 -4.5888 0 -1 0 + 3672 92 2 -7.7764 5.1541 -4.1110 1 -1 0 + 3673 92 2 -7.9957 5.2073 -3.2385 1 -1 0 + 3674 92 2 -7.8665 5.0133 -2.2742 1 -1 0 + 3675 92 2 -7.9484 5.3139 -1.3053 1 -1 0 + 3676 92 2 7.9808 6.2511 -1.3897 0 -1 0 + 3677 92 2 -7.5047 6.5615 -1.3143 1 -1 0 + 3678 92 2 -7.1236 6.1255 -0.5485 1 -1 0 + 3679 92 2 -6.5441 6.0533 -1.3527 1 -1 0 + 3680 92 2 -6.3317 5.2630 -0.7679 1 -1 0 + 3681 93 1 4.4523 -7.2150 -7.6080 0 0 0 + 3682 93 1 4.8168 -7.6798 -6.8248 0 0 0 + 3683 93 1 4.9922 -8.0643 -5.9476 0 0 0 + 3684 93 1 4.2049 7.8967 -5.9835 0 -1 0 + 3685 93 1 3.5145 7.9610 -5.3472 0 -1 0 + 3686 93 1 4.2292 7.5306 -4.9714 0 -1 0 + 3687 93 1 4.8487 6.7662 -4.9595 0 -1 0 + 3688 93 1 5.4873 6.1358 -4.5808 0 -1 0 + 3689 93 1 6.0026 6.4486 -5.2913 0 -1 0 + 3690 93 1 6.7702 6.6300 -5.8978 0 -1 0 + 3691 93 1 6.1935 7.3643 -6.1067 0 -1 0 + 3692 93 1 5.2948 7.2202 -5.8189 0 -1 0 + 3693 93 1 4.9931 6.2313 -5.9513 0 -1 0 + 3694 93 1 5.6594 5.5812 -5.8156 0 -1 0 + 3695 93 1 6.1190 4.7465 -5.8175 0 -1 0 + 3696 93 1 5.9981 3.8139 -5.9083 0 -1 0 + 3697 93 1 6.0196 2.9565 -5.4082 0 -1 0 + 3698 93 1 6.0513 2.1076 -4.9955 0 -1 0 + 3699 93 1 6.9013 1.6275 -5.1798 0 -1 0 + 3700 93 1 7.7674 1.3041 -4.9268 0 -1 0 + 3701 93 1 7.9116 0.4543 -5.3372 0 -1 0 + 3702 93 1 -8.0598 0.3767 -6.2293 1 -1 0 + 3703 93 1 -7.1543 0.7683 -6.1678 1 -1 0 + 3704 93 1 -6.8733 0.9141 -5.2877 1 -1 0 + 3705 93 1 -6.4099 0.9525 -4.3833 1 -1 0 + 3706 93 1 -6.6307 1.9062 -4.3746 1 -1 0 + 3707 93 1 -6.8364 2.3795 -5.2522 1 -1 0 + 3708 93 1 -7.1810 3.2617 -5.1219 1 -1 0 + 3709 93 1 -6.2672 3.3382 -5.3198 1 -1 0 + 3710 93 1 -5.8754 3.4155 -6.1494 1 -1 0 + 3711 93 1 -6.5217 2.7037 -6.4517 1 -1 0 + 3712 93 1 -7.4785 2.7341 -6.0180 1 -1 0 + 3713 93 1 8.1243 2.4827 -6.3666 0 -1 0 + 3714 93 1 -7.9242 1.6579 -6.6941 1 -1 0 + 3715 93 1 -8.2073 1.4561 -7.5947 1 -1 0 + 3716 93 1 8.1961 1.1089 7.8770 0 -1 -1 + 3717 93 1 -7.8253 1.0494 7.0267 1 -1 -1 + 3718 93 1 7.8246 1.5530 6.8332 0 -1 -1 + 3719 93 1 7.0198 2.0656 6.9128 0 -1 -1 + 3720 93 1 6.2210 2.6562 6.8084 0 -1 -1 + 3721 94 2 4.4680 2.1721 -2.0004 0 0 0 + 3722 94 2 3.7664 1.8460 -2.5839 0 0 0 + 3723 94 2 3.0880 2.3140 -3.0135 0 0 0 + 3724 94 2 2.1800 2.4074 -3.2201 0 0 0 + 3725 94 2 1.5627 1.8950 -3.8548 0 0 0 + 3726 94 2 0.6779 1.3522 -3.8490 0 0 0 + 3727 94 2 -0.1707 0.9561 -3.9195 0 0 0 + 3728 94 2 -0.7627 0.3256 -3.4503 0 0 0 + 3729 94 2 -0.9066 0.3824 -2.5211 0 0 0 + 3730 94 2 -1.4046 -0.3086 -2.0663 0 0 0 + 3731 94 2 -0.9244 -1.1594 -1.9028 0 0 0 + 3732 94 2 -0.1321 -1.4246 -2.3011 0 0 0 + 3733 94 2 0.7705 -1.4335 -2.0574 0 0 0 + 3734 94 2 1.5616 -0.8229 -1.9028 0 0 0 + 3735 94 2 1.6335 -0.9786 -1.0179 0 0 0 + 3736 94 2 2.3262 -1.5805 -1.0228 0 0 0 + 3737 94 2 1.8583 -1.8560 -1.8201 0 0 0 + 3738 94 2 1.7274 -1.5181 -2.7045 0 0 0 + 3739 94 2 1.6254 -1.9092 -3.6648 0 0 0 + 3740 94 2 1.3845 -1.0765 -3.7451 0 0 0 + 3741 94 2 1.5610 -0.2121 -3.9906 0 0 0 + 3742 94 2 1.5143 0.8143 -3.9763 0 0 0 + 3743 94 2 1.5399 1.0162 -3.0405 0 0 0 + 3744 94 2 1.2317 0.1307 -3.0721 0 0 0 + 3745 94 2 0.7904 -0.6224 -2.7730 0 0 0 + 3746 94 2 0.5077 -1.4376 -3.0911 0 0 0 + 3747 94 2 0.4126 -2.1941 -3.6895 0 0 0 + 3748 94 2 1.1690 -2.8415 -3.7132 0 0 0 + 3749 94 2 1.3016 -3.5581 -3.0808 0 0 0 + 3750 94 2 0.5876 -3.3105 -2.5100 0 0 0 + 3751 94 2 0.1158 -2.6992 -1.8997 0 0 0 + 3752 94 2 -0.0867 -1.9870 -1.3448 0 0 0 + 3753 94 2 -0.5192 -2.1377 -0.5062 0 0 0 + 3754 94 2 0.4444 -2.3646 -0.4102 0 0 0 + 3755 94 2 1.0662 -2.0390 -1.1018 0 0 0 + 3756 94 2 1.7026 -2.6777 -0.7593 0 0 0 + 3757 94 2 1.9622 -3.5584 -0.4785 0 0 0 + 3758 94 2 2.1679 -4.1024 -1.1824 0 0 0 + 3759 94 2 2.2753 -4.7708 -1.8271 0 0 0 + 3760 94 2 2.0547 -5.5373 -1.3506 0 0 0 + 3761 95 1 -6.6573 -7.8409 0.5266 0 0 0 + 3762 95 1 -6.5122 -7.4271 -0.3240 0 0 0 + 3763 95 1 -6.2325 -6.5195 -0.1798 0 0 0 + 3764 95 1 -5.8987 -5.9885 0.5490 0 0 0 + 3765 95 1 -5.0622 -6.1487 0.8667 0 0 0 + 3766 95 1 -4.5835 -6.9149 1.1602 0 0 0 + 3767 95 1 -4.0666 -6.3351 1.7189 0 0 0 + 3768 95 1 -3.6959 -5.9879 2.4936 0 0 0 + 3769 95 1 -4.1678 -6.1581 3.3049 0 0 0 + 3770 95 1 -4.6572 -6.7756 3.8167 0 0 0 + 3771 95 1 -5.3937 -7.2791 3.8830 0 0 0 + 3772 95 1 -5.6824 -8.1720 4.0510 0 0 0 + 3773 95 1 -5.8701 7.8472 4.9005 0 -1 0 + 3774 95 1 -6.0999 7.6890 5.8286 0 -1 0 + 3775 95 1 -6.5356 -7.8725 5.9492 0 0 0 + 3776 95 1 -6.5452 -7.5319 5.0583 0 0 0 + 3777 95 1 -5.9531 -6.8211 4.8043 0 0 0 + 3778 95 1 -5.0676 -6.5825 4.8270 0 0 0 + 3779 95 1 -5.1460 -7.3738 5.3148 0 0 0 + 3780 95 1 -4.5541 -6.9605 5.9733 0 0 0 + 3781 95 1 -3.9251 -6.6961 6.6788 0 0 0 + 3782 95 1 -4.7330 -7.0102 7.1003 0 0 0 + 3783 95 1 -5.4015 -6.3448 7.3828 0 0 0 + 3784 95 1 -5.9311 -5.5673 7.6817 0 0 0 + 3785 95 1 -6.1483 -4.8273 -8.1510 0 0 1 + 3786 95 1 -5.5206 -4.5305 7.6164 0 0 0 + 3787 95 1 -5.7784 -3.5858 7.4964 0 0 0 + 3788 95 1 -5.1342 -2.8470 7.6810 0 0 0 + 3789 95 1 -5.2974 -2.9006 -7.7942 0 0 1 + 3790 95 1 -6.1523 -3.2622 -7.6513 0 0 1 + 3791 95 1 -6.7498 -3.9216 -8.0386 0 0 1 + 3792 95 1 -6.7021 -4.0262 -7.0797 0 0 1 + 3793 95 1 -7.1200 -3.1645 -7.1035 0 0 1 + 3794 95 1 -7.6996 -3.0755 -7.8478 0 0 1 + 3795 95 1 8.1553 -2.9654 7.8080 -1 0 0 + 3796 95 1 7.9116 -2.2877 7.1723 -1 0 0 + 3797 95 1 7.5092 -1.7021 6.4381 -1 0 0 + 3798 95 1 7.8130 -1.6096 5.5344 -1 0 0 + 3799 95 1 -7.6748 -1.4231 5.5215 0 0 0 + 3800 95 1 -7.8242 -1.6039 6.5139 0 0 0 + 3801 96 2 -0.2064 5.8582 1.6664 0 0 0 + 3802 96 2 0.6740 5.4034 1.7008 0 0 0 + 3803 96 2 0.2553 4.5682 1.9470 0 0 0 + 3804 96 2 -0.0165 3.7083 1.8207 0 0 0 + 3805 96 2 -0.2308 3.2039 1.0658 0 0 0 + 3806 96 2 -0.6797 2.7826 1.8430 0 0 0 + 3807 96 2 -0.8754 3.0708 2.7450 0 0 0 + 3808 96 2 -0.6116 3.9515 2.7173 0 0 0 + 3809 96 2 -0.5369 4.9095 2.8249 0 0 0 + 3810 96 2 -0.0072 5.6713 2.7435 0 0 0 + 3811 96 2 0.8336 6.0860 2.5309 0 0 0 + 3812 96 2 1.6746 6.5182 2.6754 0 0 0 + 3813 96 2 2.3632 7.1221 2.8032 0 0 0 + 3814 96 2 3.1426 7.4229 3.2098 0 0 0 + 3815 96 2 3.8603 7.6818 2.5637 0 0 0 + 3816 96 2 3.7389 -7.9848 1.9720 0 1 0 + 3817 96 2 4.0411 -7.2316 1.4904 0 1 0 + 3818 96 2 4.1239 -6.3788 1.9507 0 1 0 + 3819 96 2 4.5640 -5.8143 2.5664 0 1 0 + 3820 96 2 4.8200 -5.0204 3.0631 0 1 0 + 3821 96 2 4.7816 -4.3022 3.7595 0 1 0 + 3822 96 2 4.2132 -3.5626 4.0334 0 1 0 + 3823 96 2 4.3987 -2.6592 3.6698 0 1 0 + 3824 96 2 4.6377 -1.8461 3.2403 0 1 0 + 3825 96 2 4.6675 -2.3457 2.3781 0 1 0 + 3826 96 2 4.5222 -2.2432 1.4497 0 1 0 + 3827 96 2 4.6793 -1.7836 0.5833 0 1 0 + 3828 96 2 4.5890 -1.0127 1.1512 0 1 0 + 3829 96 2 5.4810 -0.6902 1.4786 0 1 0 + 3830 96 2 5.6239 0.3098 1.6953 0 1 0 + 3831 96 2 5.7421 1.2206 1.8102 0 1 0 + 3832 96 2 6.1718 1.4709 2.6257 0 1 0 + 3833 96 2 6.2930 1.6216 3.5859 0 1 0 + 3834 96 2 6.4221 1.9578 4.4871 0 1 0 + 3835 96 2 6.9843 2.3248 3.8584 0 1 0 + 3836 96 2 7.7458 2.9537 3.9104 0 1 0 + 3837 96 2 7.9951 3.6358 4.4548 0 1 0 + 3838 96 2 8.2029 4.4086 4.9750 0 1 0 + 3839 96 2 -8.1360 4.7580 5.8771 1 1 0 + 3840 96 2 8.0645 4.5369 6.8113 0 1 0 + 3841 97 1 2.2176 -2.9274 -3.8226 0 0 0 + 3842 97 1 2.8929 -3.2219 -3.2024 0 0 0 + 3843 97 1 3.6141 -3.2384 -2.5673 0 0 0 + 3844 97 1 3.9311 -4.1229 -2.4003 0 0 0 + 3845 97 1 4.5565 -3.6787 -3.0248 0 0 0 + 3846 97 1 4.7864 -2.9487 -3.5626 0 0 0 + 3847 97 1 5.5886 -2.6648 -3.9160 0 0 0 + 3848 97 1 6.2406 -3.2310 -4.3089 0 0 0 + 3849 97 1 5.6700 -3.9656 -3.9760 0 0 0 + 3850 97 1 4.7723 -4.1973 -4.2281 0 0 0 + 3851 97 1 4.5470 -4.9681 -4.7430 0 0 0 + 3852 97 1 4.6849 -4.2229 -5.3700 0 0 0 + 3853 97 1 5.3739 -4.3661 -6.1301 0 0 0 + 3854 97 1 5.2196 -4.2225 -7.0693 0 0 0 + 3855 97 1 5.8976 -4.0524 -7.7757 0 0 0 + 3856 97 1 5.4442 -3.1967 -7.6501 0 0 0 + 3857 97 1 5.7946 -2.5912 -6.9866 0 0 0 + 3858 97 1 6.6077 -2.7919 -7.3467 0 0 0 + 3859 97 1 6.8766 -3.6557 -7.0869 0 0 0 + 3860 97 1 6.0351 -3.5913 -6.6762 0 0 0 + 3861 97 1 5.5009 -3.2243 -5.9232 0 0 0 + 3862 97 1 4.8788 -2.4881 -5.8521 0 0 0 + 3863 97 1 3.9104 -2.3312 -5.5244 0 0 0 + 3864 97 1 4.2056 -1.5060 -6.0766 0 0 0 + 3865 97 1 4.9607 -1.4426 -5.5598 0 0 0 + 3866 97 1 5.6463 -1.1450 -5.0275 0 0 0 + 3867 97 1 6.5996 -1.3033 -5.2726 0 0 0 + 3868 97 1 7.4756 -1.5377 -4.8725 0 0 0 + 3869 97 1 -8.1520 -1.9564 -4.6295 1 0 0 + 3870 97 1 -7.6298 -1.4899 -4.0482 1 0 0 + 3871 97 1 -8.0985 -1.3013 -3.2348 1 0 0 + 3872 97 1 8.0718 -0.9901 -2.3552 0 0 0 + 3873 97 1 -7.8066 -0.7851 -1.6191 1 0 0 + 3874 97 1 -6.8574 -0.6092 -1.6602 1 0 0 + 3875 97 1 -5.8815 -0.6170 -1.6926 1 0 0 + 3876 97 1 -5.6996 0.1750 -2.3004 1 0 0 + 3877 97 1 -5.1896 0.8974 -2.6834 1 0 0 + 3878 97 1 -5.2093 1.8078 -2.8274 1 0 0 + 3879 97 1 -4.5488 1.3299 -3.3981 1 0 0 + 3880 97 1 -4.4461 1.3287 -4.3497 1 0 0 + 3881 98 2 -7.4942 6.0337 7.6977 0 0 0 + 3882 98 2 -8.1690 5.6874 7.0895 0 0 0 + 3883 98 2 7.3459 5.4855 7.2686 -1 0 0 + 3884 98 2 6.9916 4.6791 7.5562 -1 0 0 + 3885 98 2 6.4535 5.1731 6.8732 -1 0 0 + 3886 98 2 5.7204 5.3752 6.2811 -1 0 0 + 3887 98 2 5.2617 5.2731 5.4817 -1 0 0 + 3888 98 2 4.6718 5.9912 5.5488 -1 0 0 + 3889 98 2 4.2878 5.1171 5.7795 -1 0 0 + 3890 98 2 3.7989 5.6316 6.4428 -1 0 0 + 3891 98 2 3.2292 5.1097 7.0029 -1 0 0 + 3892 98 2 3.0393 5.0355 6.0669 -1 0 0 + 3893 98 2 2.5949 5.8431 5.9616 -1 0 0 + 3894 98 2 2.1568 5.6068 5.0991 -1 0 0 + 3895 98 2 2.4896 4.7649 5.3387 -1 0 0 + 3896 98 2 1.9143 4.6290 6.0671 -1 0 0 + 3897 98 2 2.2942 4.9366 6.9173 -1 0 0 + 3898 98 2 2.9235 4.1278 6.9701 -1 0 0 + 3899 98 2 2.5725 3.5630 6.2633 -1 0 0 + 3900 98 2 2.0380 3.1685 5.5789 -1 0 0 + 3901 98 2 2.7763 2.6831 5.1908 -1 0 0 + 3902 98 2 3.0235 2.6720 4.2237 -1 0 0 + 3903 98 2 3.6488 3.1947 3.6444 -1 0 0 + 3904 98 2 4.2144 3.6322 3.0384 -1 0 0 + 3905 98 2 4.8975 4.0952 2.6262 -1 0 0 + 3906 98 2 5.6524 3.4583 2.4646 -1 0 0 + 3907 98 2 5.6717 3.7592 3.3583 -1 0 0 + 3908 98 2 6.1617 4.6357 3.6583 -1 0 0 + 3909 98 2 6.4158 5.2311 4.3886 -1 0 0 + 3910 98 2 7.0746 5.0313 5.0350 -1 0 0 + 3911 98 2 6.6465 5.5738 5.6948 -1 0 0 + 3912 98 2 6.7898 6.1867 4.9582 -1 0 0 + 3913 98 2 6.9233 6.1730 4.0313 -1 0 0 + 3914 98 2 6.4301 6.9638 4.2154 -1 0 0 + 3915 98 2 7.0534 7.5509 4.6320 -1 0 0 + 3916 98 2 7.4794 -8.1866 5.2521 -1 1 0 + 3917 98 2 8.0154 -7.9437 6.0497 -1 1 0 + 3918 98 2 8.0564 7.5547 5.7590 -1 0 0 + 3919 98 2 7.8396 6.8147 6.4245 -1 0 0 + 3920 98 2 7.5599 6.8805 7.3209 -1 0 0 + 3921 99 1 -2.6511 -6.6859 -2.9121 0 0 0 + 3922 99 1 -1.7653 -7.0269 -3.1716 0 0 0 + 3923 99 1 -0.9589 -7.3221 -3.6025 0 0 0 + 3924 99 1 -0.1562 -6.9875 -3.1788 0 0 0 + 3925 99 1 0.0503 -7.3933 -3.9821 0 0 0 + 3926 99 1 0.4866 -8.1059 -4.3875 0 0 0 + 3927 99 1 1.4127 -7.9622 -4.5685 0 0 0 + 3928 99 1 2.3239 -7.7622 -4.8107 0 0 0 + 3929 99 1 2.8610 -7.8147 -5.6104 0 0 0 + 3930 99 1 3.4741 -7.5413 -6.2854 0 0 0 + 3931 99 1 3.8719 -7.9771 -7.0558 0 0 0 + 3932 99 1 3.4359 7.6830 -6.6406 0 -1 0 + 3933 99 1 2.5774 8.1445 -6.6252 0 -1 0 + 3934 99 1 1.7239 -8.1801 -6.7809 0 0 0 + 3935 99 1 1.0718 -7.4714 -6.9195 0 0 0 + 3936 99 1 0.3431 -8.0777 -6.7810 0 0 0 + 3937 99 1 0.9578 7.6113 -6.9475 0 -1 0 + 3938 99 1 1.4527 7.5950 -6.1025 0 -1 0 + 3939 99 1 1.9555 6.8497 -6.3643 0 -1 0 + 3940 99 1 2.0673 6.7828 -5.4465 0 -1 0 + 3941 99 1 1.9142 6.3749 -4.5645 0 -1 0 + 3942 99 1 1.2348 6.7046 -4.0041 0 -1 0 + 3943 99 1 1.2482 7.6196 -3.8559 0 -1 0 + 3944 99 1 0.4342 7.4045 -4.2628 0 -1 0 + 3945 99 1 -0.0701 6.9421 -3.6305 0 -1 0 + 3946 99 1 0.3520 7.3533 -2.8616 0 -1 0 + 3947 99 1 0.0830 6.6155 -2.1990 0 -1 0 + 3948 99 1 -0.8998 6.4798 -2.2951 0 -1 0 + 3949 99 1 -0.7661 7.3393 -2.6824 0 -1 0 + 3950 99 1 -0.2049 7.9437 -2.1199 0 -1 0 + 3951 99 1 0.4468 7.4593 -1.6601 0 -1 0 + 3952 99 1 1.3016 7.5690 -1.3034 0 -1 0 + 3953 99 1 0.5376 7.6028 -0.7224 0 -1 0 + 3954 99 1 1.0954 -8.0806 -0.6026 0 0 0 + 3955 99 1 0.8394 -8.1920 0.3112 0 0 0 + 3956 99 1 0.4630 7.8580 1.1605 0 -1 0 + 3957 99 1 0.6496 7.9163 2.1331 0 -1 0 + 3958 99 1 1.2222 -7.8225 2.4436 0 0 0 + 3959 99 1 1.8590 -7.1861 2.0758 0 0 0 + 3960 99 1 2.2357 -6.4494 1.5474 0 0 0 + 3961 100 2 6.4113 3.1710 -2.1706 0 0 0 + 3962 100 2 5.6570 3.0466 -2.7465 0 0 0 + 3963 100 2 5.2007 3.6574 -2.1073 0 0 0 + 3964 100 2 5.3121 2.7867 -1.7184 0 0 0 + 3965 100 2 5.9663 2.0712 -1.5363 0 0 0 + 3966 100 2 5.9158 1.7612 -2.4522 0 0 0 + 3967 100 2 5.0206 1.4834 -2.7386 0 0 0 + 3968 100 2 4.2637 1.3713 -3.3115 0 0 0 + 3969 100 2 3.4221 0.8671 -3.2860 0 0 0 + 3970 100 2 3.3572 0.7603 -4.2097 0 0 0 + 3971 100 2 2.4794 0.8200 -3.8262 0 0 0 + 3972 100 2 2.4925 1.5676 -4.3610 0 0 0 + 3973 100 2 2.3614 2.1423 -5.1211 0 0 0 + 3974 100 2 1.6577 2.8577 -5.4364 0 0 0 + 3975 100 2 1.6094 3.4333 -6.2720 0 0 0 + 3976 100 2 1.5995 3.7313 -7.1570 0 0 0 + 3977 100 2 1.5783 4.5664 -7.6095 0 0 0 + 3978 100 2 1.7286 4.9157 7.9155 0 0 -1 + 3979 100 2 1.2413 5.1097 7.0880 0 0 -1 + 3980 100 2 1.5442 5.8274 6.4799 0 0 -1 + 3981 100 2 2.1561 6.0235 7.1258 0 0 -1 + 3982 100 2 2.5293 5.4955 7.7964 0 0 -1 + 3983 100 2 2.6656 5.1380 -7.7496 0 0 0 + 3984 100 2 3.4163 4.5476 -7.7127 0 0 0 + 3985 100 2 2.9216 4.1944 -6.9944 0 0 0 + 3986 100 2 2.2870 4.8367 -6.7200 0 0 0 + 3987 100 2 2.0293 5.7732 -6.7039 0 0 0 + 3988 100 2 1.9921 6.3163 -7.4576 0 0 0 + 3989 100 2 1.6896 6.0225 8.0822 0 0 -1 + 3990 100 2 0.7463 6.0286 7.6473 0 0 -1 + 3991 100 2 0.5802 6.2086 6.6852 0 0 -1 + 3992 100 2 0.0280 5.8380 6.0163 0 0 -1 + 3993 100 2 -0.8852 5.6790 5.7187 0 0 -1 + 3994 100 2 -1.3945 4.8974 5.4669 0 0 -1 + 3995 100 2 -1.5923 3.9584 5.5511 0 0 -1 + 3996 100 2 -1.2935 3.2574 6.0695 0 0 -1 + 3997 100 2 -0.5427 3.5610 5.5476 0 0 -1 + 3998 100 2 -0.9175 3.2914 4.6129 0 0 -1 + 3999 100 2 -1.5850 3.0510 3.9963 0 0 -1 + 4000 100 2 -2.2447 3.7440 4.1318 0 0 -1 + +Bonds + + 1 1 1 2 + 2 1 2 3 + 3 1 3 4 + 4 1 4 5 + 5 1 5 6 + 6 1 6 7 + 7 1 7 8 + 8 1 8 9 + 9 1 9 10 + 10 1 10 11 + 11 1 11 12 + 12 1 12 13 + 13 1 13 14 + 14 1 14 15 + 15 1 15 16 + 16 1 16 17 + 17 1 17 18 + 18 1 18 19 + 19 1 19 20 + 20 1 20 21 + 21 1 21 22 + 22 1 22 23 + 23 1 23 24 + 24 1 24 25 + 25 1 25 26 + 26 1 26 27 + 27 1 27 28 + 28 1 28 29 + 29 1 29 30 + 30 1 30 31 + 31 1 31 32 + 32 1 32 33 + 33 1 33 34 + 34 1 34 35 + 35 1 35 36 + 36 1 36 37 + 37 1 37 38 + 38 1 38 39 + 39 1 39 40 + 40 1 41 42 + 41 1 42 43 + 42 1 43 44 + 43 1 44 45 + 44 1 45 46 + 45 1 46 47 + 46 1 47 48 + 47 1 48 49 + 48 1 49 50 + 49 1 50 51 + 50 1 51 52 + 51 1 52 53 + 52 1 53 54 + 53 1 54 55 + 54 1 55 56 + 55 1 56 57 + 56 1 57 58 + 57 1 58 59 + 58 1 59 60 + 59 1 60 61 + 60 1 61 62 + 61 1 62 63 + 62 1 63 64 + 63 1 64 65 + 64 1 65 66 + 65 1 66 67 + 66 1 67 68 + 67 1 68 69 + 68 1 69 70 + 69 1 70 71 + 70 1 71 72 + 71 1 72 73 + 72 1 73 74 + 73 1 74 75 + 74 1 75 76 + 75 1 76 77 + 76 1 77 78 + 77 1 78 79 + 78 1 79 80 + 79 1 81 82 + 80 1 82 83 + 81 1 83 84 + 82 1 84 85 + 83 1 85 86 + 84 1 86 87 + 85 1 87 88 + 86 1 88 89 + 87 1 89 90 + 88 1 90 91 + 89 1 91 92 + 90 1 92 93 + 91 1 93 94 + 92 1 94 95 + 93 1 95 96 + 94 1 96 97 + 95 1 97 98 + 96 1 98 99 + 97 1 99 100 + 98 1 100 101 + 99 1 101 102 + 100 1 102 103 + 101 1 103 104 + 102 1 104 105 + 103 1 105 106 + 104 1 106 107 + 105 1 107 108 + 106 1 108 109 + 107 1 109 110 + 108 1 110 111 + 109 1 111 112 + 110 1 112 113 + 111 1 113 114 + 112 1 114 115 + 113 1 115 116 + 114 1 116 117 + 115 1 117 118 + 116 1 118 119 + 117 1 119 120 + 118 1 121 122 + 119 1 122 123 + 120 1 123 124 + 121 1 124 125 + 122 1 125 126 + 123 1 126 127 + 124 1 127 128 + 125 1 128 129 + 126 1 129 130 + 127 1 130 131 + 128 1 131 132 + 129 1 132 133 + 130 1 133 134 + 131 1 134 135 + 132 1 135 136 + 133 1 136 137 + 134 1 137 138 + 135 1 138 139 + 136 1 139 140 + 137 1 140 141 + 138 1 141 142 + 139 1 142 143 + 140 1 143 144 + 141 1 144 145 + 142 1 145 146 + 143 1 146 147 + 144 1 147 148 + 145 1 148 149 + 146 1 149 150 + 147 1 150 151 + 148 1 151 152 + 149 1 152 153 + 150 1 153 154 + 151 1 154 155 + 152 1 155 156 + 153 1 156 157 + 154 1 157 158 + 155 1 158 159 + 156 1 159 160 + 157 1 161 162 + 158 1 162 163 + 159 1 163 164 + 160 1 164 165 + 161 1 165 166 + 162 1 166 167 + 163 1 167 168 + 164 1 168 169 + 165 1 169 170 + 166 1 170 171 + 167 1 171 172 + 168 1 172 173 + 169 1 173 174 + 170 1 174 175 + 171 1 175 176 + 172 1 176 177 + 173 1 177 178 + 174 1 178 179 + 175 1 179 180 + 176 1 180 181 + 177 1 181 182 + 178 1 182 183 + 179 1 183 184 + 180 1 184 185 + 181 1 185 186 + 182 1 186 187 + 183 1 187 188 + 184 1 188 189 + 185 1 189 190 + 186 1 190 191 + 187 1 191 192 + 188 1 192 193 + 189 1 193 194 + 190 1 194 195 + 191 1 195 196 + 192 1 196 197 + 193 1 197 198 + 194 1 198 199 + 195 1 199 200 + 196 1 201 202 + 197 1 202 203 + 198 1 203 204 + 199 1 204 205 + 200 1 205 206 + 201 1 206 207 + 202 1 207 208 + 203 1 208 209 + 204 1 209 210 + 205 1 210 211 + 206 1 211 212 + 207 1 212 213 + 208 1 213 214 + 209 1 214 215 + 210 1 215 216 + 211 1 216 217 + 212 1 217 218 + 213 1 218 219 + 214 1 219 220 + 215 1 220 221 + 216 1 221 222 + 217 1 222 223 + 218 1 223 224 + 219 1 224 225 + 220 1 225 226 + 221 1 226 227 + 222 1 227 228 + 223 1 228 229 + 224 1 229 230 + 225 1 230 231 + 226 1 231 232 + 227 1 232 233 + 228 1 233 234 + 229 1 234 235 + 230 1 235 236 + 231 1 236 237 + 232 1 237 238 + 233 1 238 239 + 234 1 239 240 + 235 1 241 242 + 236 1 242 243 + 237 1 243 244 + 238 1 244 245 + 239 1 245 246 + 240 1 246 247 + 241 1 247 248 + 242 1 248 249 + 243 1 249 250 + 244 1 250 251 + 245 1 251 252 + 246 1 252 253 + 247 1 253 254 + 248 1 254 255 + 249 1 255 256 + 250 1 256 257 + 251 1 257 258 + 252 1 258 259 + 253 1 259 260 + 254 1 260 261 + 255 1 261 262 + 256 1 262 263 + 257 1 263 264 + 258 1 264 265 + 259 1 265 266 + 260 1 266 267 + 261 1 267 268 + 262 1 268 269 + 263 1 269 270 + 264 1 270 271 + 265 1 271 272 + 266 1 272 273 + 267 1 273 274 + 268 1 274 275 + 269 1 275 276 + 270 1 276 277 + 271 1 277 278 + 272 1 278 279 + 273 1 279 280 + 274 1 281 282 + 275 1 282 283 + 276 1 283 284 + 277 1 284 285 + 278 1 285 286 + 279 1 286 287 + 280 1 287 288 + 281 1 288 289 + 282 1 289 290 + 283 1 290 291 + 284 1 291 292 + 285 1 292 293 + 286 1 293 294 + 287 1 294 295 + 288 1 295 296 + 289 1 296 297 + 290 1 297 298 + 291 1 298 299 + 292 1 299 300 + 293 1 300 301 + 294 1 301 302 + 295 1 302 303 + 296 1 303 304 + 297 1 304 305 + 298 1 305 306 + 299 1 306 307 + 300 1 307 308 + 301 1 308 309 + 302 1 309 310 + 303 1 310 311 + 304 1 311 312 + 305 1 312 313 + 306 1 313 314 + 307 1 314 315 + 308 1 315 316 + 309 1 316 317 + 310 1 317 318 + 311 1 318 319 + 312 1 319 320 + 313 1 321 322 + 314 1 322 323 + 315 1 323 324 + 316 1 324 325 + 317 1 325 326 + 318 1 326 327 + 319 1 327 328 + 320 1 328 329 + 321 1 329 330 + 322 1 330 331 + 323 1 331 332 + 324 1 332 333 + 325 1 333 334 + 326 1 334 335 + 327 1 335 336 + 328 1 336 337 + 329 1 337 338 + 330 1 338 339 + 331 1 339 340 + 332 1 340 341 + 333 1 341 342 + 334 1 342 343 + 335 1 343 344 + 336 1 344 345 + 337 1 345 346 + 338 1 346 347 + 339 1 347 348 + 340 1 348 349 + 341 1 349 350 + 342 1 350 351 + 343 1 351 352 + 344 1 352 353 + 345 1 353 354 + 346 1 354 355 + 347 1 355 356 + 348 1 356 357 + 349 1 357 358 + 350 1 358 359 + 351 1 359 360 + 352 1 361 362 + 353 1 362 363 + 354 1 363 364 + 355 1 364 365 + 356 1 365 366 + 357 1 366 367 + 358 1 367 368 + 359 1 368 369 + 360 1 369 370 + 361 1 370 371 + 362 1 371 372 + 363 1 372 373 + 364 1 373 374 + 365 1 374 375 + 366 1 375 376 + 367 1 376 377 + 368 1 377 378 + 369 1 378 379 + 370 1 379 380 + 371 1 380 381 + 372 1 381 382 + 373 1 382 383 + 374 1 383 384 + 375 1 384 385 + 376 1 385 386 + 377 1 386 387 + 378 1 387 388 + 379 1 388 389 + 380 1 389 390 + 381 1 390 391 + 382 1 391 392 + 383 1 392 393 + 384 1 393 394 + 385 1 394 395 + 386 1 395 396 + 387 1 396 397 + 388 1 397 398 + 389 1 398 399 + 390 1 399 400 + 391 1 401 402 + 392 1 402 403 + 393 1 403 404 + 394 1 404 405 + 395 1 405 406 + 396 1 406 407 + 397 1 407 408 + 398 1 408 409 + 399 1 409 410 + 400 1 410 411 + 401 1 411 412 + 402 1 412 413 + 403 1 413 414 + 404 1 414 415 + 405 1 415 416 + 406 1 416 417 + 407 1 417 418 + 408 1 418 419 + 409 1 419 420 + 410 1 420 421 + 411 1 421 422 + 412 1 422 423 + 413 1 423 424 + 414 1 424 425 + 415 1 425 426 + 416 1 426 427 + 417 1 427 428 + 418 1 428 429 + 419 1 429 430 + 420 1 430 431 + 421 1 431 432 + 422 1 432 433 + 423 1 433 434 + 424 1 434 435 + 425 1 435 436 + 426 1 436 437 + 427 1 437 438 + 428 1 438 439 + 429 1 439 440 + 430 1 441 442 + 431 1 442 443 + 432 1 443 444 + 433 1 444 445 + 434 1 445 446 + 435 1 446 447 + 436 1 447 448 + 437 1 448 449 + 438 1 449 450 + 439 1 450 451 + 440 1 451 452 + 441 1 452 453 + 442 1 453 454 + 443 1 454 455 + 444 1 455 456 + 445 1 456 457 + 446 1 457 458 + 447 1 458 459 + 448 1 459 460 + 449 1 460 461 + 450 1 461 462 + 451 1 462 463 + 452 1 463 464 + 453 1 464 465 + 454 1 465 466 + 455 1 466 467 + 456 1 467 468 + 457 1 468 469 + 458 1 469 470 + 459 1 470 471 + 460 1 471 472 + 461 1 472 473 + 462 1 473 474 + 463 1 474 475 + 464 1 475 476 + 465 1 476 477 + 466 1 477 478 + 467 1 478 479 + 468 1 479 480 + 469 1 481 482 + 470 1 482 483 + 471 1 483 484 + 472 1 484 485 + 473 1 485 486 + 474 1 486 487 + 475 1 487 488 + 476 1 488 489 + 477 1 489 490 + 478 1 490 491 + 479 1 491 492 + 480 1 492 493 + 481 1 493 494 + 482 1 494 495 + 483 1 495 496 + 484 1 496 497 + 485 1 497 498 + 486 1 498 499 + 487 1 499 500 + 488 1 500 501 + 489 1 501 502 + 490 1 502 503 + 491 1 503 504 + 492 1 504 505 + 493 1 505 506 + 494 1 506 507 + 495 1 507 508 + 496 1 508 509 + 497 1 509 510 + 498 1 510 511 + 499 1 511 512 + 500 1 512 513 + 501 1 513 514 + 502 1 514 515 + 503 1 515 516 + 504 1 516 517 + 505 1 517 518 + 506 1 518 519 + 507 1 519 520 + 508 1 521 522 + 509 1 522 523 + 510 1 523 524 + 511 1 524 525 + 512 1 525 526 + 513 1 526 527 + 514 1 527 528 + 515 1 528 529 + 516 1 529 530 + 517 1 530 531 + 518 1 531 532 + 519 1 532 533 + 520 1 533 534 + 521 1 534 535 + 522 1 535 536 + 523 1 536 537 + 524 1 537 538 + 525 1 538 539 + 526 1 539 540 + 527 1 540 541 + 528 1 541 542 + 529 1 542 543 + 530 1 543 544 + 531 1 544 545 + 532 1 545 546 + 533 1 546 547 + 534 1 547 548 + 535 1 548 549 + 536 1 549 550 + 537 1 550 551 + 538 1 551 552 + 539 1 552 553 + 540 1 553 554 + 541 1 554 555 + 542 1 555 556 + 543 1 556 557 + 544 1 557 558 + 545 1 558 559 + 546 1 559 560 + 547 1 561 562 + 548 1 562 563 + 549 1 563 564 + 550 1 564 565 + 551 1 565 566 + 552 1 566 567 + 553 1 567 568 + 554 1 568 569 + 555 1 569 570 + 556 1 570 571 + 557 1 571 572 + 558 1 572 573 + 559 1 573 574 + 560 1 574 575 + 561 1 575 576 + 562 1 576 577 + 563 1 577 578 + 564 1 578 579 + 565 1 579 580 + 566 1 580 581 + 567 1 581 582 + 568 1 582 583 + 569 1 583 584 + 570 1 584 585 + 571 1 585 586 + 572 1 586 587 + 573 1 587 588 + 574 1 588 589 + 575 1 589 590 + 576 1 590 591 + 577 1 591 592 + 578 1 592 593 + 579 1 593 594 + 580 1 594 595 + 581 1 595 596 + 582 1 596 597 + 583 1 597 598 + 584 1 598 599 + 585 1 599 600 + 586 1 601 602 + 587 1 602 603 + 588 1 603 604 + 589 1 604 605 + 590 1 605 606 + 591 1 606 607 + 592 1 607 608 + 593 1 608 609 + 594 1 609 610 + 595 1 610 611 + 596 1 611 612 + 597 1 612 613 + 598 1 613 614 + 599 1 614 615 + 600 1 615 616 + 601 1 616 617 + 602 1 617 618 + 603 1 618 619 + 604 1 619 620 + 605 1 620 621 + 606 1 621 622 + 607 1 622 623 + 608 1 623 624 + 609 1 624 625 + 610 1 625 626 + 611 1 626 627 + 612 1 627 628 + 613 1 628 629 + 614 1 629 630 + 615 1 630 631 + 616 1 631 632 + 617 1 632 633 + 618 1 633 634 + 619 1 634 635 + 620 1 635 636 + 621 1 636 637 + 622 1 637 638 + 623 1 638 639 + 624 1 639 640 + 625 1 641 642 + 626 1 642 643 + 627 1 643 644 + 628 1 644 645 + 629 1 645 646 + 630 1 646 647 + 631 1 647 648 + 632 1 648 649 + 633 1 649 650 + 634 1 650 651 + 635 1 651 652 + 636 1 652 653 + 637 1 653 654 + 638 1 654 655 + 639 1 655 656 + 640 1 656 657 + 641 1 657 658 + 642 1 658 659 + 643 1 659 660 + 644 1 660 661 + 645 1 661 662 + 646 1 662 663 + 647 1 663 664 + 648 1 664 665 + 649 1 665 666 + 650 1 666 667 + 651 1 667 668 + 652 1 668 669 + 653 1 669 670 + 654 1 670 671 + 655 1 671 672 + 656 1 672 673 + 657 1 673 674 + 658 1 674 675 + 659 1 675 676 + 660 1 676 677 + 661 1 677 678 + 662 1 678 679 + 663 1 679 680 + 664 1 681 682 + 665 1 682 683 + 666 1 683 684 + 667 1 684 685 + 668 1 685 686 + 669 1 686 687 + 670 1 687 688 + 671 1 688 689 + 672 1 689 690 + 673 1 690 691 + 674 1 691 692 + 675 1 692 693 + 676 1 693 694 + 677 1 694 695 + 678 1 695 696 + 679 1 696 697 + 680 1 697 698 + 681 1 698 699 + 682 1 699 700 + 683 1 700 701 + 684 1 701 702 + 685 1 702 703 + 686 1 703 704 + 687 1 704 705 + 688 1 705 706 + 689 1 706 707 + 690 1 707 708 + 691 1 708 709 + 692 1 709 710 + 693 1 710 711 + 694 1 711 712 + 695 1 712 713 + 696 1 713 714 + 697 1 714 715 + 698 1 715 716 + 699 1 716 717 + 700 1 717 718 + 701 1 718 719 + 702 1 719 720 + 703 1 721 722 + 704 1 722 723 + 705 1 723 724 + 706 1 724 725 + 707 1 725 726 + 708 1 726 727 + 709 1 727 728 + 710 1 728 729 + 711 1 729 730 + 712 1 730 731 + 713 1 731 732 + 714 1 732 733 + 715 1 733 734 + 716 1 734 735 + 717 1 735 736 + 718 1 736 737 + 719 1 737 738 + 720 1 738 739 + 721 1 739 740 + 722 1 740 741 + 723 1 741 742 + 724 1 742 743 + 725 1 743 744 + 726 1 744 745 + 727 1 745 746 + 728 1 746 747 + 729 1 747 748 + 730 1 748 749 + 731 1 749 750 + 732 1 750 751 + 733 1 751 752 + 734 1 752 753 + 735 1 753 754 + 736 1 754 755 + 737 1 755 756 + 738 1 756 757 + 739 1 757 758 + 740 1 758 759 + 741 1 759 760 + 742 1 761 762 + 743 1 762 763 + 744 1 763 764 + 745 1 764 765 + 746 1 765 766 + 747 1 766 767 + 748 1 767 768 + 749 1 768 769 + 750 1 769 770 + 751 1 770 771 + 752 1 771 772 + 753 1 772 773 + 754 1 773 774 + 755 1 774 775 + 756 1 775 776 + 757 1 776 777 + 758 1 777 778 + 759 1 778 779 + 760 1 779 780 + 761 1 780 781 + 762 1 781 782 + 763 1 782 783 + 764 1 783 784 + 765 1 784 785 + 766 1 785 786 + 767 1 786 787 + 768 1 787 788 + 769 1 788 789 + 770 1 789 790 + 771 1 790 791 + 772 1 791 792 + 773 1 792 793 + 774 1 793 794 + 775 1 794 795 + 776 1 795 796 + 777 1 796 797 + 778 1 797 798 + 779 1 798 799 + 780 1 799 800 + 781 1 801 802 + 782 1 802 803 + 783 1 803 804 + 784 1 804 805 + 785 1 805 806 + 786 1 806 807 + 787 1 807 808 + 788 1 808 809 + 789 1 809 810 + 790 1 810 811 + 791 1 811 812 + 792 1 812 813 + 793 1 813 814 + 794 1 814 815 + 795 1 815 816 + 796 1 816 817 + 797 1 817 818 + 798 1 818 819 + 799 1 819 820 + 800 1 820 821 + 801 1 821 822 + 802 1 822 823 + 803 1 823 824 + 804 1 824 825 + 805 1 825 826 + 806 1 826 827 + 807 1 827 828 + 808 1 828 829 + 809 1 829 830 + 810 1 830 831 + 811 1 831 832 + 812 1 832 833 + 813 1 833 834 + 814 1 834 835 + 815 1 835 836 + 816 1 836 837 + 817 1 837 838 + 818 1 838 839 + 819 1 839 840 + 820 1 841 842 + 821 1 842 843 + 822 1 843 844 + 823 1 844 845 + 824 1 845 846 + 825 1 846 847 + 826 1 847 848 + 827 1 848 849 + 828 1 849 850 + 829 1 850 851 + 830 1 851 852 + 831 1 852 853 + 832 1 853 854 + 833 1 854 855 + 834 1 855 856 + 835 1 856 857 + 836 1 857 858 + 837 1 858 859 + 838 1 859 860 + 839 1 860 861 + 840 1 861 862 + 841 1 862 863 + 842 1 863 864 + 843 1 864 865 + 844 1 865 866 + 845 1 866 867 + 846 1 867 868 + 847 1 868 869 + 848 1 869 870 + 849 1 870 871 + 850 1 871 872 + 851 1 872 873 + 852 1 873 874 + 853 1 874 875 + 854 1 875 876 + 855 1 876 877 + 856 1 877 878 + 857 1 878 879 + 858 1 879 880 + 859 1 881 882 + 860 1 882 883 + 861 1 883 884 + 862 1 884 885 + 863 1 885 886 + 864 1 886 887 + 865 1 887 888 + 866 1 888 889 + 867 1 889 890 + 868 1 890 891 + 869 1 891 892 + 870 1 892 893 + 871 1 893 894 + 872 1 894 895 + 873 1 895 896 + 874 1 896 897 + 875 1 897 898 + 876 1 898 899 + 877 1 899 900 + 878 1 900 901 + 879 1 901 902 + 880 1 902 903 + 881 1 903 904 + 882 1 904 905 + 883 1 905 906 + 884 1 906 907 + 885 1 907 908 + 886 1 908 909 + 887 1 909 910 + 888 1 910 911 + 889 1 911 912 + 890 1 912 913 + 891 1 913 914 + 892 1 914 915 + 893 1 915 916 + 894 1 916 917 + 895 1 917 918 + 896 1 918 919 + 897 1 919 920 + 898 1 921 922 + 899 1 922 923 + 900 1 923 924 + 901 1 924 925 + 902 1 925 926 + 903 1 926 927 + 904 1 927 928 + 905 1 928 929 + 906 1 929 930 + 907 1 930 931 + 908 1 931 932 + 909 1 932 933 + 910 1 933 934 + 911 1 934 935 + 912 1 935 936 + 913 1 936 937 + 914 1 937 938 + 915 1 938 939 + 916 1 939 940 + 917 1 940 941 + 918 1 941 942 + 919 1 942 943 + 920 1 943 944 + 921 1 944 945 + 922 1 945 946 + 923 1 946 947 + 924 1 947 948 + 925 1 948 949 + 926 1 949 950 + 927 1 950 951 + 928 1 951 952 + 929 1 952 953 + 930 1 953 954 + 931 1 954 955 + 932 1 955 956 + 933 1 956 957 + 934 1 957 958 + 935 1 958 959 + 936 1 959 960 + 937 1 961 962 + 938 1 962 963 + 939 1 963 964 + 940 1 964 965 + 941 1 965 966 + 942 1 966 967 + 943 1 967 968 + 944 1 968 969 + 945 1 969 970 + 946 1 970 971 + 947 1 971 972 + 948 1 972 973 + 949 1 973 974 + 950 1 974 975 + 951 1 975 976 + 952 1 976 977 + 953 1 977 978 + 954 1 978 979 + 955 1 979 980 + 956 1 980 981 + 957 1 981 982 + 958 1 982 983 + 959 1 983 984 + 960 1 984 985 + 961 1 985 986 + 962 1 986 987 + 963 1 987 988 + 964 1 988 989 + 965 1 989 990 + 966 1 990 991 + 967 1 991 992 + 968 1 992 993 + 969 1 993 994 + 970 1 994 995 + 971 1 995 996 + 972 1 996 997 + 973 1 997 998 + 974 1 998 999 + 975 1 999 1000 + 976 1 1001 1002 + 977 1 1002 1003 + 978 1 1003 1004 + 979 1 1004 1005 + 980 1 1005 1006 + 981 1 1006 1007 + 982 1 1007 1008 + 983 1 1008 1009 + 984 1 1009 1010 + 985 1 1010 1011 + 986 1 1011 1012 + 987 1 1012 1013 + 988 1 1013 1014 + 989 1 1014 1015 + 990 1 1015 1016 + 991 1 1016 1017 + 992 1 1017 1018 + 993 1 1018 1019 + 994 1 1019 1020 + 995 1 1020 1021 + 996 1 1021 1022 + 997 1 1022 1023 + 998 1 1023 1024 + 999 1 1024 1025 + 1000 1 1025 1026 + 1001 1 1026 1027 + 1002 1 1027 1028 + 1003 1 1028 1029 + 1004 1 1029 1030 + 1005 1 1030 1031 + 1006 1 1031 1032 + 1007 1 1032 1033 + 1008 1 1033 1034 + 1009 1 1034 1035 + 1010 1 1035 1036 + 1011 1 1036 1037 + 1012 1 1037 1038 + 1013 1 1038 1039 + 1014 1 1039 1040 + 1015 1 1041 1042 + 1016 1 1042 1043 + 1017 1 1043 1044 + 1018 1 1044 1045 + 1019 1 1045 1046 + 1020 1 1046 1047 + 1021 1 1047 1048 + 1022 1 1048 1049 + 1023 1 1049 1050 + 1024 1 1050 1051 + 1025 1 1051 1052 + 1026 1 1052 1053 + 1027 1 1053 1054 + 1028 1 1054 1055 + 1029 1 1055 1056 + 1030 1 1056 1057 + 1031 1 1057 1058 + 1032 1 1058 1059 + 1033 1 1059 1060 + 1034 1 1060 1061 + 1035 1 1061 1062 + 1036 1 1062 1063 + 1037 1 1063 1064 + 1038 1 1064 1065 + 1039 1 1065 1066 + 1040 1 1066 1067 + 1041 1 1067 1068 + 1042 1 1068 1069 + 1043 1 1069 1070 + 1044 1 1070 1071 + 1045 1 1071 1072 + 1046 1 1072 1073 + 1047 1 1073 1074 + 1048 1 1074 1075 + 1049 1 1075 1076 + 1050 1 1076 1077 + 1051 1 1077 1078 + 1052 1 1078 1079 + 1053 1 1079 1080 + 1054 1 1081 1082 + 1055 1 1082 1083 + 1056 1 1083 1084 + 1057 1 1084 1085 + 1058 1 1085 1086 + 1059 1 1086 1087 + 1060 1 1087 1088 + 1061 1 1088 1089 + 1062 1 1089 1090 + 1063 1 1090 1091 + 1064 1 1091 1092 + 1065 1 1092 1093 + 1066 1 1093 1094 + 1067 1 1094 1095 + 1068 1 1095 1096 + 1069 1 1096 1097 + 1070 1 1097 1098 + 1071 1 1098 1099 + 1072 1 1099 1100 + 1073 1 1100 1101 + 1074 1 1101 1102 + 1075 1 1102 1103 + 1076 1 1103 1104 + 1077 1 1104 1105 + 1078 1 1105 1106 + 1079 1 1106 1107 + 1080 1 1107 1108 + 1081 1 1108 1109 + 1082 1 1109 1110 + 1083 1 1110 1111 + 1084 1 1111 1112 + 1085 1 1112 1113 + 1086 1 1113 1114 + 1087 1 1114 1115 + 1088 1 1115 1116 + 1089 1 1116 1117 + 1090 1 1117 1118 + 1091 1 1118 1119 + 1092 1 1119 1120 + 1093 1 1121 1122 + 1094 1 1122 1123 + 1095 1 1123 1124 + 1096 1 1124 1125 + 1097 1 1125 1126 + 1098 1 1126 1127 + 1099 1 1127 1128 + 1100 1 1128 1129 + 1101 1 1129 1130 + 1102 1 1130 1131 + 1103 1 1131 1132 + 1104 1 1132 1133 + 1105 1 1133 1134 + 1106 1 1134 1135 + 1107 1 1135 1136 + 1108 1 1136 1137 + 1109 1 1137 1138 + 1110 1 1138 1139 + 1111 1 1139 1140 + 1112 1 1140 1141 + 1113 1 1141 1142 + 1114 1 1142 1143 + 1115 1 1143 1144 + 1116 1 1144 1145 + 1117 1 1145 1146 + 1118 1 1146 1147 + 1119 1 1147 1148 + 1120 1 1148 1149 + 1121 1 1149 1150 + 1122 1 1150 1151 + 1123 1 1151 1152 + 1124 1 1152 1153 + 1125 1 1153 1154 + 1126 1 1154 1155 + 1127 1 1155 1156 + 1128 1 1156 1157 + 1129 1 1157 1158 + 1130 1 1158 1159 + 1131 1 1159 1160 + 1132 1 1161 1162 + 1133 1 1162 1163 + 1134 1 1163 1164 + 1135 1 1164 1165 + 1136 1 1165 1166 + 1137 1 1166 1167 + 1138 1 1167 1168 + 1139 1 1168 1169 + 1140 1 1169 1170 + 1141 1 1170 1171 + 1142 1 1171 1172 + 1143 1 1172 1173 + 1144 1 1173 1174 + 1145 1 1174 1175 + 1146 1 1175 1176 + 1147 1 1176 1177 + 1148 1 1177 1178 + 1149 1 1178 1179 + 1150 1 1179 1180 + 1151 1 1180 1181 + 1152 1 1181 1182 + 1153 1 1182 1183 + 1154 1 1183 1184 + 1155 1 1184 1185 + 1156 1 1185 1186 + 1157 1 1186 1187 + 1158 1 1187 1188 + 1159 1 1188 1189 + 1160 1 1189 1190 + 1161 1 1190 1191 + 1162 1 1191 1192 + 1163 1 1192 1193 + 1164 1 1193 1194 + 1165 1 1194 1195 + 1166 1 1195 1196 + 1167 1 1196 1197 + 1168 1 1197 1198 + 1169 1 1198 1199 + 1170 1 1199 1200 + 1171 1 1201 1202 + 1172 1 1202 1203 + 1173 1 1203 1204 + 1174 1 1204 1205 + 1175 1 1205 1206 + 1176 1 1206 1207 + 1177 1 1207 1208 + 1178 1 1208 1209 + 1179 1 1209 1210 + 1180 1 1210 1211 + 1181 1 1211 1212 + 1182 1 1212 1213 + 1183 1 1213 1214 + 1184 1 1214 1215 + 1185 1 1215 1216 + 1186 1 1216 1217 + 1187 1 1217 1218 + 1188 1 1218 1219 + 1189 1 1219 1220 + 1190 1 1220 1221 + 1191 1 1221 1222 + 1192 1 1222 1223 + 1193 1 1223 1224 + 1194 1 1224 1225 + 1195 1 1225 1226 + 1196 1 1226 1227 + 1197 1 1227 1228 + 1198 1 1228 1229 + 1199 1 1229 1230 + 1200 1 1230 1231 + 1201 1 1231 1232 + 1202 1 1232 1233 + 1203 1 1233 1234 + 1204 1 1234 1235 + 1205 1 1235 1236 + 1206 1 1236 1237 + 1207 1 1237 1238 + 1208 1 1238 1239 + 1209 1 1239 1240 + 1210 1 1241 1242 + 1211 1 1242 1243 + 1212 1 1243 1244 + 1213 1 1244 1245 + 1214 1 1245 1246 + 1215 1 1246 1247 + 1216 1 1247 1248 + 1217 1 1248 1249 + 1218 1 1249 1250 + 1219 1 1250 1251 + 1220 1 1251 1252 + 1221 1 1252 1253 + 1222 1 1253 1254 + 1223 1 1254 1255 + 1224 1 1255 1256 + 1225 1 1256 1257 + 1226 1 1257 1258 + 1227 1 1258 1259 + 1228 1 1259 1260 + 1229 1 1260 1261 + 1230 1 1261 1262 + 1231 1 1262 1263 + 1232 1 1263 1264 + 1233 1 1264 1265 + 1234 1 1265 1266 + 1235 1 1266 1267 + 1236 1 1267 1268 + 1237 1 1268 1269 + 1238 1 1269 1270 + 1239 1 1270 1271 + 1240 1 1271 1272 + 1241 1 1272 1273 + 1242 1 1273 1274 + 1243 1 1274 1275 + 1244 1 1275 1276 + 1245 1 1276 1277 + 1246 1 1277 1278 + 1247 1 1278 1279 + 1248 1 1279 1280 + 1249 1 1281 1282 + 1250 1 1282 1283 + 1251 1 1283 1284 + 1252 1 1284 1285 + 1253 1 1285 1286 + 1254 1 1286 1287 + 1255 1 1287 1288 + 1256 1 1288 1289 + 1257 1 1289 1290 + 1258 1 1290 1291 + 1259 1 1291 1292 + 1260 1 1292 1293 + 1261 1 1293 1294 + 1262 1 1294 1295 + 1263 1 1295 1296 + 1264 1 1296 1297 + 1265 1 1297 1298 + 1266 1 1298 1299 + 1267 1 1299 1300 + 1268 1 1300 1301 + 1269 1 1301 1302 + 1270 1 1302 1303 + 1271 1 1303 1304 + 1272 1 1304 1305 + 1273 1 1305 1306 + 1274 1 1306 1307 + 1275 1 1307 1308 + 1276 1 1308 1309 + 1277 1 1309 1310 + 1278 1 1310 1311 + 1279 1 1311 1312 + 1280 1 1312 1313 + 1281 1 1313 1314 + 1282 1 1314 1315 + 1283 1 1315 1316 + 1284 1 1316 1317 + 1285 1 1317 1318 + 1286 1 1318 1319 + 1287 1 1319 1320 + 1288 1 1321 1322 + 1289 1 1322 1323 + 1290 1 1323 1324 + 1291 1 1324 1325 + 1292 1 1325 1326 + 1293 1 1326 1327 + 1294 1 1327 1328 + 1295 1 1328 1329 + 1296 1 1329 1330 + 1297 1 1330 1331 + 1298 1 1331 1332 + 1299 1 1332 1333 + 1300 1 1333 1334 + 1301 1 1334 1335 + 1302 1 1335 1336 + 1303 1 1336 1337 + 1304 1 1337 1338 + 1305 1 1338 1339 + 1306 1 1339 1340 + 1307 1 1340 1341 + 1308 1 1341 1342 + 1309 1 1342 1343 + 1310 1 1343 1344 + 1311 1 1344 1345 + 1312 1 1345 1346 + 1313 1 1346 1347 + 1314 1 1347 1348 + 1315 1 1348 1349 + 1316 1 1349 1350 + 1317 1 1350 1351 + 1318 1 1351 1352 + 1319 1 1352 1353 + 1320 1 1353 1354 + 1321 1 1354 1355 + 1322 1 1355 1356 + 1323 1 1356 1357 + 1324 1 1357 1358 + 1325 1 1358 1359 + 1326 1 1359 1360 + 1327 1 1361 1362 + 1328 1 1362 1363 + 1329 1 1363 1364 + 1330 1 1364 1365 + 1331 1 1365 1366 + 1332 1 1366 1367 + 1333 1 1367 1368 + 1334 1 1368 1369 + 1335 1 1369 1370 + 1336 1 1370 1371 + 1337 1 1371 1372 + 1338 1 1372 1373 + 1339 1 1373 1374 + 1340 1 1374 1375 + 1341 1 1375 1376 + 1342 1 1376 1377 + 1343 1 1377 1378 + 1344 1 1378 1379 + 1345 1 1379 1380 + 1346 1 1380 1381 + 1347 1 1381 1382 + 1348 1 1382 1383 + 1349 1 1383 1384 + 1350 1 1384 1385 + 1351 1 1385 1386 + 1352 1 1386 1387 + 1353 1 1387 1388 + 1354 1 1388 1389 + 1355 1 1389 1390 + 1356 1 1390 1391 + 1357 1 1391 1392 + 1358 1 1392 1393 + 1359 1 1393 1394 + 1360 1 1394 1395 + 1361 1 1395 1396 + 1362 1 1396 1397 + 1363 1 1397 1398 + 1364 1 1398 1399 + 1365 1 1399 1400 + 1366 1 1401 1402 + 1367 1 1402 1403 + 1368 1 1403 1404 + 1369 1 1404 1405 + 1370 1 1405 1406 + 1371 1 1406 1407 + 1372 1 1407 1408 + 1373 1 1408 1409 + 1374 1 1409 1410 + 1375 1 1410 1411 + 1376 1 1411 1412 + 1377 1 1412 1413 + 1378 1 1413 1414 + 1379 1 1414 1415 + 1380 1 1415 1416 + 1381 1 1416 1417 + 1382 1 1417 1418 + 1383 1 1418 1419 + 1384 1 1419 1420 + 1385 1 1420 1421 + 1386 1 1421 1422 + 1387 1 1422 1423 + 1388 1 1423 1424 + 1389 1 1424 1425 + 1390 1 1425 1426 + 1391 1 1426 1427 + 1392 1 1427 1428 + 1393 1 1428 1429 + 1394 1 1429 1430 + 1395 1 1430 1431 + 1396 1 1431 1432 + 1397 1 1432 1433 + 1398 1 1433 1434 + 1399 1 1434 1435 + 1400 1 1435 1436 + 1401 1 1436 1437 + 1402 1 1437 1438 + 1403 1 1438 1439 + 1404 1 1439 1440 + 1405 1 1441 1442 + 1406 1 1442 1443 + 1407 1 1443 1444 + 1408 1 1444 1445 + 1409 1 1445 1446 + 1410 1 1446 1447 + 1411 1 1447 1448 + 1412 1 1448 1449 + 1413 1 1449 1450 + 1414 1 1450 1451 + 1415 1 1451 1452 + 1416 1 1452 1453 + 1417 1 1453 1454 + 1418 1 1454 1455 + 1419 1 1455 1456 + 1420 1 1456 1457 + 1421 1 1457 1458 + 1422 1 1458 1459 + 1423 1 1459 1460 + 1424 1 1460 1461 + 1425 1 1461 1462 + 1426 1 1462 1463 + 1427 1 1463 1464 + 1428 1 1464 1465 + 1429 1 1465 1466 + 1430 1 1466 1467 + 1431 1 1467 1468 + 1432 1 1468 1469 + 1433 1 1469 1470 + 1434 1 1470 1471 + 1435 1 1471 1472 + 1436 1 1472 1473 + 1437 1 1473 1474 + 1438 1 1474 1475 + 1439 1 1475 1476 + 1440 1 1476 1477 + 1441 1 1477 1478 + 1442 1 1478 1479 + 1443 1 1479 1480 + 1444 1 1481 1482 + 1445 1 1482 1483 + 1446 1 1483 1484 + 1447 1 1484 1485 + 1448 1 1485 1486 + 1449 1 1486 1487 + 1450 1 1487 1488 + 1451 1 1488 1489 + 1452 1 1489 1490 + 1453 1 1490 1491 + 1454 1 1491 1492 + 1455 1 1492 1493 + 1456 1 1493 1494 + 1457 1 1494 1495 + 1458 1 1495 1496 + 1459 1 1496 1497 + 1460 1 1497 1498 + 1461 1 1498 1499 + 1462 1 1499 1500 + 1463 1 1500 1501 + 1464 1 1501 1502 + 1465 1 1502 1503 + 1466 1 1503 1504 + 1467 1 1504 1505 + 1468 1 1505 1506 + 1469 1 1506 1507 + 1470 1 1507 1508 + 1471 1 1508 1509 + 1472 1 1509 1510 + 1473 1 1510 1511 + 1474 1 1511 1512 + 1475 1 1512 1513 + 1476 1 1513 1514 + 1477 1 1514 1515 + 1478 1 1515 1516 + 1479 1 1516 1517 + 1480 1 1517 1518 + 1481 1 1518 1519 + 1482 1 1519 1520 + 1483 1 1521 1522 + 1484 1 1522 1523 + 1485 1 1523 1524 + 1486 1 1524 1525 + 1487 1 1525 1526 + 1488 1 1526 1527 + 1489 1 1527 1528 + 1490 1 1528 1529 + 1491 1 1529 1530 + 1492 1 1530 1531 + 1493 1 1531 1532 + 1494 1 1532 1533 + 1495 1 1533 1534 + 1496 1 1534 1535 + 1497 1 1535 1536 + 1498 1 1536 1537 + 1499 1 1537 1538 + 1500 1 1538 1539 + 1501 1 1539 1540 + 1502 1 1540 1541 + 1503 1 1541 1542 + 1504 1 1542 1543 + 1505 1 1543 1544 + 1506 1 1544 1545 + 1507 1 1545 1546 + 1508 1 1546 1547 + 1509 1 1547 1548 + 1510 1 1548 1549 + 1511 1 1549 1550 + 1512 1 1550 1551 + 1513 1 1551 1552 + 1514 1 1552 1553 + 1515 1 1553 1554 + 1516 1 1554 1555 + 1517 1 1555 1556 + 1518 1 1556 1557 + 1519 1 1557 1558 + 1520 1 1558 1559 + 1521 1 1559 1560 + 1522 1 1561 1562 + 1523 1 1562 1563 + 1524 1 1563 1564 + 1525 1 1564 1565 + 1526 1 1565 1566 + 1527 1 1566 1567 + 1528 1 1567 1568 + 1529 1 1568 1569 + 1530 1 1569 1570 + 1531 1 1570 1571 + 1532 1 1571 1572 + 1533 1 1572 1573 + 1534 1 1573 1574 + 1535 1 1574 1575 + 1536 1 1575 1576 + 1537 1 1576 1577 + 1538 1 1577 1578 + 1539 1 1578 1579 + 1540 1 1579 1580 + 1541 1 1580 1581 + 1542 1 1581 1582 + 1543 1 1582 1583 + 1544 1 1583 1584 + 1545 1 1584 1585 + 1546 1 1585 1586 + 1547 1 1586 1587 + 1548 1 1587 1588 + 1549 1 1588 1589 + 1550 1 1589 1590 + 1551 1 1590 1591 + 1552 1 1591 1592 + 1553 1 1592 1593 + 1554 1 1593 1594 + 1555 1 1594 1595 + 1556 1 1595 1596 + 1557 1 1596 1597 + 1558 1 1597 1598 + 1559 1 1598 1599 + 1560 1 1599 1600 + 1561 1 1601 1602 + 1562 1 1602 1603 + 1563 1 1603 1604 + 1564 1 1604 1605 + 1565 1 1605 1606 + 1566 1 1606 1607 + 1567 1 1607 1608 + 1568 1 1608 1609 + 1569 1 1609 1610 + 1570 1 1610 1611 + 1571 1 1611 1612 + 1572 1 1612 1613 + 1573 1 1613 1614 + 1574 1 1614 1615 + 1575 1 1615 1616 + 1576 1 1616 1617 + 1577 1 1617 1618 + 1578 1 1618 1619 + 1579 1 1619 1620 + 1580 1 1620 1621 + 1581 1 1621 1622 + 1582 1 1622 1623 + 1583 1 1623 1624 + 1584 1 1624 1625 + 1585 1 1625 1626 + 1586 1 1626 1627 + 1587 1 1627 1628 + 1588 1 1628 1629 + 1589 1 1629 1630 + 1590 1 1630 1631 + 1591 1 1631 1632 + 1592 1 1632 1633 + 1593 1 1633 1634 + 1594 1 1634 1635 + 1595 1 1635 1636 + 1596 1 1636 1637 + 1597 1 1637 1638 + 1598 1 1638 1639 + 1599 1 1639 1640 + 1600 1 1641 1642 + 1601 1 1642 1643 + 1602 1 1643 1644 + 1603 1 1644 1645 + 1604 1 1645 1646 + 1605 1 1646 1647 + 1606 1 1647 1648 + 1607 1 1648 1649 + 1608 1 1649 1650 + 1609 1 1650 1651 + 1610 1 1651 1652 + 1611 1 1652 1653 + 1612 1 1653 1654 + 1613 1 1654 1655 + 1614 1 1655 1656 + 1615 1 1656 1657 + 1616 1 1657 1658 + 1617 1 1658 1659 + 1618 1 1659 1660 + 1619 1 1660 1661 + 1620 1 1661 1662 + 1621 1 1662 1663 + 1622 1 1663 1664 + 1623 1 1664 1665 + 1624 1 1665 1666 + 1625 1 1666 1667 + 1626 1 1667 1668 + 1627 1 1668 1669 + 1628 1 1669 1670 + 1629 1 1670 1671 + 1630 1 1671 1672 + 1631 1 1672 1673 + 1632 1 1673 1674 + 1633 1 1674 1675 + 1634 1 1675 1676 + 1635 1 1676 1677 + 1636 1 1677 1678 + 1637 1 1678 1679 + 1638 1 1679 1680 + 1639 1 1681 1682 + 1640 1 1682 1683 + 1641 1 1683 1684 + 1642 1 1684 1685 + 1643 1 1685 1686 + 1644 1 1686 1687 + 1645 1 1687 1688 + 1646 1 1688 1689 + 1647 1 1689 1690 + 1648 1 1690 1691 + 1649 1 1691 1692 + 1650 1 1692 1693 + 1651 1 1693 1694 + 1652 1 1694 1695 + 1653 1 1695 1696 + 1654 1 1696 1697 + 1655 1 1697 1698 + 1656 1 1698 1699 + 1657 1 1699 1700 + 1658 1 1700 1701 + 1659 1 1701 1702 + 1660 1 1702 1703 + 1661 1 1703 1704 + 1662 1 1704 1705 + 1663 1 1705 1706 + 1664 1 1706 1707 + 1665 1 1707 1708 + 1666 1 1708 1709 + 1667 1 1709 1710 + 1668 1 1710 1711 + 1669 1 1711 1712 + 1670 1 1712 1713 + 1671 1 1713 1714 + 1672 1 1714 1715 + 1673 1 1715 1716 + 1674 1 1716 1717 + 1675 1 1717 1718 + 1676 1 1718 1719 + 1677 1 1719 1720 + 1678 1 1721 1722 + 1679 1 1722 1723 + 1680 1 1723 1724 + 1681 1 1724 1725 + 1682 1 1725 1726 + 1683 1 1726 1727 + 1684 1 1727 1728 + 1685 1 1728 1729 + 1686 1 1729 1730 + 1687 1 1730 1731 + 1688 1 1731 1732 + 1689 1 1732 1733 + 1690 1 1733 1734 + 1691 1 1734 1735 + 1692 1 1735 1736 + 1693 1 1736 1737 + 1694 1 1737 1738 + 1695 1 1738 1739 + 1696 1 1739 1740 + 1697 1 1740 1741 + 1698 1 1741 1742 + 1699 1 1742 1743 + 1700 1 1743 1744 + 1701 1 1744 1745 + 1702 1 1745 1746 + 1703 1 1746 1747 + 1704 1 1747 1748 + 1705 1 1748 1749 + 1706 1 1749 1750 + 1707 1 1750 1751 + 1708 1 1751 1752 + 1709 1 1752 1753 + 1710 1 1753 1754 + 1711 1 1754 1755 + 1712 1 1755 1756 + 1713 1 1756 1757 + 1714 1 1757 1758 + 1715 1 1758 1759 + 1716 1 1759 1760 + 1717 1 1761 1762 + 1718 1 1762 1763 + 1719 1 1763 1764 + 1720 1 1764 1765 + 1721 1 1765 1766 + 1722 1 1766 1767 + 1723 1 1767 1768 + 1724 1 1768 1769 + 1725 1 1769 1770 + 1726 1 1770 1771 + 1727 1 1771 1772 + 1728 1 1772 1773 + 1729 1 1773 1774 + 1730 1 1774 1775 + 1731 1 1775 1776 + 1732 1 1776 1777 + 1733 1 1777 1778 + 1734 1 1778 1779 + 1735 1 1779 1780 + 1736 1 1780 1781 + 1737 1 1781 1782 + 1738 1 1782 1783 + 1739 1 1783 1784 + 1740 1 1784 1785 + 1741 1 1785 1786 + 1742 1 1786 1787 + 1743 1 1787 1788 + 1744 1 1788 1789 + 1745 1 1789 1790 + 1746 1 1790 1791 + 1747 1 1791 1792 + 1748 1 1792 1793 + 1749 1 1793 1794 + 1750 1 1794 1795 + 1751 1 1795 1796 + 1752 1 1796 1797 + 1753 1 1797 1798 + 1754 1 1798 1799 + 1755 1 1799 1800 + 1756 1 1801 1802 + 1757 1 1802 1803 + 1758 1 1803 1804 + 1759 1 1804 1805 + 1760 1 1805 1806 + 1761 1 1806 1807 + 1762 1 1807 1808 + 1763 1 1808 1809 + 1764 1 1809 1810 + 1765 1 1810 1811 + 1766 1 1811 1812 + 1767 1 1812 1813 + 1768 1 1813 1814 + 1769 1 1814 1815 + 1770 1 1815 1816 + 1771 1 1816 1817 + 1772 1 1817 1818 + 1773 1 1818 1819 + 1774 1 1819 1820 + 1775 1 1820 1821 + 1776 1 1821 1822 + 1777 1 1822 1823 + 1778 1 1823 1824 + 1779 1 1824 1825 + 1780 1 1825 1826 + 1781 1 1826 1827 + 1782 1 1827 1828 + 1783 1 1828 1829 + 1784 1 1829 1830 + 1785 1 1830 1831 + 1786 1 1831 1832 + 1787 1 1832 1833 + 1788 1 1833 1834 + 1789 1 1834 1835 + 1790 1 1835 1836 + 1791 1 1836 1837 + 1792 1 1837 1838 + 1793 1 1838 1839 + 1794 1 1839 1840 + 1795 1 1841 1842 + 1796 1 1842 1843 + 1797 1 1843 1844 + 1798 1 1844 1845 + 1799 1 1845 1846 + 1800 1 1846 1847 + 1801 1 1847 1848 + 1802 1 1848 1849 + 1803 1 1849 1850 + 1804 1 1850 1851 + 1805 1 1851 1852 + 1806 1 1852 1853 + 1807 1 1853 1854 + 1808 1 1854 1855 + 1809 1 1855 1856 + 1810 1 1856 1857 + 1811 1 1857 1858 + 1812 1 1858 1859 + 1813 1 1859 1860 + 1814 1 1860 1861 + 1815 1 1861 1862 + 1816 1 1862 1863 + 1817 1 1863 1864 + 1818 1 1864 1865 + 1819 1 1865 1866 + 1820 1 1866 1867 + 1821 1 1867 1868 + 1822 1 1868 1869 + 1823 1 1869 1870 + 1824 1 1870 1871 + 1825 1 1871 1872 + 1826 1 1872 1873 + 1827 1 1873 1874 + 1828 1 1874 1875 + 1829 1 1875 1876 + 1830 1 1876 1877 + 1831 1 1877 1878 + 1832 1 1878 1879 + 1833 1 1879 1880 + 1834 1 1881 1882 + 1835 1 1882 1883 + 1836 1 1883 1884 + 1837 1 1884 1885 + 1838 1 1885 1886 + 1839 1 1886 1887 + 1840 1 1887 1888 + 1841 1 1888 1889 + 1842 1 1889 1890 + 1843 1 1890 1891 + 1844 1 1891 1892 + 1845 1 1892 1893 + 1846 1 1893 1894 + 1847 1 1894 1895 + 1848 1 1895 1896 + 1849 1 1896 1897 + 1850 1 1897 1898 + 1851 1 1898 1899 + 1852 1 1899 1900 + 1853 1 1900 1901 + 1854 1 1901 1902 + 1855 1 1902 1903 + 1856 1 1903 1904 + 1857 1 1904 1905 + 1858 1 1905 1906 + 1859 1 1906 1907 + 1860 1 1907 1908 + 1861 1 1908 1909 + 1862 1 1909 1910 + 1863 1 1910 1911 + 1864 1 1911 1912 + 1865 1 1912 1913 + 1866 1 1913 1914 + 1867 1 1914 1915 + 1868 1 1915 1916 + 1869 1 1916 1917 + 1870 1 1917 1918 + 1871 1 1918 1919 + 1872 1 1919 1920 + 1873 1 1921 1922 + 1874 1 1922 1923 + 1875 1 1923 1924 + 1876 1 1924 1925 + 1877 1 1925 1926 + 1878 1 1926 1927 + 1879 1 1927 1928 + 1880 1 1928 1929 + 1881 1 1929 1930 + 1882 1 1930 1931 + 1883 1 1931 1932 + 1884 1 1932 1933 + 1885 1 1933 1934 + 1886 1 1934 1935 + 1887 1 1935 1936 + 1888 1 1936 1937 + 1889 1 1937 1938 + 1890 1 1938 1939 + 1891 1 1939 1940 + 1892 1 1940 1941 + 1893 1 1941 1942 + 1894 1 1942 1943 + 1895 1 1943 1944 + 1896 1 1944 1945 + 1897 1 1945 1946 + 1898 1 1946 1947 + 1899 1 1947 1948 + 1900 1 1948 1949 + 1901 1 1949 1950 + 1902 1 1950 1951 + 1903 1 1951 1952 + 1904 1 1952 1953 + 1905 1 1953 1954 + 1906 1 1954 1955 + 1907 1 1955 1956 + 1908 1 1956 1957 + 1909 1 1957 1958 + 1910 1 1958 1959 + 1911 1 1959 1960 + 1912 1 1961 1962 + 1913 1 1962 1963 + 1914 1 1963 1964 + 1915 1 1964 1965 + 1916 1 1965 1966 + 1917 1 1966 1967 + 1918 1 1967 1968 + 1919 1 1968 1969 + 1920 1 1969 1970 + 1921 1 1970 1971 + 1922 1 1971 1972 + 1923 1 1972 1973 + 1924 1 1973 1974 + 1925 1 1974 1975 + 1926 1 1975 1976 + 1927 1 1976 1977 + 1928 1 1977 1978 + 1929 1 1978 1979 + 1930 1 1979 1980 + 1931 1 1980 1981 + 1932 1 1981 1982 + 1933 1 1982 1983 + 1934 1 1983 1984 + 1935 1 1984 1985 + 1936 1 1985 1986 + 1937 1 1986 1987 + 1938 1 1987 1988 + 1939 1 1988 1989 + 1940 1 1989 1990 + 1941 1 1990 1991 + 1942 1 1991 1992 + 1943 1 1992 1993 + 1944 1 1993 1994 + 1945 1 1994 1995 + 1946 1 1995 1996 + 1947 1 1996 1997 + 1948 1 1997 1998 + 1949 1 1998 1999 + 1950 1 1999 2000 + 1951 1 2001 2002 + 1952 1 2002 2003 + 1953 1 2003 2004 + 1954 1 2004 2005 + 1955 1 2005 2006 + 1956 1 2006 2007 + 1957 1 2007 2008 + 1958 1 2008 2009 + 1959 1 2009 2010 + 1960 1 2010 2011 + 1961 1 2011 2012 + 1962 1 2012 2013 + 1963 1 2013 2014 + 1964 1 2014 2015 + 1965 1 2015 2016 + 1966 1 2016 2017 + 1967 1 2017 2018 + 1968 1 2018 2019 + 1969 1 2019 2020 + 1970 1 2020 2021 + 1971 1 2021 2022 + 1972 1 2022 2023 + 1973 1 2023 2024 + 1974 1 2024 2025 + 1975 1 2025 2026 + 1976 1 2026 2027 + 1977 1 2027 2028 + 1978 1 2028 2029 + 1979 1 2029 2030 + 1980 1 2030 2031 + 1981 1 2031 2032 + 1982 1 2032 2033 + 1983 1 2033 2034 + 1984 1 2034 2035 + 1985 1 2035 2036 + 1986 1 2036 2037 + 1987 1 2037 2038 + 1988 1 2038 2039 + 1989 1 2039 2040 + 1990 1 2041 2042 + 1991 1 2042 2043 + 1992 1 2043 2044 + 1993 1 2044 2045 + 1994 1 2045 2046 + 1995 1 2046 2047 + 1996 1 2047 2048 + 1997 1 2048 2049 + 1998 1 2049 2050 + 1999 1 2050 2051 + 2000 1 2051 2052 + 2001 1 2052 2053 + 2002 1 2053 2054 + 2003 1 2054 2055 + 2004 1 2055 2056 + 2005 1 2056 2057 + 2006 1 2057 2058 + 2007 1 2058 2059 + 2008 1 2059 2060 + 2009 1 2060 2061 + 2010 1 2061 2062 + 2011 1 2062 2063 + 2012 1 2063 2064 + 2013 1 2064 2065 + 2014 1 2065 2066 + 2015 1 2066 2067 + 2016 1 2067 2068 + 2017 1 2068 2069 + 2018 1 2069 2070 + 2019 1 2070 2071 + 2020 1 2071 2072 + 2021 1 2072 2073 + 2022 1 2073 2074 + 2023 1 2074 2075 + 2024 1 2075 2076 + 2025 1 2076 2077 + 2026 1 2077 2078 + 2027 1 2078 2079 + 2028 1 2079 2080 + 2029 1 2081 2082 + 2030 1 2082 2083 + 2031 1 2083 2084 + 2032 1 2084 2085 + 2033 1 2085 2086 + 2034 1 2086 2087 + 2035 1 2087 2088 + 2036 1 2088 2089 + 2037 1 2089 2090 + 2038 1 2090 2091 + 2039 1 2091 2092 + 2040 1 2092 2093 + 2041 1 2093 2094 + 2042 1 2094 2095 + 2043 1 2095 2096 + 2044 1 2096 2097 + 2045 1 2097 2098 + 2046 1 2098 2099 + 2047 1 2099 2100 + 2048 1 2100 2101 + 2049 1 2101 2102 + 2050 1 2102 2103 + 2051 1 2103 2104 + 2052 1 2104 2105 + 2053 1 2105 2106 + 2054 1 2106 2107 + 2055 1 2107 2108 + 2056 1 2108 2109 + 2057 1 2109 2110 + 2058 1 2110 2111 + 2059 1 2111 2112 + 2060 1 2112 2113 + 2061 1 2113 2114 + 2062 1 2114 2115 + 2063 1 2115 2116 + 2064 1 2116 2117 + 2065 1 2117 2118 + 2066 1 2118 2119 + 2067 1 2119 2120 + 2068 1 2121 2122 + 2069 1 2122 2123 + 2070 1 2123 2124 + 2071 1 2124 2125 + 2072 1 2125 2126 + 2073 1 2126 2127 + 2074 1 2127 2128 + 2075 1 2128 2129 + 2076 1 2129 2130 + 2077 1 2130 2131 + 2078 1 2131 2132 + 2079 1 2132 2133 + 2080 1 2133 2134 + 2081 1 2134 2135 + 2082 1 2135 2136 + 2083 1 2136 2137 + 2084 1 2137 2138 + 2085 1 2138 2139 + 2086 1 2139 2140 + 2087 1 2140 2141 + 2088 1 2141 2142 + 2089 1 2142 2143 + 2090 1 2143 2144 + 2091 1 2144 2145 + 2092 1 2145 2146 + 2093 1 2146 2147 + 2094 1 2147 2148 + 2095 1 2148 2149 + 2096 1 2149 2150 + 2097 1 2150 2151 + 2098 1 2151 2152 + 2099 1 2152 2153 + 2100 1 2153 2154 + 2101 1 2154 2155 + 2102 1 2155 2156 + 2103 1 2156 2157 + 2104 1 2157 2158 + 2105 1 2158 2159 + 2106 1 2159 2160 + 2107 1 2161 2162 + 2108 1 2162 2163 + 2109 1 2163 2164 + 2110 1 2164 2165 + 2111 1 2165 2166 + 2112 1 2166 2167 + 2113 1 2167 2168 + 2114 1 2168 2169 + 2115 1 2169 2170 + 2116 1 2170 2171 + 2117 1 2171 2172 + 2118 1 2172 2173 + 2119 1 2173 2174 + 2120 1 2174 2175 + 2121 1 2175 2176 + 2122 1 2176 2177 + 2123 1 2177 2178 + 2124 1 2178 2179 + 2125 1 2179 2180 + 2126 1 2180 2181 + 2127 1 2181 2182 + 2128 1 2182 2183 + 2129 1 2183 2184 + 2130 1 2184 2185 + 2131 1 2185 2186 + 2132 1 2186 2187 + 2133 1 2187 2188 + 2134 1 2188 2189 + 2135 1 2189 2190 + 2136 1 2190 2191 + 2137 1 2191 2192 + 2138 1 2192 2193 + 2139 1 2193 2194 + 2140 1 2194 2195 + 2141 1 2195 2196 + 2142 1 2196 2197 + 2143 1 2197 2198 + 2144 1 2198 2199 + 2145 1 2199 2200 + 2146 1 2201 2202 + 2147 1 2202 2203 + 2148 1 2203 2204 + 2149 1 2204 2205 + 2150 1 2205 2206 + 2151 1 2206 2207 + 2152 1 2207 2208 + 2153 1 2208 2209 + 2154 1 2209 2210 + 2155 1 2210 2211 + 2156 1 2211 2212 + 2157 1 2212 2213 + 2158 1 2213 2214 + 2159 1 2214 2215 + 2160 1 2215 2216 + 2161 1 2216 2217 + 2162 1 2217 2218 + 2163 1 2218 2219 + 2164 1 2219 2220 + 2165 1 2220 2221 + 2166 1 2221 2222 + 2167 1 2222 2223 + 2168 1 2223 2224 + 2169 1 2224 2225 + 2170 1 2225 2226 + 2171 1 2226 2227 + 2172 1 2227 2228 + 2173 1 2228 2229 + 2174 1 2229 2230 + 2175 1 2230 2231 + 2176 1 2231 2232 + 2177 1 2232 2233 + 2178 1 2233 2234 + 2179 1 2234 2235 + 2180 1 2235 2236 + 2181 1 2236 2237 + 2182 1 2237 2238 + 2183 1 2238 2239 + 2184 1 2239 2240 + 2185 1 2241 2242 + 2186 1 2242 2243 + 2187 1 2243 2244 + 2188 1 2244 2245 + 2189 1 2245 2246 + 2190 1 2246 2247 + 2191 1 2247 2248 + 2192 1 2248 2249 + 2193 1 2249 2250 + 2194 1 2250 2251 + 2195 1 2251 2252 + 2196 1 2252 2253 + 2197 1 2253 2254 + 2198 1 2254 2255 + 2199 1 2255 2256 + 2200 1 2256 2257 + 2201 1 2257 2258 + 2202 1 2258 2259 + 2203 1 2259 2260 + 2204 1 2260 2261 + 2205 1 2261 2262 + 2206 1 2262 2263 + 2207 1 2263 2264 + 2208 1 2264 2265 + 2209 1 2265 2266 + 2210 1 2266 2267 + 2211 1 2267 2268 + 2212 1 2268 2269 + 2213 1 2269 2270 + 2214 1 2270 2271 + 2215 1 2271 2272 + 2216 1 2272 2273 + 2217 1 2273 2274 + 2218 1 2274 2275 + 2219 1 2275 2276 + 2220 1 2276 2277 + 2221 1 2277 2278 + 2222 1 2278 2279 + 2223 1 2279 2280 + 2224 1 2281 2282 + 2225 1 2282 2283 + 2226 1 2283 2284 + 2227 1 2284 2285 + 2228 1 2285 2286 + 2229 1 2286 2287 + 2230 1 2287 2288 + 2231 1 2288 2289 + 2232 1 2289 2290 + 2233 1 2290 2291 + 2234 1 2291 2292 + 2235 1 2292 2293 + 2236 1 2293 2294 + 2237 1 2294 2295 + 2238 1 2295 2296 + 2239 1 2296 2297 + 2240 1 2297 2298 + 2241 1 2298 2299 + 2242 1 2299 2300 + 2243 1 2300 2301 + 2244 1 2301 2302 + 2245 1 2302 2303 + 2246 1 2303 2304 + 2247 1 2304 2305 + 2248 1 2305 2306 + 2249 1 2306 2307 + 2250 1 2307 2308 + 2251 1 2308 2309 + 2252 1 2309 2310 + 2253 1 2310 2311 + 2254 1 2311 2312 + 2255 1 2312 2313 + 2256 1 2313 2314 + 2257 1 2314 2315 + 2258 1 2315 2316 + 2259 1 2316 2317 + 2260 1 2317 2318 + 2261 1 2318 2319 + 2262 1 2319 2320 + 2263 1 2321 2322 + 2264 1 2322 2323 + 2265 1 2323 2324 + 2266 1 2324 2325 + 2267 1 2325 2326 + 2268 1 2326 2327 + 2269 1 2327 2328 + 2270 1 2328 2329 + 2271 1 2329 2330 + 2272 1 2330 2331 + 2273 1 2331 2332 + 2274 1 2332 2333 + 2275 1 2333 2334 + 2276 1 2334 2335 + 2277 1 2335 2336 + 2278 1 2336 2337 + 2279 1 2337 2338 + 2280 1 2338 2339 + 2281 1 2339 2340 + 2282 1 2340 2341 + 2283 1 2341 2342 + 2284 1 2342 2343 + 2285 1 2343 2344 + 2286 1 2344 2345 + 2287 1 2345 2346 + 2288 1 2346 2347 + 2289 1 2347 2348 + 2290 1 2348 2349 + 2291 1 2349 2350 + 2292 1 2350 2351 + 2293 1 2351 2352 + 2294 1 2352 2353 + 2295 1 2353 2354 + 2296 1 2354 2355 + 2297 1 2355 2356 + 2298 1 2356 2357 + 2299 1 2357 2358 + 2300 1 2358 2359 + 2301 1 2359 2360 + 2302 1 2361 2362 + 2303 1 2362 2363 + 2304 1 2363 2364 + 2305 1 2364 2365 + 2306 1 2365 2366 + 2307 1 2366 2367 + 2308 1 2367 2368 + 2309 1 2368 2369 + 2310 1 2369 2370 + 2311 1 2370 2371 + 2312 1 2371 2372 + 2313 1 2372 2373 + 2314 1 2373 2374 + 2315 1 2374 2375 + 2316 1 2375 2376 + 2317 1 2376 2377 + 2318 1 2377 2378 + 2319 1 2378 2379 + 2320 1 2379 2380 + 2321 1 2380 2381 + 2322 1 2381 2382 + 2323 1 2382 2383 + 2324 1 2383 2384 + 2325 1 2384 2385 + 2326 1 2385 2386 + 2327 1 2386 2387 + 2328 1 2387 2388 + 2329 1 2388 2389 + 2330 1 2389 2390 + 2331 1 2390 2391 + 2332 1 2391 2392 + 2333 1 2392 2393 + 2334 1 2393 2394 + 2335 1 2394 2395 + 2336 1 2395 2396 + 2337 1 2396 2397 + 2338 1 2397 2398 + 2339 1 2398 2399 + 2340 1 2399 2400 + 2341 1 2401 2402 + 2342 1 2402 2403 + 2343 1 2403 2404 + 2344 1 2404 2405 + 2345 1 2405 2406 + 2346 1 2406 2407 + 2347 1 2407 2408 + 2348 1 2408 2409 + 2349 1 2409 2410 + 2350 1 2410 2411 + 2351 1 2411 2412 + 2352 1 2412 2413 + 2353 1 2413 2414 + 2354 1 2414 2415 + 2355 1 2415 2416 + 2356 1 2416 2417 + 2357 1 2417 2418 + 2358 1 2418 2419 + 2359 1 2419 2420 + 2360 1 2420 2421 + 2361 1 2421 2422 + 2362 1 2422 2423 + 2363 1 2423 2424 + 2364 1 2424 2425 + 2365 1 2425 2426 + 2366 1 2426 2427 + 2367 1 2427 2428 + 2368 1 2428 2429 + 2369 1 2429 2430 + 2370 1 2430 2431 + 2371 1 2431 2432 + 2372 1 2432 2433 + 2373 1 2433 2434 + 2374 1 2434 2435 + 2375 1 2435 2436 + 2376 1 2436 2437 + 2377 1 2437 2438 + 2378 1 2438 2439 + 2379 1 2439 2440 + 2380 1 2441 2442 + 2381 1 2442 2443 + 2382 1 2443 2444 + 2383 1 2444 2445 + 2384 1 2445 2446 + 2385 1 2446 2447 + 2386 1 2447 2448 + 2387 1 2448 2449 + 2388 1 2449 2450 + 2389 1 2450 2451 + 2390 1 2451 2452 + 2391 1 2452 2453 + 2392 1 2453 2454 + 2393 1 2454 2455 + 2394 1 2455 2456 + 2395 1 2456 2457 + 2396 1 2457 2458 + 2397 1 2458 2459 + 2398 1 2459 2460 + 2399 1 2460 2461 + 2400 1 2461 2462 + 2401 1 2462 2463 + 2402 1 2463 2464 + 2403 1 2464 2465 + 2404 1 2465 2466 + 2405 1 2466 2467 + 2406 1 2467 2468 + 2407 1 2468 2469 + 2408 1 2469 2470 + 2409 1 2470 2471 + 2410 1 2471 2472 + 2411 1 2472 2473 + 2412 1 2473 2474 + 2413 1 2474 2475 + 2414 1 2475 2476 + 2415 1 2476 2477 + 2416 1 2477 2478 + 2417 1 2478 2479 + 2418 1 2479 2480 + 2419 1 2481 2482 + 2420 1 2482 2483 + 2421 1 2483 2484 + 2422 1 2484 2485 + 2423 1 2485 2486 + 2424 1 2486 2487 + 2425 1 2487 2488 + 2426 1 2488 2489 + 2427 1 2489 2490 + 2428 1 2490 2491 + 2429 1 2491 2492 + 2430 1 2492 2493 + 2431 1 2493 2494 + 2432 1 2494 2495 + 2433 1 2495 2496 + 2434 1 2496 2497 + 2435 1 2497 2498 + 2436 1 2498 2499 + 2437 1 2499 2500 + 2438 1 2500 2501 + 2439 1 2501 2502 + 2440 1 2502 2503 + 2441 1 2503 2504 + 2442 1 2504 2505 + 2443 1 2505 2506 + 2444 1 2506 2507 + 2445 1 2507 2508 + 2446 1 2508 2509 + 2447 1 2509 2510 + 2448 1 2510 2511 + 2449 1 2511 2512 + 2450 1 2512 2513 + 2451 1 2513 2514 + 2452 1 2514 2515 + 2453 1 2515 2516 + 2454 1 2516 2517 + 2455 1 2517 2518 + 2456 1 2518 2519 + 2457 1 2519 2520 + 2458 1 2521 2522 + 2459 1 2522 2523 + 2460 1 2523 2524 + 2461 1 2524 2525 + 2462 1 2525 2526 + 2463 1 2526 2527 + 2464 1 2527 2528 + 2465 1 2528 2529 + 2466 1 2529 2530 + 2467 1 2530 2531 + 2468 1 2531 2532 + 2469 1 2532 2533 + 2470 1 2533 2534 + 2471 1 2534 2535 + 2472 1 2535 2536 + 2473 1 2536 2537 + 2474 1 2537 2538 + 2475 1 2538 2539 + 2476 1 2539 2540 + 2477 1 2540 2541 + 2478 1 2541 2542 + 2479 1 2542 2543 + 2480 1 2543 2544 + 2481 1 2544 2545 + 2482 1 2545 2546 + 2483 1 2546 2547 + 2484 1 2547 2548 + 2485 1 2548 2549 + 2486 1 2549 2550 + 2487 1 2550 2551 + 2488 1 2551 2552 + 2489 1 2552 2553 + 2490 1 2553 2554 + 2491 1 2554 2555 + 2492 1 2555 2556 + 2493 1 2556 2557 + 2494 1 2557 2558 + 2495 1 2558 2559 + 2496 1 2559 2560 + 2497 1 2561 2562 + 2498 1 2562 2563 + 2499 1 2563 2564 + 2500 1 2564 2565 + 2501 1 2565 2566 + 2502 1 2566 2567 + 2503 1 2567 2568 + 2504 1 2568 2569 + 2505 1 2569 2570 + 2506 1 2570 2571 + 2507 1 2571 2572 + 2508 1 2572 2573 + 2509 1 2573 2574 + 2510 1 2574 2575 + 2511 1 2575 2576 + 2512 1 2576 2577 + 2513 1 2577 2578 + 2514 1 2578 2579 + 2515 1 2579 2580 + 2516 1 2580 2581 + 2517 1 2581 2582 + 2518 1 2582 2583 + 2519 1 2583 2584 + 2520 1 2584 2585 + 2521 1 2585 2586 + 2522 1 2586 2587 + 2523 1 2587 2588 + 2524 1 2588 2589 + 2525 1 2589 2590 + 2526 1 2590 2591 + 2527 1 2591 2592 + 2528 1 2592 2593 + 2529 1 2593 2594 + 2530 1 2594 2595 + 2531 1 2595 2596 + 2532 1 2596 2597 + 2533 1 2597 2598 + 2534 1 2598 2599 + 2535 1 2599 2600 + 2536 1 2601 2602 + 2537 1 2602 2603 + 2538 1 2603 2604 + 2539 1 2604 2605 + 2540 1 2605 2606 + 2541 1 2606 2607 + 2542 1 2607 2608 + 2543 1 2608 2609 + 2544 1 2609 2610 + 2545 1 2610 2611 + 2546 1 2611 2612 + 2547 1 2612 2613 + 2548 1 2613 2614 + 2549 1 2614 2615 + 2550 1 2615 2616 + 2551 1 2616 2617 + 2552 1 2617 2618 + 2553 1 2618 2619 + 2554 1 2619 2620 + 2555 1 2620 2621 + 2556 1 2621 2622 + 2557 1 2622 2623 + 2558 1 2623 2624 + 2559 1 2624 2625 + 2560 1 2625 2626 + 2561 1 2626 2627 + 2562 1 2627 2628 + 2563 1 2628 2629 + 2564 1 2629 2630 + 2565 1 2630 2631 + 2566 1 2631 2632 + 2567 1 2632 2633 + 2568 1 2633 2634 + 2569 1 2634 2635 + 2570 1 2635 2636 + 2571 1 2636 2637 + 2572 1 2637 2638 + 2573 1 2638 2639 + 2574 1 2639 2640 + 2575 1 2641 2642 + 2576 1 2642 2643 + 2577 1 2643 2644 + 2578 1 2644 2645 + 2579 1 2645 2646 + 2580 1 2646 2647 + 2581 1 2647 2648 + 2582 1 2648 2649 + 2583 1 2649 2650 + 2584 1 2650 2651 + 2585 1 2651 2652 + 2586 1 2652 2653 + 2587 1 2653 2654 + 2588 1 2654 2655 + 2589 1 2655 2656 + 2590 1 2656 2657 + 2591 1 2657 2658 + 2592 1 2658 2659 + 2593 1 2659 2660 + 2594 1 2660 2661 + 2595 1 2661 2662 + 2596 1 2662 2663 + 2597 1 2663 2664 + 2598 1 2664 2665 + 2599 1 2665 2666 + 2600 1 2666 2667 + 2601 1 2667 2668 + 2602 1 2668 2669 + 2603 1 2669 2670 + 2604 1 2670 2671 + 2605 1 2671 2672 + 2606 1 2672 2673 + 2607 1 2673 2674 + 2608 1 2674 2675 + 2609 1 2675 2676 + 2610 1 2676 2677 + 2611 1 2677 2678 + 2612 1 2678 2679 + 2613 1 2679 2680 + 2614 1 2681 2682 + 2615 1 2682 2683 + 2616 1 2683 2684 + 2617 1 2684 2685 + 2618 1 2685 2686 + 2619 1 2686 2687 + 2620 1 2687 2688 + 2621 1 2688 2689 + 2622 1 2689 2690 + 2623 1 2690 2691 + 2624 1 2691 2692 + 2625 1 2692 2693 + 2626 1 2693 2694 + 2627 1 2694 2695 + 2628 1 2695 2696 + 2629 1 2696 2697 + 2630 1 2697 2698 + 2631 1 2698 2699 + 2632 1 2699 2700 + 2633 1 2700 2701 + 2634 1 2701 2702 + 2635 1 2702 2703 + 2636 1 2703 2704 + 2637 1 2704 2705 + 2638 1 2705 2706 + 2639 1 2706 2707 + 2640 1 2707 2708 + 2641 1 2708 2709 + 2642 1 2709 2710 + 2643 1 2710 2711 + 2644 1 2711 2712 + 2645 1 2712 2713 + 2646 1 2713 2714 + 2647 1 2714 2715 + 2648 1 2715 2716 + 2649 1 2716 2717 + 2650 1 2717 2718 + 2651 1 2718 2719 + 2652 1 2719 2720 + 2653 1 2721 2722 + 2654 1 2722 2723 + 2655 1 2723 2724 + 2656 1 2724 2725 + 2657 1 2725 2726 + 2658 1 2726 2727 + 2659 1 2727 2728 + 2660 1 2728 2729 + 2661 1 2729 2730 + 2662 1 2730 2731 + 2663 1 2731 2732 + 2664 1 2732 2733 + 2665 1 2733 2734 + 2666 1 2734 2735 + 2667 1 2735 2736 + 2668 1 2736 2737 + 2669 1 2737 2738 + 2670 1 2738 2739 + 2671 1 2739 2740 + 2672 1 2740 2741 + 2673 1 2741 2742 + 2674 1 2742 2743 + 2675 1 2743 2744 + 2676 1 2744 2745 + 2677 1 2745 2746 + 2678 1 2746 2747 + 2679 1 2747 2748 + 2680 1 2748 2749 + 2681 1 2749 2750 + 2682 1 2750 2751 + 2683 1 2751 2752 + 2684 1 2752 2753 + 2685 1 2753 2754 + 2686 1 2754 2755 + 2687 1 2755 2756 + 2688 1 2756 2757 + 2689 1 2757 2758 + 2690 1 2758 2759 + 2691 1 2759 2760 + 2692 1 2761 2762 + 2693 1 2762 2763 + 2694 1 2763 2764 + 2695 1 2764 2765 + 2696 1 2765 2766 + 2697 1 2766 2767 + 2698 1 2767 2768 + 2699 1 2768 2769 + 2700 1 2769 2770 + 2701 1 2770 2771 + 2702 1 2771 2772 + 2703 1 2772 2773 + 2704 1 2773 2774 + 2705 1 2774 2775 + 2706 1 2775 2776 + 2707 1 2776 2777 + 2708 1 2777 2778 + 2709 1 2778 2779 + 2710 1 2779 2780 + 2711 1 2780 2781 + 2712 1 2781 2782 + 2713 1 2782 2783 + 2714 1 2783 2784 + 2715 1 2784 2785 + 2716 1 2785 2786 + 2717 1 2786 2787 + 2718 1 2787 2788 + 2719 1 2788 2789 + 2720 1 2789 2790 + 2721 1 2790 2791 + 2722 1 2791 2792 + 2723 1 2792 2793 + 2724 1 2793 2794 + 2725 1 2794 2795 + 2726 1 2795 2796 + 2727 1 2796 2797 + 2728 1 2797 2798 + 2729 1 2798 2799 + 2730 1 2799 2800 + 2731 1 2801 2802 + 2732 1 2802 2803 + 2733 1 2803 2804 + 2734 1 2804 2805 + 2735 1 2805 2806 + 2736 1 2806 2807 + 2737 1 2807 2808 + 2738 1 2808 2809 + 2739 1 2809 2810 + 2740 1 2810 2811 + 2741 1 2811 2812 + 2742 1 2812 2813 + 2743 1 2813 2814 + 2744 1 2814 2815 + 2745 1 2815 2816 + 2746 1 2816 2817 + 2747 1 2817 2818 + 2748 1 2818 2819 + 2749 1 2819 2820 + 2750 1 2820 2821 + 2751 1 2821 2822 + 2752 1 2822 2823 + 2753 1 2823 2824 + 2754 1 2824 2825 + 2755 1 2825 2826 + 2756 1 2826 2827 + 2757 1 2827 2828 + 2758 1 2828 2829 + 2759 1 2829 2830 + 2760 1 2830 2831 + 2761 1 2831 2832 + 2762 1 2832 2833 + 2763 1 2833 2834 + 2764 1 2834 2835 + 2765 1 2835 2836 + 2766 1 2836 2837 + 2767 1 2837 2838 + 2768 1 2838 2839 + 2769 1 2839 2840 + 2770 1 2841 2842 + 2771 1 2842 2843 + 2772 1 2843 2844 + 2773 1 2844 2845 + 2774 1 2845 2846 + 2775 1 2846 2847 + 2776 1 2847 2848 + 2777 1 2848 2849 + 2778 1 2849 2850 + 2779 1 2850 2851 + 2780 1 2851 2852 + 2781 1 2852 2853 + 2782 1 2853 2854 + 2783 1 2854 2855 + 2784 1 2855 2856 + 2785 1 2856 2857 + 2786 1 2857 2858 + 2787 1 2858 2859 + 2788 1 2859 2860 + 2789 1 2860 2861 + 2790 1 2861 2862 + 2791 1 2862 2863 + 2792 1 2863 2864 + 2793 1 2864 2865 + 2794 1 2865 2866 + 2795 1 2866 2867 + 2796 1 2867 2868 + 2797 1 2868 2869 + 2798 1 2869 2870 + 2799 1 2870 2871 + 2800 1 2871 2872 + 2801 1 2872 2873 + 2802 1 2873 2874 + 2803 1 2874 2875 + 2804 1 2875 2876 + 2805 1 2876 2877 + 2806 1 2877 2878 + 2807 1 2878 2879 + 2808 1 2879 2880 + 2809 1 2881 2882 + 2810 1 2882 2883 + 2811 1 2883 2884 + 2812 1 2884 2885 + 2813 1 2885 2886 + 2814 1 2886 2887 + 2815 1 2887 2888 + 2816 1 2888 2889 + 2817 1 2889 2890 + 2818 1 2890 2891 + 2819 1 2891 2892 + 2820 1 2892 2893 + 2821 1 2893 2894 + 2822 1 2894 2895 + 2823 1 2895 2896 + 2824 1 2896 2897 + 2825 1 2897 2898 + 2826 1 2898 2899 + 2827 1 2899 2900 + 2828 1 2900 2901 + 2829 1 2901 2902 + 2830 1 2902 2903 + 2831 1 2903 2904 + 2832 1 2904 2905 + 2833 1 2905 2906 + 2834 1 2906 2907 + 2835 1 2907 2908 + 2836 1 2908 2909 + 2837 1 2909 2910 + 2838 1 2910 2911 + 2839 1 2911 2912 + 2840 1 2912 2913 + 2841 1 2913 2914 + 2842 1 2914 2915 + 2843 1 2915 2916 + 2844 1 2916 2917 + 2845 1 2917 2918 + 2846 1 2918 2919 + 2847 1 2919 2920 + 2848 1 2921 2922 + 2849 1 2922 2923 + 2850 1 2923 2924 + 2851 1 2924 2925 + 2852 1 2925 2926 + 2853 1 2926 2927 + 2854 1 2927 2928 + 2855 1 2928 2929 + 2856 1 2929 2930 + 2857 1 2930 2931 + 2858 1 2931 2932 + 2859 1 2932 2933 + 2860 1 2933 2934 + 2861 1 2934 2935 + 2862 1 2935 2936 + 2863 1 2936 2937 + 2864 1 2937 2938 + 2865 1 2938 2939 + 2866 1 2939 2940 + 2867 1 2940 2941 + 2868 1 2941 2942 + 2869 1 2942 2943 + 2870 1 2943 2944 + 2871 1 2944 2945 + 2872 1 2945 2946 + 2873 1 2946 2947 + 2874 1 2947 2948 + 2875 1 2948 2949 + 2876 1 2949 2950 + 2877 1 2950 2951 + 2878 1 2951 2952 + 2879 1 2952 2953 + 2880 1 2953 2954 + 2881 1 2954 2955 + 2882 1 2955 2956 + 2883 1 2956 2957 + 2884 1 2957 2958 + 2885 1 2958 2959 + 2886 1 2959 2960 + 2887 1 2961 2962 + 2888 1 2962 2963 + 2889 1 2963 2964 + 2890 1 2964 2965 + 2891 1 2965 2966 + 2892 1 2966 2967 + 2893 1 2967 2968 + 2894 1 2968 2969 + 2895 1 2969 2970 + 2896 1 2970 2971 + 2897 1 2971 2972 + 2898 1 2972 2973 + 2899 1 2973 2974 + 2900 1 2974 2975 + 2901 1 2975 2976 + 2902 1 2976 2977 + 2903 1 2977 2978 + 2904 1 2978 2979 + 2905 1 2979 2980 + 2906 1 2980 2981 + 2907 1 2981 2982 + 2908 1 2982 2983 + 2909 1 2983 2984 + 2910 1 2984 2985 + 2911 1 2985 2986 + 2912 1 2986 2987 + 2913 1 2987 2988 + 2914 1 2988 2989 + 2915 1 2989 2990 + 2916 1 2990 2991 + 2917 1 2991 2992 + 2918 1 2992 2993 + 2919 1 2993 2994 + 2920 1 2994 2995 + 2921 1 2995 2996 + 2922 1 2996 2997 + 2923 1 2997 2998 + 2924 1 2998 2999 + 2925 1 2999 3000 + 2926 1 3001 3002 + 2927 1 3002 3003 + 2928 1 3003 3004 + 2929 1 3004 3005 + 2930 1 3005 3006 + 2931 1 3006 3007 + 2932 1 3007 3008 + 2933 1 3008 3009 + 2934 1 3009 3010 + 2935 1 3010 3011 + 2936 1 3011 3012 + 2937 1 3012 3013 + 2938 1 3013 3014 + 2939 1 3014 3015 + 2940 1 3015 3016 + 2941 1 3016 3017 + 2942 1 3017 3018 + 2943 1 3018 3019 + 2944 1 3019 3020 + 2945 1 3020 3021 + 2946 1 3021 3022 + 2947 1 3022 3023 + 2948 1 3023 3024 + 2949 1 3024 3025 + 2950 1 3025 3026 + 2951 1 3026 3027 + 2952 1 3027 3028 + 2953 1 3028 3029 + 2954 1 3029 3030 + 2955 1 3030 3031 + 2956 1 3031 3032 + 2957 1 3032 3033 + 2958 1 3033 3034 + 2959 1 3034 3035 + 2960 1 3035 3036 + 2961 1 3036 3037 + 2962 1 3037 3038 + 2963 1 3038 3039 + 2964 1 3039 3040 + 2965 1 3041 3042 + 2966 1 3042 3043 + 2967 1 3043 3044 + 2968 1 3044 3045 + 2969 1 3045 3046 + 2970 1 3046 3047 + 2971 1 3047 3048 + 2972 1 3048 3049 + 2973 1 3049 3050 + 2974 1 3050 3051 + 2975 1 3051 3052 + 2976 1 3052 3053 + 2977 1 3053 3054 + 2978 1 3054 3055 + 2979 1 3055 3056 + 2980 1 3056 3057 + 2981 1 3057 3058 + 2982 1 3058 3059 + 2983 1 3059 3060 + 2984 1 3060 3061 + 2985 1 3061 3062 + 2986 1 3062 3063 + 2987 1 3063 3064 + 2988 1 3064 3065 + 2989 1 3065 3066 + 2990 1 3066 3067 + 2991 1 3067 3068 + 2992 1 3068 3069 + 2993 1 3069 3070 + 2994 1 3070 3071 + 2995 1 3071 3072 + 2996 1 3072 3073 + 2997 1 3073 3074 + 2998 1 3074 3075 + 2999 1 3075 3076 + 3000 1 3076 3077 + 3001 1 3077 3078 + 3002 1 3078 3079 + 3003 1 3079 3080 + 3004 1 3081 3082 + 3005 1 3082 3083 + 3006 1 3083 3084 + 3007 1 3084 3085 + 3008 1 3085 3086 + 3009 1 3086 3087 + 3010 1 3087 3088 + 3011 1 3088 3089 + 3012 1 3089 3090 + 3013 1 3090 3091 + 3014 1 3091 3092 + 3015 1 3092 3093 + 3016 1 3093 3094 + 3017 1 3094 3095 + 3018 1 3095 3096 + 3019 1 3096 3097 + 3020 1 3097 3098 + 3021 1 3098 3099 + 3022 1 3099 3100 + 3023 1 3100 3101 + 3024 1 3101 3102 + 3025 1 3102 3103 + 3026 1 3103 3104 + 3027 1 3104 3105 + 3028 1 3105 3106 + 3029 1 3106 3107 + 3030 1 3107 3108 + 3031 1 3108 3109 + 3032 1 3109 3110 + 3033 1 3110 3111 + 3034 1 3111 3112 + 3035 1 3112 3113 + 3036 1 3113 3114 + 3037 1 3114 3115 + 3038 1 3115 3116 + 3039 1 3116 3117 + 3040 1 3117 3118 + 3041 1 3118 3119 + 3042 1 3119 3120 + 3043 1 3121 3122 + 3044 1 3122 3123 + 3045 1 3123 3124 + 3046 1 3124 3125 + 3047 1 3125 3126 + 3048 1 3126 3127 + 3049 1 3127 3128 + 3050 1 3128 3129 + 3051 1 3129 3130 + 3052 1 3130 3131 + 3053 1 3131 3132 + 3054 1 3132 3133 + 3055 1 3133 3134 + 3056 1 3134 3135 + 3057 1 3135 3136 + 3058 1 3136 3137 + 3059 1 3137 3138 + 3060 1 3138 3139 + 3061 1 3139 3140 + 3062 1 3140 3141 + 3063 1 3141 3142 + 3064 1 3142 3143 + 3065 1 3143 3144 + 3066 1 3144 3145 + 3067 1 3145 3146 + 3068 1 3146 3147 + 3069 1 3147 3148 + 3070 1 3148 3149 + 3071 1 3149 3150 + 3072 1 3150 3151 + 3073 1 3151 3152 + 3074 1 3152 3153 + 3075 1 3153 3154 + 3076 1 3154 3155 + 3077 1 3155 3156 + 3078 1 3156 3157 + 3079 1 3157 3158 + 3080 1 3158 3159 + 3081 1 3159 3160 + 3082 1 3161 3162 + 3083 1 3162 3163 + 3084 1 3163 3164 + 3085 1 3164 3165 + 3086 1 3165 3166 + 3087 1 3166 3167 + 3088 1 3167 3168 + 3089 1 3168 3169 + 3090 1 3169 3170 + 3091 1 3170 3171 + 3092 1 3171 3172 + 3093 1 3172 3173 + 3094 1 3173 3174 + 3095 1 3174 3175 + 3096 1 3175 3176 + 3097 1 3176 3177 + 3098 1 3177 3178 + 3099 1 3178 3179 + 3100 1 3179 3180 + 3101 1 3180 3181 + 3102 1 3181 3182 + 3103 1 3182 3183 + 3104 1 3183 3184 + 3105 1 3184 3185 + 3106 1 3185 3186 + 3107 1 3186 3187 + 3108 1 3187 3188 + 3109 1 3188 3189 + 3110 1 3189 3190 + 3111 1 3190 3191 + 3112 1 3191 3192 + 3113 1 3192 3193 + 3114 1 3193 3194 + 3115 1 3194 3195 + 3116 1 3195 3196 + 3117 1 3196 3197 + 3118 1 3197 3198 + 3119 1 3198 3199 + 3120 1 3199 3200 + 3121 1 3201 3202 + 3122 1 3202 3203 + 3123 1 3203 3204 + 3124 1 3204 3205 + 3125 1 3205 3206 + 3126 1 3206 3207 + 3127 1 3207 3208 + 3128 1 3208 3209 + 3129 1 3209 3210 + 3130 1 3210 3211 + 3131 1 3211 3212 + 3132 1 3212 3213 + 3133 1 3213 3214 + 3134 1 3214 3215 + 3135 1 3215 3216 + 3136 1 3216 3217 + 3137 1 3217 3218 + 3138 1 3218 3219 + 3139 1 3219 3220 + 3140 1 3220 3221 + 3141 1 3221 3222 + 3142 1 3222 3223 + 3143 1 3223 3224 + 3144 1 3224 3225 + 3145 1 3225 3226 + 3146 1 3226 3227 + 3147 1 3227 3228 + 3148 1 3228 3229 + 3149 1 3229 3230 + 3150 1 3230 3231 + 3151 1 3231 3232 + 3152 1 3232 3233 + 3153 1 3233 3234 + 3154 1 3234 3235 + 3155 1 3235 3236 + 3156 1 3236 3237 + 3157 1 3237 3238 + 3158 1 3238 3239 + 3159 1 3239 3240 + 3160 1 3241 3242 + 3161 1 3242 3243 + 3162 1 3243 3244 + 3163 1 3244 3245 + 3164 1 3245 3246 + 3165 1 3246 3247 + 3166 1 3247 3248 + 3167 1 3248 3249 + 3168 1 3249 3250 + 3169 1 3250 3251 + 3170 1 3251 3252 + 3171 1 3252 3253 + 3172 1 3253 3254 + 3173 1 3254 3255 + 3174 1 3255 3256 + 3175 1 3256 3257 + 3176 1 3257 3258 + 3177 1 3258 3259 + 3178 1 3259 3260 + 3179 1 3260 3261 + 3180 1 3261 3262 + 3181 1 3262 3263 + 3182 1 3263 3264 + 3183 1 3264 3265 + 3184 1 3265 3266 + 3185 1 3266 3267 + 3186 1 3267 3268 + 3187 1 3268 3269 + 3188 1 3269 3270 + 3189 1 3270 3271 + 3190 1 3271 3272 + 3191 1 3272 3273 + 3192 1 3273 3274 + 3193 1 3274 3275 + 3194 1 3275 3276 + 3195 1 3276 3277 + 3196 1 3277 3278 + 3197 1 3278 3279 + 3198 1 3279 3280 + 3199 1 3281 3282 + 3200 1 3282 3283 + 3201 1 3283 3284 + 3202 1 3284 3285 + 3203 1 3285 3286 + 3204 1 3286 3287 + 3205 1 3287 3288 + 3206 1 3288 3289 + 3207 1 3289 3290 + 3208 1 3290 3291 + 3209 1 3291 3292 + 3210 1 3292 3293 + 3211 1 3293 3294 + 3212 1 3294 3295 + 3213 1 3295 3296 + 3214 1 3296 3297 + 3215 1 3297 3298 + 3216 1 3298 3299 + 3217 1 3299 3300 + 3218 1 3300 3301 + 3219 1 3301 3302 + 3220 1 3302 3303 + 3221 1 3303 3304 + 3222 1 3304 3305 + 3223 1 3305 3306 + 3224 1 3306 3307 + 3225 1 3307 3308 + 3226 1 3308 3309 + 3227 1 3309 3310 + 3228 1 3310 3311 + 3229 1 3311 3312 + 3230 1 3312 3313 + 3231 1 3313 3314 + 3232 1 3314 3315 + 3233 1 3315 3316 + 3234 1 3316 3317 + 3235 1 3317 3318 + 3236 1 3318 3319 + 3237 1 3319 3320 + 3238 1 3321 3322 + 3239 1 3322 3323 + 3240 1 3323 3324 + 3241 1 3324 3325 + 3242 1 3325 3326 + 3243 1 3326 3327 + 3244 1 3327 3328 + 3245 1 3328 3329 + 3246 1 3329 3330 + 3247 1 3330 3331 + 3248 1 3331 3332 + 3249 1 3332 3333 + 3250 1 3333 3334 + 3251 1 3334 3335 + 3252 1 3335 3336 + 3253 1 3336 3337 + 3254 1 3337 3338 + 3255 1 3338 3339 + 3256 1 3339 3340 + 3257 1 3340 3341 + 3258 1 3341 3342 + 3259 1 3342 3343 + 3260 1 3343 3344 + 3261 1 3344 3345 + 3262 1 3345 3346 + 3263 1 3346 3347 + 3264 1 3347 3348 + 3265 1 3348 3349 + 3266 1 3349 3350 + 3267 1 3350 3351 + 3268 1 3351 3352 + 3269 1 3352 3353 + 3270 1 3353 3354 + 3271 1 3354 3355 + 3272 1 3355 3356 + 3273 1 3356 3357 + 3274 1 3357 3358 + 3275 1 3358 3359 + 3276 1 3359 3360 + 3277 1 3361 3362 + 3278 1 3362 3363 + 3279 1 3363 3364 + 3280 1 3364 3365 + 3281 1 3365 3366 + 3282 1 3366 3367 + 3283 1 3367 3368 + 3284 1 3368 3369 + 3285 1 3369 3370 + 3286 1 3370 3371 + 3287 1 3371 3372 + 3288 1 3372 3373 + 3289 1 3373 3374 + 3290 1 3374 3375 + 3291 1 3375 3376 + 3292 1 3376 3377 + 3293 1 3377 3378 + 3294 1 3378 3379 + 3295 1 3379 3380 + 3296 1 3380 3381 + 3297 1 3381 3382 + 3298 1 3382 3383 + 3299 1 3383 3384 + 3300 1 3384 3385 + 3301 1 3385 3386 + 3302 1 3386 3387 + 3303 1 3387 3388 + 3304 1 3388 3389 + 3305 1 3389 3390 + 3306 1 3390 3391 + 3307 1 3391 3392 + 3308 1 3392 3393 + 3309 1 3393 3394 + 3310 1 3394 3395 + 3311 1 3395 3396 + 3312 1 3396 3397 + 3313 1 3397 3398 + 3314 1 3398 3399 + 3315 1 3399 3400 + 3316 1 3401 3402 + 3317 1 3402 3403 + 3318 1 3403 3404 + 3319 1 3404 3405 + 3320 1 3405 3406 + 3321 1 3406 3407 + 3322 1 3407 3408 + 3323 1 3408 3409 + 3324 1 3409 3410 + 3325 1 3410 3411 + 3326 1 3411 3412 + 3327 1 3412 3413 + 3328 1 3413 3414 + 3329 1 3414 3415 + 3330 1 3415 3416 + 3331 1 3416 3417 + 3332 1 3417 3418 + 3333 1 3418 3419 + 3334 1 3419 3420 + 3335 1 3420 3421 + 3336 1 3421 3422 + 3337 1 3422 3423 + 3338 1 3423 3424 + 3339 1 3424 3425 + 3340 1 3425 3426 + 3341 1 3426 3427 + 3342 1 3427 3428 + 3343 1 3428 3429 + 3344 1 3429 3430 + 3345 1 3430 3431 + 3346 1 3431 3432 + 3347 1 3432 3433 + 3348 1 3433 3434 + 3349 1 3434 3435 + 3350 1 3435 3436 + 3351 1 3436 3437 + 3352 1 3437 3438 + 3353 1 3438 3439 + 3354 1 3439 3440 + 3355 1 3441 3442 + 3356 1 3442 3443 + 3357 1 3443 3444 + 3358 1 3444 3445 + 3359 1 3445 3446 + 3360 1 3446 3447 + 3361 1 3447 3448 + 3362 1 3448 3449 + 3363 1 3449 3450 + 3364 1 3450 3451 + 3365 1 3451 3452 + 3366 1 3452 3453 + 3367 1 3453 3454 + 3368 1 3454 3455 + 3369 1 3455 3456 + 3370 1 3456 3457 + 3371 1 3457 3458 + 3372 1 3458 3459 + 3373 1 3459 3460 + 3374 1 3460 3461 + 3375 1 3461 3462 + 3376 1 3462 3463 + 3377 1 3463 3464 + 3378 1 3464 3465 + 3379 1 3465 3466 + 3380 1 3466 3467 + 3381 1 3467 3468 + 3382 1 3468 3469 + 3383 1 3469 3470 + 3384 1 3470 3471 + 3385 1 3471 3472 + 3386 1 3472 3473 + 3387 1 3473 3474 + 3388 1 3474 3475 + 3389 1 3475 3476 + 3390 1 3476 3477 + 3391 1 3477 3478 + 3392 1 3478 3479 + 3393 1 3479 3480 + 3394 1 3481 3482 + 3395 1 3482 3483 + 3396 1 3483 3484 + 3397 1 3484 3485 + 3398 1 3485 3486 + 3399 1 3486 3487 + 3400 1 3487 3488 + 3401 1 3488 3489 + 3402 1 3489 3490 + 3403 1 3490 3491 + 3404 1 3491 3492 + 3405 1 3492 3493 + 3406 1 3493 3494 + 3407 1 3494 3495 + 3408 1 3495 3496 + 3409 1 3496 3497 + 3410 1 3497 3498 + 3411 1 3498 3499 + 3412 1 3499 3500 + 3413 1 3500 3501 + 3414 1 3501 3502 + 3415 1 3502 3503 + 3416 1 3503 3504 + 3417 1 3504 3505 + 3418 1 3505 3506 + 3419 1 3506 3507 + 3420 1 3507 3508 + 3421 1 3508 3509 + 3422 1 3509 3510 + 3423 1 3510 3511 + 3424 1 3511 3512 + 3425 1 3512 3513 + 3426 1 3513 3514 + 3427 1 3514 3515 + 3428 1 3515 3516 + 3429 1 3516 3517 + 3430 1 3517 3518 + 3431 1 3518 3519 + 3432 1 3519 3520 + 3433 1 3521 3522 + 3434 1 3522 3523 + 3435 1 3523 3524 + 3436 1 3524 3525 + 3437 1 3525 3526 + 3438 1 3526 3527 + 3439 1 3527 3528 + 3440 1 3528 3529 + 3441 1 3529 3530 + 3442 1 3530 3531 + 3443 1 3531 3532 + 3444 1 3532 3533 + 3445 1 3533 3534 + 3446 1 3534 3535 + 3447 1 3535 3536 + 3448 1 3536 3537 + 3449 1 3537 3538 + 3450 1 3538 3539 + 3451 1 3539 3540 + 3452 1 3540 3541 + 3453 1 3541 3542 + 3454 1 3542 3543 + 3455 1 3543 3544 + 3456 1 3544 3545 + 3457 1 3545 3546 + 3458 1 3546 3547 + 3459 1 3547 3548 + 3460 1 3548 3549 + 3461 1 3549 3550 + 3462 1 3550 3551 + 3463 1 3551 3552 + 3464 1 3552 3553 + 3465 1 3553 3554 + 3466 1 3554 3555 + 3467 1 3555 3556 + 3468 1 3556 3557 + 3469 1 3557 3558 + 3470 1 3558 3559 + 3471 1 3559 3560 + 3472 1 3561 3562 + 3473 1 3562 3563 + 3474 1 3563 3564 + 3475 1 3564 3565 + 3476 1 3565 3566 + 3477 1 3566 3567 + 3478 1 3567 3568 + 3479 1 3568 3569 + 3480 1 3569 3570 + 3481 1 3570 3571 + 3482 1 3571 3572 + 3483 1 3572 3573 + 3484 1 3573 3574 + 3485 1 3574 3575 + 3486 1 3575 3576 + 3487 1 3576 3577 + 3488 1 3577 3578 + 3489 1 3578 3579 + 3490 1 3579 3580 + 3491 1 3580 3581 + 3492 1 3581 3582 + 3493 1 3582 3583 + 3494 1 3583 3584 + 3495 1 3584 3585 + 3496 1 3585 3586 + 3497 1 3586 3587 + 3498 1 3587 3588 + 3499 1 3588 3589 + 3500 1 3589 3590 + 3501 1 3590 3591 + 3502 1 3591 3592 + 3503 1 3592 3593 + 3504 1 3593 3594 + 3505 1 3594 3595 + 3506 1 3595 3596 + 3507 1 3596 3597 + 3508 1 3597 3598 + 3509 1 3598 3599 + 3510 1 3599 3600 + 3511 1 3601 3602 + 3512 1 3602 3603 + 3513 1 3603 3604 + 3514 1 3604 3605 + 3515 1 3605 3606 + 3516 1 3606 3607 + 3517 1 3607 3608 + 3518 1 3608 3609 + 3519 1 3609 3610 + 3520 1 3610 3611 + 3521 1 3611 3612 + 3522 1 3612 3613 + 3523 1 3613 3614 + 3524 1 3614 3615 + 3525 1 3615 3616 + 3526 1 3616 3617 + 3527 1 3617 3618 + 3528 1 3618 3619 + 3529 1 3619 3620 + 3530 1 3620 3621 + 3531 1 3621 3622 + 3532 1 3622 3623 + 3533 1 3623 3624 + 3534 1 3624 3625 + 3535 1 3625 3626 + 3536 1 3626 3627 + 3537 1 3627 3628 + 3538 1 3628 3629 + 3539 1 3629 3630 + 3540 1 3630 3631 + 3541 1 3631 3632 + 3542 1 3632 3633 + 3543 1 3633 3634 + 3544 1 3634 3635 + 3545 1 3635 3636 + 3546 1 3636 3637 + 3547 1 3637 3638 + 3548 1 3638 3639 + 3549 1 3639 3640 + 3550 1 3641 3642 + 3551 1 3642 3643 + 3552 1 3643 3644 + 3553 1 3644 3645 + 3554 1 3645 3646 + 3555 1 3646 3647 + 3556 1 3647 3648 + 3557 1 3648 3649 + 3558 1 3649 3650 + 3559 1 3650 3651 + 3560 1 3651 3652 + 3561 1 3652 3653 + 3562 1 3653 3654 + 3563 1 3654 3655 + 3564 1 3655 3656 + 3565 1 3656 3657 + 3566 1 3657 3658 + 3567 1 3658 3659 + 3568 1 3659 3660 + 3569 1 3660 3661 + 3570 1 3661 3662 + 3571 1 3662 3663 + 3572 1 3663 3664 + 3573 1 3664 3665 + 3574 1 3665 3666 + 3575 1 3666 3667 + 3576 1 3667 3668 + 3577 1 3668 3669 + 3578 1 3669 3670 + 3579 1 3670 3671 + 3580 1 3671 3672 + 3581 1 3672 3673 + 3582 1 3673 3674 + 3583 1 3674 3675 + 3584 1 3675 3676 + 3585 1 3676 3677 + 3586 1 3677 3678 + 3587 1 3678 3679 + 3588 1 3679 3680 + 3589 1 3681 3682 + 3590 1 3682 3683 + 3591 1 3683 3684 + 3592 1 3684 3685 + 3593 1 3685 3686 + 3594 1 3686 3687 + 3595 1 3687 3688 + 3596 1 3688 3689 + 3597 1 3689 3690 + 3598 1 3690 3691 + 3599 1 3691 3692 + 3600 1 3692 3693 + 3601 1 3693 3694 + 3602 1 3694 3695 + 3603 1 3695 3696 + 3604 1 3696 3697 + 3605 1 3697 3698 + 3606 1 3698 3699 + 3607 1 3699 3700 + 3608 1 3700 3701 + 3609 1 3701 3702 + 3610 1 3702 3703 + 3611 1 3703 3704 + 3612 1 3704 3705 + 3613 1 3705 3706 + 3614 1 3706 3707 + 3615 1 3707 3708 + 3616 1 3708 3709 + 3617 1 3709 3710 + 3618 1 3710 3711 + 3619 1 3711 3712 + 3620 1 3712 3713 + 3621 1 3713 3714 + 3622 1 3714 3715 + 3623 1 3715 3716 + 3624 1 3716 3717 + 3625 1 3717 3718 + 3626 1 3718 3719 + 3627 1 3719 3720 + 3628 1 3721 3722 + 3629 1 3722 3723 + 3630 1 3723 3724 + 3631 1 3724 3725 + 3632 1 3725 3726 + 3633 1 3726 3727 + 3634 1 3727 3728 + 3635 1 3728 3729 + 3636 1 3729 3730 + 3637 1 3730 3731 + 3638 1 3731 3732 + 3639 1 3732 3733 + 3640 1 3733 3734 + 3641 1 3734 3735 + 3642 1 3735 3736 + 3643 1 3736 3737 + 3644 1 3737 3738 + 3645 1 3738 3739 + 3646 1 3739 3740 + 3647 1 3740 3741 + 3648 1 3741 3742 + 3649 1 3742 3743 + 3650 1 3743 3744 + 3651 1 3744 3745 + 3652 1 3745 3746 + 3653 1 3746 3747 + 3654 1 3747 3748 + 3655 1 3748 3749 + 3656 1 3749 3750 + 3657 1 3750 3751 + 3658 1 3751 3752 + 3659 1 3752 3753 + 3660 1 3753 3754 + 3661 1 3754 3755 + 3662 1 3755 3756 + 3663 1 3756 3757 + 3664 1 3757 3758 + 3665 1 3758 3759 + 3666 1 3759 3760 + 3667 1 3761 3762 + 3668 1 3762 3763 + 3669 1 3763 3764 + 3670 1 3764 3765 + 3671 1 3765 3766 + 3672 1 3766 3767 + 3673 1 3767 3768 + 3674 1 3768 3769 + 3675 1 3769 3770 + 3676 1 3770 3771 + 3677 1 3771 3772 + 3678 1 3772 3773 + 3679 1 3773 3774 + 3680 1 3774 3775 + 3681 1 3775 3776 + 3682 1 3776 3777 + 3683 1 3777 3778 + 3684 1 3778 3779 + 3685 1 3779 3780 + 3686 1 3780 3781 + 3687 1 3781 3782 + 3688 1 3782 3783 + 3689 1 3783 3784 + 3690 1 3784 3785 + 3691 1 3785 3786 + 3692 1 3786 3787 + 3693 1 3787 3788 + 3694 1 3788 3789 + 3695 1 3789 3790 + 3696 1 3790 3791 + 3697 1 3791 3792 + 3698 1 3792 3793 + 3699 1 3793 3794 + 3700 1 3794 3795 + 3701 1 3795 3796 + 3702 1 3796 3797 + 3703 1 3797 3798 + 3704 1 3798 3799 + 3705 1 3799 3800 + 3706 1 3801 3802 + 3707 1 3802 3803 + 3708 1 3803 3804 + 3709 1 3804 3805 + 3710 1 3805 3806 + 3711 1 3806 3807 + 3712 1 3807 3808 + 3713 1 3808 3809 + 3714 1 3809 3810 + 3715 1 3810 3811 + 3716 1 3811 3812 + 3717 1 3812 3813 + 3718 1 3813 3814 + 3719 1 3814 3815 + 3720 1 3815 3816 + 3721 1 3816 3817 + 3722 1 3817 3818 + 3723 1 3818 3819 + 3724 1 3819 3820 + 3725 1 3820 3821 + 3726 1 3821 3822 + 3727 1 3822 3823 + 3728 1 3823 3824 + 3729 1 3824 3825 + 3730 1 3825 3826 + 3731 1 3826 3827 + 3732 1 3827 3828 + 3733 1 3828 3829 + 3734 1 3829 3830 + 3735 1 3830 3831 + 3736 1 3831 3832 + 3737 1 3832 3833 + 3738 1 3833 3834 + 3739 1 3834 3835 + 3740 1 3835 3836 + 3741 1 3836 3837 + 3742 1 3837 3838 + 3743 1 3838 3839 + 3744 1 3839 3840 + 3745 1 3841 3842 + 3746 1 3842 3843 + 3747 1 3843 3844 + 3748 1 3844 3845 + 3749 1 3845 3846 + 3750 1 3846 3847 + 3751 1 3847 3848 + 3752 1 3848 3849 + 3753 1 3849 3850 + 3754 1 3850 3851 + 3755 1 3851 3852 + 3756 1 3852 3853 + 3757 1 3853 3854 + 3758 1 3854 3855 + 3759 1 3855 3856 + 3760 1 3856 3857 + 3761 1 3857 3858 + 3762 1 3858 3859 + 3763 1 3859 3860 + 3764 1 3860 3861 + 3765 1 3861 3862 + 3766 1 3862 3863 + 3767 1 3863 3864 + 3768 1 3864 3865 + 3769 1 3865 3866 + 3770 1 3866 3867 + 3771 1 3867 3868 + 3772 1 3868 3869 + 3773 1 3869 3870 + 3774 1 3870 3871 + 3775 1 3871 3872 + 3776 1 3872 3873 + 3777 1 3873 3874 + 3778 1 3874 3875 + 3779 1 3875 3876 + 3780 1 3876 3877 + 3781 1 3877 3878 + 3782 1 3878 3879 + 3783 1 3879 3880 + 3784 1 3881 3882 + 3785 1 3882 3883 + 3786 1 3883 3884 + 3787 1 3884 3885 + 3788 1 3885 3886 + 3789 1 3886 3887 + 3790 1 3887 3888 + 3791 1 3888 3889 + 3792 1 3889 3890 + 3793 1 3890 3891 + 3794 1 3891 3892 + 3795 1 3892 3893 + 3796 1 3893 3894 + 3797 1 3894 3895 + 3798 1 3895 3896 + 3799 1 3896 3897 + 3800 1 3897 3898 + 3801 1 3898 3899 + 3802 1 3899 3900 + 3803 1 3900 3901 + 3804 1 3901 3902 + 3805 1 3902 3903 + 3806 1 3903 3904 + 3807 1 3904 3905 + 3808 1 3905 3906 + 3809 1 3906 3907 + 3810 1 3907 3908 + 3811 1 3908 3909 + 3812 1 3909 3910 + 3813 1 3910 3911 + 3814 1 3911 3912 + 3815 1 3912 3913 + 3816 1 3913 3914 + 3817 1 3914 3915 + 3818 1 3915 3916 + 3819 1 3916 3917 + 3820 1 3917 3918 + 3821 1 3918 3919 + 3822 1 3919 3920 + 3823 1 3921 3922 + 3824 1 3922 3923 + 3825 1 3923 3924 + 3826 1 3924 3925 + 3827 1 3925 3926 + 3828 1 3926 3927 + 3829 1 3927 3928 + 3830 1 3928 3929 + 3831 1 3929 3930 + 3832 1 3930 3931 + 3833 1 3931 3932 + 3834 1 3932 3933 + 3835 1 3933 3934 + 3836 1 3934 3935 + 3837 1 3935 3936 + 3838 1 3936 3937 + 3839 1 3937 3938 + 3840 1 3938 3939 + 3841 1 3939 3940 + 3842 1 3940 3941 + 3843 1 3941 3942 + 3844 1 3942 3943 + 3845 1 3943 3944 + 3846 1 3944 3945 + 3847 1 3945 3946 + 3848 1 3946 3947 + 3849 1 3947 3948 + 3850 1 3948 3949 + 3851 1 3949 3950 + 3852 1 3950 3951 + 3853 1 3951 3952 + 3854 1 3952 3953 + 3855 1 3953 3954 + 3856 1 3954 3955 + 3857 1 3955 3956 + 3858 1 3956 3957 + 3859 1 3957 3958 + 3860 1 3958 3959 + 3861 1 3959 3960 + 3862 1 3961 3962 + 3863 1 3962 3963 + 3864 1 3963 3964 + 3865 1 3964 3965 + 3866 1 3965 3966 + 3867 1 3966 3967 + 3868 1 3967 3968 + 3869 1 3968 3969 + 3870 1 3969 3970 + 3871 1 3970 3971 + 3872 1 3971 3972 + 3873 1 3972 3973 + 3874 1 3973 3974 + 3875 1 3974 3975 + 3876 1 3975 3976 + 3877 1 3976 3977 + 3878 1 3977 3978 + 3879 1 3978 3979 + 3880 1 3979 3980 + 3881 1 3980 3981 + 3882 1 3981 3982 + 3883 1 3982 3983 + 3884 1 3983 3984 + 3885 1 3984 3985 + 3886 1 3985 3986 + 3887 1 3986 3987 + 3888 1 3987 3988 + 3889 1 3988 3989 + 3890 1 3989 3990 + 3891 1 3990 3991 + 3892 1 3991 3992 + 3893 1 3992 3993 + 3894 1 3993 3994 + 3895 1 3994 3995 + 3896 1 3995 3996 + 3897 1 3996 3997 + 3898 1 3997 3998 + 3899 1 3998 3999 + 3900 1 3999 4000 + +Angles + + 1 1 1 2 3 + 2 1 2 3 4 + 3 1 3 4 5 + 4 1 4 5 6 + 5 1 5 6 7 + 6 1 6 7 8 + 7 1 7 8 9 + 8 1 8 9 10 + 9 1 9 10 11 + 10 1 10 11 12 + 11 1 11 12 13 + 12 1 12 13 14 + 13 1 13 14 15 + 14 1 14 15 16 + 15 1 15 16 17 + 16 1 16 17 18 + 17 1 17 18 19 + 18 1 18 19 20 + 19 1 19 20 21 + 20 1 20 21 22 + 21 1 21 22 23 + 22 1 22 23 24 + 23 1 23 24 25 + 24 1 24 25 26 + 25 1 25 26 27 + 26 1 26 27 28 + 27 1 27 28 29 + 28 1 28 29 30 + 29 1 29 30 31 + 30 1 30 31 32 + 31 1 31 32 33 + 32 1 32 33 34 + 33 1 33 34 35 + 34 1 34 35 36 + 35 1 35 36 37 + 36 1 36 37 38 + 37 1 37 38 39 + 38 1 38 39 40 + 39 1 41 42 43 + 40 1 42 43 44 + 41 1 43 44 45 + 42 1 44 45 46 + 43 1 45 46 47 + 44 1 46 47 48 + 45 1 47 48 49 + 46 1 48 49 50 + 47 1 49 50 51 + 48 1 50 51 52 + 49 1 51 52 53 + 50 1 52 53 54 + 51 1 53 54 55 + 52 1 54 55 56 + 53 1 55 56 57 + 54 1 56 57 58 + 55 1 57 58 59 + 56 1 58 59 60 + 57 1 59 60 61 + 58 1 60 61 62 + 59 1 61 62 63 + 60 1 62 63 64 + 61 1 63 64 65 + 62 1 64 65 66 + 63 1 65 66 67 + 64 1 66 67 68 + 65 1 67 68 69 + 66 1 68 69 70 + 67 1 69 70 71 + 68 1 70 71 72 + 69 1 71 72 73 + 70 1 72 73 74 + 71 1 73 74 75 + 72 1 74 75 76 + 73 1 75 76 77 + 74 1 76 77 78 + 75 1 77 78 79 + 76 1 78 79 80 + 77 1 81 82 83 + 78 1 82 83 84 + 79 1 83 84 85 + 80 1 84 85 86 + 81 1 85 86 87 + 82 1 86 87 88 + 83 1 87 88 89 + 84 1 88 89 90 + 85 1 89 90 91 + 86 1 90 91 92 + 87 1 91 92 93 + 88 1 92 93 94 + 89 1 93 94 95 + 90 1 94 95 96 + 91 1 95 96 97 + 92 1 96 97 98 + 93 1 97 98 99 + 94 1 98 99 100 + 95 1 99 100 101 + 96 1 100 101 102 + 97 1 101 102 103 + 98 1 102 103 104 + 99 1 103 104 105 + 100 1 104 105 106 + 101 1 105 106 107 + 102 1 106 107 108 + 103 1 107 108 109 + 104 1 108 109 110 + 105 1 109 110 111 + 106 1 110 111 112 + 107 1 111 112 113 + 108 1 112 113 114 + 109 1 113 114 115 + 110 1 114 115 116 + 111 1 115 116 117 + 112 1 116 117 118 + 113 1 117 118 119 + 114 1 118 119 120 + 115 1 121 122 123 + 116 1 122 123 124 + 117 1 123 124 125 + 118 1 124 125 126 + 119 1 125 126 127 + 120 1 126 127 128 + 121 1 127 128 129 + 122 1 128 129 130 + 123 1 129 130 131 + 124 1 130 131 132 + 125 1 131 132 133 + 126 1 132 133 134 + 127 1 133 134 135 + 128 1 134 135 136 + 129 1 135 136 137 + 130 1 136 137 138 + 131 1 137 138 139 + 132 1 138 139 140 + 133 1 139 140 141 + 134 1 140 141 142 + 135 1 141 142 143 + 136 1 142 143 144 + 137 1 143 144 145 + 138 1 144 145 146 + 139 1 145 146 147 + 140 1 146 147 148 + 141 1 147 148 149 + 142 1 148 149 150 + 143 1 149 150 151 + 144 1 150 151 152 + 145 1 151 152 153 + 146 1 152 153 154 + 147 1 153 154 155 + 148 1 154 155 156 + 149 1 155 156 157 + 150 1 156 157 158 + 151 1 157 158 159 + 152 1 158 159 160 + 153 1 161 162 163 + 154 1 162 163 164 + 155 1 163 164 165 + 156 1 164 165 166 + 157 1 165 166 167 + 158 1 166 167 168 + 159 1 167 168 169 + 160 1 168 169 170 + 161 1 169 170 171 + 162 1 170 171 172 + 163 1 171 172 173 + 164 1 172 173 174 + 165 1 173 174 175 + 166 1 174 175 176 + 167 1 175 176 177 + 168 1 176 177 178 + 169 1 177 178 179 + 170 1 178 179 180 + 171 1 179 180 181 + 172 1 180 181 182 + 173 1 181 182 183 + 174 1 182 183 184 + 175 1 183 184 185 + 176 1 184 185 186 + 177 1 185 186 187 + 178 1 186 187 188 + 179 1 187 188 189 + 180 1 188 189 190 + 181 1 189 190 191 + 182 1 190 191 192 + 183 1 191 192 193 + 184 1 192 193 194 + 185 1 193 194 195 + 186 1 194 195 196 + 187 1 195 196 197 + 188 1 196 197 198 + 189 1 197 198 199 + 190 1 198 199 200 + 191 1 201 202 203 + 192 1 202 203 204 + 193 1 203 204 205 + 194 1 204 205 206 + 195 1 205 206 207 + 196 1 206 207 208 + 197 1 207 208 209 + 198 1 208 209 210 + 199 1 209 210 211 + 200 1 210 211 212 + 201 1 211 212 213 + 202 1 212 213 214 + 203 1 213 214 215 + 204 1 214 215 216 + 205 1 215 216 217 + 206 1 216 217 218 + 207 1 217 218 219 + 208 1 218 219 220 + 209 1 219 220 221 + 210 1 220 221 222 + 211 1 221 222 223 + 212 1 222 223 224 + 213 1 223 224 225 + 214 1 224 225 226 + 215 1 225 226 227 + 216 1 226 227 228 + 217 1 227 228 229 + 218 1 228 229 230 + 219 1 229 230 231 + 220 1 230 231 232 + 221 1 231 232 233 + 222 1 232 233 234 + 223 1 233 234 235 + 224 1 234 235 236 + 225 1 235 236 237 + 226 1 236 237 238 + 227 1 237 238 239 + 228 1 238 239 240 + 229 1 241 242 243 + 230 1 242 243 244 + 231 1 243 244 245 + 232 1 244 245 246 + 233 1 245 246 247 + 234 1 246 247 248 + 235 1 247 248 249 + 236 1 248 249 250 + 237 1 249 250 251 + 238 1 250 251 252 + 239 1 251 252 253 + 240 1 252 253 254 + 241 1 253 254 255 + 242 1 254 255 256 + 243 1 255 256 257 + 244 1 256 257 258 + 245 1 257 258 259 + 246 1 258 259 260 + 247 1 259 260 261 + 248 1 260 261 262 + 249 1 261 262 263 + 250 1 262 263 264 + 251 1 263 264 265 + 252 1 264 265 266 + 253 1 265 266 267 + 254 1 266 267 268 + 255 1 267 268 269 + 256 1 268 269 270 + 257 1 269 270 271 + 258 1 270 271 272 + 259 1 271 272 273 + 260 1 272 273 274 + 261 1 273 274 275 + 262 1 274 275 276 + 263 1 275 276 277 + 264 1 276 277 278 + 265 1 277 278 279 + 266 1 278 279 280 + 267 1 281 282 283 + 268 1 282 283 284 + 269 1 283 284 285 + 270 1 284 285 286 + 271 1 285 286 287 + 272 1 286 287 288 + 273 1 287 288 289 + 274 1 288 289 290 + 275 1 289 290 291 + 276 1 290 291 292 + 277 1 291 292 293 + 278 1 292 293 294 + 279 1 293 294 295 + 280 1 294 295 296 + 281 1 295 296 297 + 282 1 296 297 298 + 283 1 297 298 299 + 284 1 298 299 300 + 285 1 299 300 301 + 286 1 300 301 302 + 287 1 301 302 303 + 288 1 302 303 304 + 289 1 303 304 305 + 290 1 304 305 306 + 291 1 305 306 307 + 292 1 306 307 308 + 293 1 307 308 309 + 294 1 308 309 310 + 295 1 309 310 311 + 296 1 310 311 312 + 297 1 311 312 313 + 298 1 312 313 314 + 299 1 313 314 315 + 300 1 314 315 316 + 301 1 315 316 317 + 302 1 316 317 318 + 303 1 317 318 319 + 304 1 318 319 320 + 305 1 321 322 323 + 306 1 322 323 324 + 307 1 323 324 325 + 308 1 324 325 326 + 309 1 325 326 327 + 310 1 326 327 328 + 311 1 327 328 329 + 312 1 328 329 330 + 313 1 329 330 331 + 314 1 330 331 332 + 315 1 331 332 333 + 316 1 332 333 334 + 317 1 333 334 335 + 318 1 334 335 336 + 319 1 335 336 337 + 320 1 336 337 338 + 321 1 337 338 339 + 322 1 338 339 340 + 323 1 339 340 341 + 324 1 340 341 342 + 325 1 341 342 343 + 326 1 342 343 344 + 327 1 343 344 345 + 328 1 344 345 346 + 329 1 345 346 347 + 330 1 346 347 348 + 331 1 347 348 349 + 332 1 348 349 350 + 333 1 349 350 351 + 334 1 350 351 352 + 335 1 351 352 353 + 336 1 352 353 354 + 337 1 353 354 355 + 338 1 354 355 356 + 339 1 355 356 357 + 340 1 356 357 358 + 341 1 357 358 359 + 342 1 358 359 360 + 343 1 361 362 363 + 344 1 362 363 364 + 345 1 363 364 365 + 346 1 364 365 366 + 347 1 365 366 367 + 348 1 366 367 368 + 349 1 367 368 369 + 350 1 368 369 370 + 351 1 369 370 371 + 352 1 370 371 372 + 353 1 371 372 373 + 354 1 372 373 374 + 355 1 373 374 375 + 356 1 374 375 376 + 357 1 375 376 377 + 358 1 376 377 378 + 359 1 377 378 379 + 360 1 378 379 380 + 361 1 379 380 381 + 362 1 380 381 382 + 363 1 381 382 383 + 364 1 382 383 384 + 365 1 383 384 385 + 366 1 384 385 386 + 367 1 385 386 387 + 368 1 386 387 388 + 369 1 387 388 389 + 370 1 388 389 390 + 371 1 389 390 391 + 372 1 390 391 392 + 373 1 391 392 393 + 374 1 392 393 394 + 375 1 393 394 395 + 376 1 394 395 396 + 377 1 395 396 397 + 378 1 396 397 398 + 379 1 397 398 399 + 380 1 398 399 400 + 381 1 401 402 403 + 382 1 402 403 404 + 383 1 403 404 405 + 384 1 404 405 406 + 385 1 405 406 407 + 386 1 406 407 408 + 387 1 407 408 409 + 388 1 408 409 410 + 389 1 409 410 411 + 390 1 410 411 412 + 391 1 411 412 413 + 392 1 412 413 414 + 393 1 413 414 415 + 394 1 414 415 416 + 395 1 415 416 417 + 396 1 416 417 418 + 397 1 417 418 419 + 398 1 418 419 420 + 399 1 419 420 421 + 400 1 420 421 422 + 401 1 421 422 423 + 402 1 422 423 424 + 403 1 423 424 425 + 404 1 424 425 426 + 405 1 425 426 427 + 406 1 426 427 428 + 407 1 427 428 429 + 408 1 428 429 430 + 409 1 429 430 431 + 410 1 430 431 432 + 411 1 431 432 433 + 412 1 432 433 434 + 413 1 433 434 435 + 414 1 434 435 436 + 415 1 435 436 437 + 416 1 436 437 438 + 417 1 437 438 439 + 418 1 438 439 440 + 419 1 441 442 443 + 420 1 442 443 444 + 421 1 443 444 445 + 422 1 444 445 446 + 423 1 445 446 447 + 424 1 446 447 448 + 425 1 447 448 449 + 426 1 448 449 450 + 427 1 449 450 451 + 428 1 450 451 452 + 429 1 451 452 453 + 430 1 452 453 454 + 431 1 453 454 455 + 432 1 454 455 456 + 433 1 455 456 457 + 434 1 456 457 458 + 435 1 457 458 459 + 436 1 458 459 460 + 437 1 459 460 461 + 438 1 460 461 462 + 439 1 461 462 463 + 440 1 462 463 464 + 441 1 463 464 465 + 442 1 464 465 466 + 443 1 465 466 467 + 444 1 466 467 468 + 445 1 467 468 469 + 446 1 468 469 470 + 447 1 469 470 471 + 448 1 470 471 472 + 449 1 471 472 473 + 450 1 472 473 474 + 451 1 473 474 475 + 452 1 474 475 476 + 453 1 475 476 477 + 454 1 476 477 478 + 455 1 477 478 479 + 456 1 478 479 480 + 457 1 481 482 483 + 458 1 482 483 484 + 459 1 483 484 485 + 460 1 484 485 486 + 461 1 485 486 487 + 462 1 486 487 488 + 463 1 487 488 489 + 464 1 488 489 490 + 465 1 489 490 491 + 466 1 490 491 492 + 467 1 491 492 493 + 468 1 492 493 494 + 469 1 493 494 495 + 470 1 494 495 496 + 471 1 495 496 497 + 472 1 496 497 498 + 473 1 497 498 499 + 474 1 498 499 500 + 475 1 499 500 501 + 476 1 500 501 502 + 477 1 501 502 503 + 478 1 502 503 504 + 479 1 503 504 505 + 480 1 504 505 506 + 481 1 505 506 507 + 482 1 506 507 508 + 483 1 507 508 509 + 484 1 508 509 510 + 485 1 509 510 511 + 486 1 510 511 512 + 487 1 511 512 513 + 488 1 512 513 514 + 489 1 513 514 515 + 490 1 514 515 516 + 491 1 515 516 517 + 492 1 516 517 518 + 493 1 517 518 519 + 494 1 518 519 520 + 495 1 521 522 523 + 496 1 522 523 524 + 497 1 523 524 525 + 498 1 524 525 526 + 499 1 525 526 527 + 500 1 526 527 528 + 501 1 527 528 529 + 502 1 528 529 530 + 503 1 529 530 531 + 504 1 530 531 532 + 505 1 531 532 533 + 506 1 532 533 534 + 507 1 533 534 535 + 508 1 534 535 536 + 509 1 535 536 537 + 510 1 536 537 538 + 511 1 537 538 539 + 512 1 538 539 540 + 513 1 539 540 541 + 514 1 540 541 542 + 515 1 541 542 543 + 516 1 542 543 544 + 517 1 543 544 545 + 518 1 544 545 546 + 519 1 545 546 547 + 520 1 546 547 548 + 521 1 547 548 549 + 522 1 548 549 550 + 523 1 549 550 551 + 524 1 550 551 552 + 525 1 551 552 553 + 526 1 552 553 554 + 527 1 553 554 555 + 528 1 554 555 556 + 529 1 555 556 557 + 530 1 556 557 558 + 531 1 557 558 559 + 532 1 558 559 560 + 533 1 561 562 563 + 534 1 562 563 564 + 535 1 563 564 565 + 536 1 564 565 566 + 537 1 565 566 567 + 538 1 566 567 568 + 539 1 567 568 569 + 540 1 568 569 570 + 541 1 569 570 571 + 542 1 570 571 572 + 543 1 571 572 573 + 544 1 572 573 574 + 545 1 573 574 575 + 546 1 574 575 576 + 547 1 575 576 577 + 548 1 576 577 578 + 549 1 577 578 579 + 550 1 578 579 580 + 551 1 579 580 581 + 552 1 580 581 582 + 553 1 581 582 583 + 554 1 582 583 584 + 555 1 583 584 585 + 556 1 584 585 586 + 557 1 585 586 587 + 558 1 586 587 588 + 559 1 587 588 589 + 560 1 588 589 590 + 561 1 589 590 591 + 562 1 590 591 592 + 563 1 591 592 593 + 564 1 592 593 594 + 565 1 593 594 595 + 566 1 594 595 596 + 567 1 595 596 597 + 568 1 596 597 598 + 569 1 597 598 599 + 570 1 598 599 600 + 571 1 601 602 603 + 572 1 602 603 604 + 573 1 603 604 605 + 574 1 604 605 606 + 575 1 605 606 607 + 576 1 606 607 608 + 577 1 607 608 609 + 578 1 608 609 610 + 579 1 609 610 611 + 580 1 610 611 612 + 581 1 611 612 613 + 582 1 612 613 614 + 583 1 613 614 615 + 584 1 614 615 616 + 585 1 615 616 617 + 586 1 616 617 618 + 587 1 617 618 619 + 588 1 618 619 620 + 589 1 619 620 621 + 590 1 620 621 622 + 591 1 621 622 623 + 592 1 622 623 624 + 593 1 623 624 625 + 594 1 624 625 626 + 595 1 625 626 627 + 596 1 626 627 628 + 597 1 627 628 629 + 598 1 628 629 630 + 599 1 629 630 631 + 600 1 630 631 632 + 601 1 631 632 633 + 602 1 632 633 634 + 603 1 633 634 635 + 604 1 634 635 636 + 605 1 635 636 637 + 606 1 636 637 638 + 607 1 637 638 639 + 608 1 638 639 640 + 609 1 641 642 643 + 610 1 642 643 644 + 611 1 643 644 645 + 612 1 644 645 646 + 613 1 645 646 647 + 614 1 646 647 648 + 615 1 647 648 649 + 616 1 648 649 650 + 617 1 649 650 651 + 618 1 650 651 652 + 619 1 651 652 653 + 620 1 652 653 654 + 621 1 653 654 655 + 622 1 654 655 656 + 623 1 655 656 657 + 624 1 656 657 658 + 625 1 657 658 659 + 626 1 658 659 660 + 627 1 659 660 661 + 628 1 660 661 662 + 629 1 661 662 663 + 630 1 662 663 664 + 631 1 663 664 665 + 632 1 664 665 666 + 633 1 665 666 667 + 634 1 666 667 668 + 635 1 667 668 669 + 636 1 668 669 670 + 637 1 669 670 671 + 638 1 670 671 672 + 639 1 671 672 673 + 640 1 672 673 674 + 641 1 673 674 675 + 642 1 674 675 676 + 643 1 675 676 677 + 644 1 676 677 678 + 645 1 677 678 679 + 646 1 678 679 680 + 647 1 681 682 683 + 648 1 682 683 684 + 649 1 683 684 685 + 650 1 684 685 686 + 651 1 685 686 687 + 652 1 686 687 688 + 653 1 687 688 689 + 654 1 688 689 690 + 655 1 689 690 691 + 656 1 690 691 692 + 657 1 691 692 693 + 658 1 692 693 694 + 659 1 693 694 695 + 660 1 694 695 696 + 661 1 695 696 697 + 662 1 696 697 698 + 663 1 697 698 699 + 664 1 698 699 700 + 665 1 699 700 701 + 666 1 700 701 702 + 667 1 701 702 703 + 668 1 702 703 704 + 669 1 703 704 705 + 670 1 704 705 706 + 671 1 705 706 707 + 672 1 706 707 708 + 673 1 707 708 709 + 674 1 708 709 710 + 675 1 709 710 711 + 676 1 710 711 712 + 677 1 711 712 713 + 678 1 712 713 714 + 679 1 713 714 715 + 680 1 714 715 716 + 681 1 715 716 717 + 682 1 716 717 718 + 683 1 717 718 719 + 684 1 718 719 720 + 685 1 721 722 723 + 686 1 722 723 724 + 687 1 723 724 725 + 688 1 724 725 726 + 689 1 725 726 727 + 690 1 726 727 728 + 691 1 727 728 729 + 692 1 728 729 730 + 693 1 729 730 731 + 694 1 730 731 732 + 695 1 731 732 733 + 696 1 732 733 734 + 697 1 733 734 735 + 698 1 734 735 736 + 699 1 735 736 737 + 700 1 736 737 738 + 701 1 737 738 739 + 702 1 738 739 740 + 703 1 739 740 741 + 704 1 740 741 742 + 705 1 741 742 743 + 706 1 742 743 744 + 707 1 743 744 745 + 708 1 744 745 746 + 709 1 745 746 747 + 710 1 746 747 748 + 711 1 747 748 749 + 712 1 748 749 750 + 713 1 749 750 751 + 714 1 750 751 752 + 715 1 751 752 753 + 716 1 752 753 754 + 717 1 753 754 755 + 718 1 754 755 756 + 719 1 755 756 757 + 720 1 756 757 758 + 721 1 757 758 759 + 722 1 758 759 760 + 723 1 761 762 763 + 724 1 762 763 764 + 725 1 763 764 765 + 726 1 764 765 766 + 727 1 765 766 767 + 728 1 766 767 768 + 729 1 767 768 769 + 730 1 768 769 770 + 731 1 769 770 771 + 732 1 770 771 772 + 733 1 771 772 773 + 734 1 772 773 774 + 735 1 773 774 775 + 736 1 774 775 776 + 737 1 775 776 777 + 738 1 776 777 778 + 739 1 777 778 779 + 740 1 778 779 780 + 741 1 779 780 781 + 742 1 780 781 782 + 743 1 781 782 783 + 744 1 782 783 784 + 745 1 783 784 785 + 746 1 784 785 786 + 747 1 785 786 787 + 748 1 786 787 788 + 749 1 787 788 789 + 750 1 788 789 790 + 751 1 789 790 791 + 752 1 790 791 792 + 753 1 791 792 793 + 754 1 792 793 794 + 755 1 793 794 795 + 756 1 794 795 796 + 757 1 795 796 797 + 758 1 796 797 798 + 759 1 797 798 799 + 760 1 798 799 800 + 761 1 801 802 803 + 762 1 802 803 804 + 763 1 803 804 805 + 764 1 804 805 806 + 765 1 805 806 807 + 766 1 806 807 808 + 767 1 807 808 809 + 768 1 808 809 810 + 769 1 809 810 811 + 770 1 810 811 812 + 771 1 811 812 813 + 772 1 812 813 814 + 773 1 813 814 815 + 774 1 814 815 816 + 775 1 815 816 817 + 776 1 816 817 818 + 777 1 817 818 819 + 778 1 818 819 820 + 779 1 819 820 821 + 780 1 820 821 822 + 781 1 821 822 823 + 782 1 822 823 824 + 783 1 823 824 825 + 784 1 824 825 826 + 785 1 825 826 827 + 786 1 826 827 828 + 787 1 827 828 829 + 788 1 828 829 830 + 789 1 829 830 831 + 790 1 830 831 832 + 791 1 831 832 833 + 792 1 832 833 834 + 793 1 833 834 835 + 794 1 834 835 836 + 795 1 835 836 837 + 796 1 836 837 838 + 797 1 837 838 839 + 798 1 838 839 840 + 799 1 841 842 843 + 800 1 842 843 844 + 801 1 843 844 845 + 802 1 844 845 846 + 803 1 845 846 847 + 804 1 846 847 848 + 805 1 847 848 849 + 806 1 848 849 850 + 807 1 849 850 851 + 808 1 850 851 852 + 809 1 851 852 853 + 810 1 852 853 854 + 811 1 853 854 855 + 812 1 854 855 856 + 813 1 855 856 857 + 814 1 856 857 858 + 815 1 857 858 859 + 816 1 858 859 860 + 817 1 859 860 861 + 818 1 860 861 862 + 819 1 861 862 863 + 820 1 862 863 864 + 821 1 863 864 865 + 822 1 864 865 866 + 823 1 865 866 867 + 824 1 866 867 868 + 825 1 867 868 869 + 826 1 868 869 870 + 827 1 869 870 871 + 828 1 870 871 872 + 829 1 871 872 873 + 830 1 872 873 874 + 831 1 873 874 875 + 832 1 874 875 876 + 833 1 875 876 877 + 834 1 876 877 878 + 835 1 877 878 879 + 836 1 878 879 880 + 837 1 881 882 883 + 838 1 882 883 884 + 839 1 883 884 885 + 840 1 884 885 886 + 841 1 885 886 887 + 842 1 886 887 888 + 843 1 887 888 889 + 844 1 888 889 890 + 845 1 889 890 891 + 846 1 890 891 892 + 847 1 891 892 893 + 848 1 892 893 894 + 849 1 893 894 895 + 850 1 894 895 896 + 851 1 895 896 897 + 852 1 896 897 898 + 853 1 897 898 899 + 854 1 898 899 900 + 855 1 899 900 901 + 856 1 900 901 902 + 857 1 901 902 903 + 858 1 902 903 904 + 859 1 903 904 905 + 860 1 904 905 906 + 861 1 905 906 907 + 862 1 906 907 908 + 863 1 907 908 909 + 864 1 908 909 910 + 865 1 909 910 911 + 866 1 910 911 912 + 867 1 911 912 913 + 868 1 912 913 914 + 869 1 913 914 915 + 870 1 914 915 916 + 871 1 915 916 917 + 872 1 916 917 918 + 873 1 917 918 919 + 874 1 918 919 920 + 875 1 921 922 923 + 876 1 922 923 924 + 877 1 923 924 925 + 878 1 924 925 926 + 879 1 925 926 927 + 880 1 926 927 928 + 881 1 927 928 929 + 882 1 928 929 930 + 883 1 929 930 931 + 884 1 930 931 932 + 885 1 931 932 933 + 886 1 932 933 934 + 887 1 933 934 935 + 888 1 934 935 936 + 889 1 935 936 937 + 890 1 936 937 938 + 891 1 937 938 939 + 892 1 938 939 940 + 893 1 939 940 941 + 894 1 940 941 942 + 895 1 941 942 943 + 896 1 942 943 944 + 897 1 943 944 945 + 898 1 944 945 946 + 899 1 945 946 947 + 900 1 946 947 948 + 901 1 947 948 949 + 902 1 948 949 950 + 903 1 949 950 951 + 904 1 950 951 952 + 905 1 951 952 953 + 906 1 952 953 954 + 907 1 953 954 955 + 908 1 954 955 956 + 909 1 955 956 957 + 910 1 956 957 958 + 911 1 957 958 959 + 912 1 958 959 960 + 913 1 961 962 963 + 914 1 962 963 964 + 915 1 963 964 965 + 916 1 964 965 966 + 917 1 965 966 967 + 918 1 966 967 968 + 919 1 967 968 969 + 920 1 968 969 970 + 921 1 969 970 971 + 922 1 970 971 972 + 923 1 971 972 973 + 924 1 972 973 974 + 925 1 973 974 975 + 926 1 974 975 976 + 927 1 975 976 977 + 928 1 976 977 978 + 929 1 977 978 979 + 930 1 978 979 980 + 931 1 979 980 981 + 932 1 980 981 982 + 933 1 981 982 983 + 934 1 982 983 984 + 935 1 983 984 985 + 936 1 984 985 986 + 937 1 985 986 987 + 938 1 986 987 988 + 939 1 987 988 989 + 940 1 988 989 990 + 941 1 989 990 991 + 942 1 990 991 992 + 943 1 991 992 993 + 944 1 992 993 994 + 945 1 993 994 995 + 946 1 994 995 996 + 947 1 995 996 997 + 948 1 996 997 998 + 949 1 997 998 999 + 950 1 998 999 1000 + 951 1 1001 1002 1003 + 952 1 1002 1003 1004 + 953 1 1003 1004 1005 + 954 1 1004 1005 1006 + 955 1 1005 1006 1007 + 956 1 1006 1007 1008 + 957 1 1007 1008 1009 + 958 1 1008 1009 1010 + 959 1 1009 1010 1011 + 960 1 1010 1011 1012 + 961 1 1011 1012 1013 + 962 1 1012 1013 1014 + 963 1 1013 1014 1015 + 964 1 1014 1015 1016 + 965 1 1015 1016 1017 + 966 1 1016 1017 1018 + 967 1 1017 1018 1019 + 968 1 1018 1019 1020 + 969 1 1019 1020 1021 + 970 1 1020 1021 1022 + 971 1 1021 1022 1023 + 972 1 1022 1023 1024 + 973 1 1023 1024 1025 + 974 1 1024 1025 1026 + 975 1 1025 1026 1027 + 976 1 1026 1027 1028 + 977 1 1027 1028 1029 + 978 1 1028 1029 1030 + 979 1 1029 1030 1031 + 980 1 1030 1031 1032 + 981 1 1031 1032 1033 + 982 1 1032 1033 1034 + 983 1 1033 1034 1035 + 984 1 1034 1035 1036 + 985 1 1035 1036 1037 + 986 1 1036 1037 1038 + 987 1 1037 1038 1039 + 988 1 1038 1039 1040 + 989 1 1041 1042 1043 + 990 1 1042 1043 1044 + 991 1 1043 1044 1045 + 992 1 1044 1045 1046 + 993 1 1045 1046 1047 + 994 1 1046 1047 1048 + 995 1 1047 1048 1049 + 996 1 1048 1049 1050 + 997 1 1049 1050 1051 + 998 1 1050 1051 1052 + 999 1 1051 1052 1053 + 1000 1 1052 1053 1054 + 1001 1 1053 1054 1055 + 1002 1 1054 1055 1056 + 1003 1 1055 1056 1057 + 1004 1 1056 1057 1058 + 1005 1 1057 1058 1059 + 1006 1 1058 1059 1060 + 1007 1 1059 1060 1061 + 1008 1 1060 1061 1062 + 1009 1 1061 1062 1063 + 1010 1 1062 1063 1064 + 1011 1 1063 1064 1065 + 1012 1 1064 1065 1066 + 1013 1 1065 1066 1067 + 1014 1 1066 1067 1068 + 1015 1 1067 1068 1069 + 1016 1 1068 1069 1070 + 1017 1 1069 1070 1071 + 1018 1 1070 1071 1072 + 1019 1 1071 1072 1073 + 1020 1 1072 1073 1074 + 1021 1 1073 1074 1075 + 1022 1 1074 1075 1076 + 1023 1 1075 1076 1077 + 1024 1 1076 1077 1078 + 1025 1 1077 1078 1079 + 1026 1 1078 1079 1080 + 1027 1 1081 1082 1083 + 1028 1 1082 1083 1084 + 1029 1 1083 1084 1085 + 1030 1 1084 1085 1086 + 1031 1 1085 1086 1087 + 1032 1 1086 1087 1088 + 1033 1 1087 1088 1089 + 1034 1 1088 1089 1090 + 1035 1 1089 1090 1091 + 1036 1 1090 1091 1092 + 1037 1 1091 1092 1093 + 1038 1 1092 1093 1094 + 1039 1 1093 1094 1095 + 1040 1 1094 1095 1096 + 1041 1 1095 1096 1097 + 1042 1 1096 1097 1098 + 1043 1 1097 1098 1099 + 1044 1 1098 1099 1100 + 1045 1 1099 1100 1101 + 1046 1 1100 1101 1102 + 1047 1 1101 1102 1103 + 1048 1 1102 1103 1104 + 1049 1 1103 1104 1105 + 1050 1 1104 1105 1106 + 1051 1 1105 1106 1107 + 1052 1 1106 1107 1108 + 1053 1 1107 1108 1109 + 1054 1 1108 1109 1110 + 1055 1 1109 1110 1111 + 1056 1 1110 1111 1112 + 1057 1 1111 1112 1113 + 1058 1 1112 1113 1114 + 1059 1 1113 1114 1115 + 1060 1 1114 1115 1116 + 1061 1 1115 1116 1117 + 1062 1 1116 1117 1118 + 1063 1 1117 1118 1119 + 1064 1 1118 1119 1120 + 1065 1 1121 1122 1123 + 1066 1 1122 1123 1124 + 1067 1 1123 1124 1125 + 1068 1 1124 1125 1126 + 1069 1 1125 1126 1127 + 1070 1 1126 1127 1128 + 1071 1 1127 1128 1129 + 1072 1 1128 1129 1130 + 1073 1 1129 1130 1131 + 1074 1 1130 1131 1132 + 1075 1 1131 1132 1133 + 1076 1 1132 1133 1134 + 1077 1 1133 1134 1135 + 1078 1 1134 1135 1136 + 1079 1 1135 1136 1137 + 1080 1 1136 1137 1138 + 1081 1 1137 1138 1139 + 1082 1 1138 1139 1140 + 1083 1 1139 1140 1141 + 1084 1 1140 1141 1142 + 1085 1 1141 1142 1143 + 1086 1 1142 1143 1144 + 1087 1 1143 1144 1145 + 1088 1 1144 1145 1146 + 1089 1 1145 1146 1147 + 1090 1 1146 1147 1148 + 1091 1 1147 1148 1149 + 1092 1 1148 1149 1150 + 1093 1 1149 1150 1151 + 1094 1 1150 1151 1152 + 1095 1 1151 1152 1153 + 1096 1 1152 1153 1154 + 1097 1 1153 1154 1155 + 1098 1 1154 1155 1156 + 1099 1 1155 1156 1157 + 1100 1 1156 1157 1158 + 1101 1 1157 1158 1159 + 1102 1 1158 1159 1160 + 1103 1 1161 1162 1163 + 1104 1 1162 1163 1164 + 1105 1 1163 1164 1165 + 1106 1 1164 1165 1166 + 1107 1 1165 1166 1167 + 1108 1 1166 1167 1168 + 1109 1 1167 1168 1169 + 1110 1 1168 1169 1170 + 1111 1 1169 1170 1171 + 1112 1 1170 1171 1172 + 1113 1 1171 1172 1173 + 1114 1 1172 1173 1174 + 1115 1 1173 1174 1175 + 1116 1 1174 1175 1176 + 1117 1 1175 1176 1177 + 1118 1 1176 1177 1178 + 1119 1 1177 1178 1179 + 1120 1 1178 1179 1180 + 1121 1 1179 1180 1181 + 1122 1 1180 1181 1182 + 1123 1 1181 1182 1183 + 1124 1 1182 1183 1184 + 1125 1 1183 1184 1185 + 1126 1 1184 1185 1186 + 1127 1 1185 1186 1187 + 1128 1 1186 1187 1188 + 1129 1 1187 1188 1189 + 1130 1 1188 1189 1190 + 1131 1 1189 1190 1191 + 1132 1 1190 1191 1192 + 1133 1 1191 1192 1193 + 1134 1 1192 1193 1194 + 1135 1 1193 1194 1195 + 1136 1 1194 1195 1196 + 1137 1 1195 1196 1197 + 1138 1 1196 1197 1198 + 1139 1 1197 1198 1199 + 1140 1 1198 1199 1200 + 1141 1 1201 1202 1203 + 1142 1 1202 1203 1204 + 1143 1 1203 1204 1205 + 1144 1 1204 1205 1206 + 1145 1 1205 1206 1207 + 1146 1 1206 1207 1208 + 1147 1 1207 1208 1209 + 1148 1 1208 1209 1210 + 1149 1 1209 1210 1211 + 1150 1 1210 1211 1212 + 1151 1 1211 1212 1213 + 1152 1 1212 1213 1214 + 1153 1 1213 1214 1215 + 1154 1 1214 1215 1216 + 1155 1 1215 1216 1217 + 1156 1 1216 1217 1218 + 1157 1 1217 1218 1219 + 1158 1 1218 1219 1220 + 1159 1 1219 1220 1221 + 1160 1 1220 1221 1222 + 1161 1 1221 1222 1223 + 1162 1 1222 1223 1224 + 1163 1 1223 1224 1225 + 1164 1 1224 1225 1226 + 1165 1 1225 1226 1227 + 1166 1 1226 1227 1228 + 1167 1 1227 1228 1229 + 1168 1 1228 1229 1230 + 1169 1 1229 1230 1231 + 1170 1 1230 1231 1232 + 1171 1 1231 1232 1233 + 1172 1 1232 1233 1234 + 1173 1 1233 1234 1235 + 1174 1 1234 1235 1236 + 1175 1 1235 1236 1237 + 1176 1 1236 1237 1238 + 1177 1 1237 1238 1239 + 1178 1 1238 1239 1240 + 1179 1 1241 1242 1243 + 1180 1 1242 1243 1244 + 1181 1 1243 1244 1245 + 1182 1 1244 1245 1246 + 1183 1 1245 1246 1247 + 1184 1 1246 1247 1248 + 1185 1 1247 1248 1249 + 1186 1 1248 1249 1250 + 1187 1 1249 1250 1251 + 1188 1 1250 1251 1252 + 1189 1 1251 1252 1253 + 1190 1 1252 1253 1254 + 1191 1 1253 1254 1255 + 1192 1 1254 1255 1256 + 1193 1 1255 1256 1257 + 1194 1 1256 1257 1258 + 1195 1 1257 1258 1259 + 1196 1 1258 1259 1260 + 1197 1 1259 1260 1261 + 1198 1 1260 1261 1262 + 1199 1 1261 1262 1263 + 1200 1 1262 1263 1264 + 1201 1 1263 1264 1265 + 1202 1 1264 1265 1266 + 1203 1 1265 1266 1267 + 1204 1 1266 1267 1268 + 1205 1 1267 1268 1269 + 1206 1 1268 1269 1270 + 1207 1 1269 1270 1271 + 1208 1 1270 1271 1272 + 1209 1 1271 1272 1273 + 1210 1 1272 1273 1274 + 1211 1 1273 1274 1275 + 1212 1 1274 1275 1276 + 1213 1 1275 1276 1277 + 1214 1 1276 1277 1278 + 1215 1 1277 1278 1279 + 1216 1 1278 1279 1280 + 1217 1 1281 1282 1283 + 1218 1 1282 1283 1284 + 1219 1 1283 1284 1285 + 1220 1 1284 1285 1286 + 1221 1 1285 1286 1287 + 1222 1 1286 1287 1288 + 1223 1 1287 1288 1289 + 1224 1 1288 1289 1290 + 1225 1 1289 1290 1291 + 1226 1 1290 1291 1292 + 1227 1 1291 1292 1293 + 1228 1 1292 1293 1294 + 1229 1 1293 1294 1295 + 1230 1 1294 1295 1296 + 1231 1 1295 1296 1297 + 1232 1 1296 1297 1298 + 1233 1 1297 1298 1299 + 1234 1 1298 1299 1300 + 1235 1 1299 1300 1301 + 1236 1 1300 1301 1302 + 1237 1 1301 1302 1303 + 1238 1 1302 1303 1304 + 1239 1 1303 1304 1305 + 1240 1 1304 1305 1306 + 1241 1 1305 1306 1307 + 1242 1 1306 1307 1308 + 1243 1 1307 1308 1309 + 1244 1 1308 1309 1310 + 1245 1 1309 1310 1311 + 1246 1 1310 1311 1312 + 1247 1 1311 1312 1313 + 1248 1 1312 1313 1314 + 1249 1 1313 1314 1315 + 1250 1 1314 1315 1316 + 1251 1 1315 1316 1317 + 1252 1 1316 1317 1318 + 1253 1 1317 1318 1319 + 1254 1 1318 1319 1320 + 1255 1 1321 1322 1323 + 1256 1 1322 1323 1324 + 1257 1 1323 1324 1325 + 1258 1 1324 1325 1326 + 1259 1 1325 1326 1327 + 1260 1 1326 1327 1328 + 1261 1 1327 1328 1329 + 1262 1 1328 1329 1330 + 1263 1 1329 1330 1331 + 1264 1 1330 1331 1332 + 1265 1 1331 1332 1333 + 1266 1 1332 1333 1334 + 1267 1 1333 1334 1335 + 1268 1 1334 1335 1336 + 1269 1 1335 1336 1337 + 1270 1 1336 1337 1338 + 1271 1 1337 1338 1339 + 1272 1 1338 1339 1340 + 1273 1 1339 1340 1341 + 1274 1 1340 1341 1342 + 1275 1 1341 1342 1343 + 1276 1 1342 1343 1344 + 1277 1 1343 1344 1345 + 1278 1 1344 1345 1346 + 1279 1 1345 1346 1347 + 1280 1 1346 1347 1348 + 1281 1 1347 1348 1349 + 1282 1 1348 1349 1350 + 1283 1 1349 1350 1351 + 1284 1 1350 1351 1352 + 1285 1 1351 1352 1353 + 1286 1 1352 1353 1354 + 1287 1 1353 1354 1355 + 1288 1 1354 1355 1356 + 1289 1 1355 1356 1357 + 1290 1 1356 1357 1358 + 1291 1 1357 1358 1359 + 1292 1 1358 1359 1360 + 1293 1 1361 1362 1363 + 1294 1 1362 1363 1364 + 1295 1 1363 1364 1365 + 1296 1 1364 1365 1366 + 1297 1 1365 1366 1367 + 1298 1 1366 1367 1368 + 1299 1 1367 1368 1369 + 1300 1 1368 1369 1370 + 1301 1 1369 1370 1371 + 1302 1 1370 1371 1372 + 1303 1 1371 1372 1373 + 1304 1 1372 1373 1374 + 1305 1 1373 1374 1375 + 1306 1 1374 1375 1376 + 1307 1 1375 1376 1377 + 1308 1 1376 1377 1378 + 1309 1 1377 1378 1379 + 1310 1 1378 1379 1380 + 1311 1 1379 1380 1381 + 1312 1 1380 1381 1382 + 1313 1 1381 1382 1383 + 1314 1 1382 1383 1384 + 1315 1 1383 1384 1385 + 1316 1 1384 1385 1386 + 1317 1 1385 1386 1387 + 1318 1 1386 1387 1388 + 1319 1 1387 1388 1389 + 1320 1 1388 1389 1390 + 1321 1 1389 1390 1391 + 1322 1 1390 1391 1392 + 1323 1 1391 1392 1393 + 1324 1 1392 1393 1394 + 1325 1 1393 1394 1395 + 1326 1 1394 1395 1396 + 1327 1 1395 1396 1397 + 1328 1 1396 1397 1398 + 1329 1 1397 1398 1399 + 1330 1 1398 1399 1400 + 1331 1 1401 1402 1403 + 1332 1 1402 1403 1404 + 1333 1 1403 1404 1405 + 1334 1 1404 1405 1406 + 1335 1 1405 1406 1407 + 1336 1 1406 1407 1408 + 1337 1 1407 1408 1409 + 1338 1 1408 1409 1410 + 1339 1 1409 1410 1411 + 1340 1 1410 1411 1412 + 1341 1 1411 1412 1413 + 1342 1 1412 1413 1414 + 1343 1 1413 1414 1415 + 1344 1 1414 1415 1416 + 1345 1 1415 1416 1417 + 1346 1 1416 1417 1418 + 1347 1 1417 1418 1419 + 1348 1 1418 1419 1420 + 1349 1 1419 1420 1421 + 1350 1 1420 1421 1422 + 1351 1 1421 1422 1423 + 1352 1 1422 1423 1424 + 1353 1 1423 1424 1425 + 1354 1 1424 1425 1426 + 1355 1 1425 1426 1427 + 1356 1 1426 1427 1428 + 1357 1 1427 1428 1429 + 1358 1 1428 1429 1430 + 1359 1 1429 1430 1431 + 1360 1 1430 1431 1432 + 1361 1 1431 1432 1433 + 1362 1 1432 1433 1434 + 1363 1 1433 1434 1435 + 1364 1 1434 1435 1436 + 1365 1 1435 1436 1437 + 1366 1 1436 1437 1438 + 1367 1 1437 1438 1439 + 1368 1 1438 1439 1440 + 1369 1 1441 1442 1443 + 1370 1 1442 1443 1444 + 1371 1 1443 1444 1445 + 1372 1 1444 1445 1446 + 1373 1 1445 1446 1447 + 1374 1 1446 1447 1448 + 1375 1 1447 1448 1449 + 1376 1 1448 1449 1450 + 1377 1 1449 1450 1451 + 1378 1 1450 1451 1452 + 1379 1 1451 1452 1453 + 1380 1 1452 1453 1454 + 1381 1 1453 1454 1455 + 1382 1 1454 1455 1456 + 1383 1 1455 1456 1457 + 1384 1 1456 1457 1458 + 1385 1 1457 1458 1459 + 1386 1 1458 1459 1460 + 1387 1 1459 1460 1461 + 1388 1 1460 1461 1462 + 1389 1 1461 1462 1463 + 1390 1 1462 1463 1464 + 1391 1 1463 1464 1465 + 1392 1 1464 1465 1466 + 1393 1 1465 1466 1467 + 1394 1 1466 1467 1468 + 1395 1 1467 1468 1469 + 1396 1 1468 1469 1470 + 1397 1 1469 1470 1471 + 1398 1 1470 1471 1472 + 1399 1 1471 1472 1473 + 1400 1 1472 1473 1474 + 1401 1 1473 1474 1475 + 1402 1 1474 1475 1476 + 1403 1 1475 1476 1477 + 1404 1 1476 1477 1478 + 1405 1 1477 1478 1479 + 1406 1 1478 1479 1480 + 1407 1 1481 1482 1483 + 1408 1 1482 1483 1484 + 1409 1 1483 1484 1485 + 1410 1 1484 1485 1486 + 1411 1 1485 1486 1487 + 1412 1 1486 1487 1488 + 1413 1 1487 1488 1489 + 1414 1 1488 1489 1490 + 1415 1 1489 1490 1491 + 1416 1 1490 1491 1492 + 1417 1 1491 1492 1493 + 1418 1 1492 1493 1494 + 1419 1 1493 1494 1495 + 1420 1 1494 1495 1496 + 1421 1 1495 1496 1497 + 1422 1 1496 1497 1498 + 1423 1 1497 1498 1499 + 1424 1 1498 1499 1500 + 1425 1 1499 1500 1501 + 1426 1 1500 1501 1502 + 1427 1 1501 1502 1503 + 1428 1 1502 1503 1504 + 1429 1 1503 1504 1505 + 1430 1 1504 1505 1506 + 1431 1 1505 1506 1507 + 1432 1 1506 1507 1508 + 1433 1 1507 1508 1509 + 1434 1 1508 1509 1510 + 1435 1 1509 1510 1511 + 1436 1 1510 1511 1512 + 1437 1 1511 1512 1513 + 1438 1 1512 1513 1514 + 1439 1 1513 1514 1515 + 1440 1 1514 1515 1516 + 1441 1 1515 1516 1517 + 1442 1 1516 1517 1518 + 1443 1 1517 1518 1519 + 1444 1 1518 1519 1520 + 1445 1 1521 1522 1523 + 1446 1 1522 1523 1524 + 1447 1 1523 1524 1525 + 1448 1 1524 1525 1526 + 1449 1 1525 1526 1527 + 1450 1 1526 1527 1528 + 1451 1 1527 1528 1529 + 1452 1 1528 1529 1530 + 1453 1 1529 1530 1531 + 1454 1 1530 1531 1532 + 1455 1 1531 1532 1533 + 1456 1 1532 1533 1534 + 1457 1 1533 1534 1535 + 1458 1 1534 1535 1536 + 1459 1 1535 1536 1537 + 1460 1 1536 1537 1538 + 1461 1 1537 1538 1539 + 1462 1 1538 1539 1540 + 1463 1 1539 1540 1541 + 1464 1 1540 1541 1542 + 1465 1 1541 1542 1543 + 1466 1 1542 1543 1544 + 1467 1 1543 1544 1545 + 1468 1 1544 1545 1546 + 1469 1 1545 1546 1547 + 1470 1 1546 1547 1548 + 1471 1 1547 1548 1549 + 1472 1 1548 1549 1550 + 1473 1 1549 1550 1551 + 1474 1 1550 1551 1552 + 1475 1 1551 1552 1553 + 1476 1 1552 1553 1554 + 1477 1 1553 1554 1555 + 1478 1 1554 1555 1556 + 1479 1 1555 1556 1557 + 1480 1 1556 1557 1558 + 1481 1 1557 1558 1559 + 1482 1 1558 1559 1560 + 1483 1 1561 1562 1563 + 1484 1 1562 1563 1564 + 1485 1 1563 1564 1565 + 1486 1 1564 1565 1566 + 1487 1 1565 1566 1567 + 1488 1 1566 1567 1568 + 1489 1 1567 1568 1569 + 1490 1 1568 1569 1570 + 1491 1 1569 1570 1571 + 1492 1 1570 1571 1572 + 1493 1 1571 1572 1573 + 1494 1 1572 1573 1574 + 1495 1 1573 1574 1575 + 1496 1 1574 1575 1576 + 1497 1 1575 1576 1577 + 1498 1 1576 1577 1578 + 1499 1 1577 1578 1579 + 1500 1 1578 1579 1580 + 1501 1 1579 1580 1581 + 1502 1 1580 1581 1582 + 1503 1 1581 1582 1583 + 1504 1 1582 1583 1584 + 1505 1 1583 1584 1585 + 1506 1 1584 1585 1586 + 1507 1 1585 1586 1587 + 1508 1 1586 1587 1588 + 1509 1 1587 1588 1589 + 1510 1 1588 1589 1590 + 1511 1 1589 1590 1591 + 1512 1 1590 1591 1592 + 1513 1 1591 1592 1593 + 1514 1 1592 1593 1594 + 1515 1 1593 1594 1595 + 1516 1 1594 1595 1596 + 1517 1 1595 1596 1597 + 1518 1 1596 1597 1598 + 1519 1 1597 1598 1599 + 1520 1 1598 1599 1600 + 1521 1 1601 1602 1603 + 1522 1 1602 1603 1604 + 1523 1 1603 1604 1605 + 1524 1 1604 1605 1606 + 1525 1 1605 1606 1607 + 1526 1 1606 1607 1608 + 1527 1 1607 1608 1609 + 1528 1 1608 1609 1610 + 1529 1 1609 1610 1611 + 1530 1 1610 1611 1612 + 1531 1 1611 1612 1613 + 1532 1 1612 1613 1614 + 1533 1 1613 1614 1615 + 1534 1 1614 1615 1616 + 1535 1 1615 1616 1617 + 1536 1 1616 1617 1618 + 1537 1 1617 1618 1619 + 1538 1 1618 1619 1620 + 1539 1 1619 1620 1621 + 1540 1 1620 1621 1622 + 1541 1 1621 1622 1623 + 1542 1 1622 1623 1624 + 1543 1 1623 1624 1625 + 1544 1 1624 1625 1626 + 1545 1 1625 1626 1627 + 1546 1 1626 1627 1628 + 1547 1 1627 1628 1629 + 1548 1 1628 1629 1630 + 1549 1 1629 1630 1631 + 1550 1 1630 1631 1632 + 1551 1 1631 1632 1633 + 1552 1 1632 1633 1634 + 1553 1 1633 1634 1635 + 1554 1 1634 1635 1636 + 1555 1 1635 1636 1637 + 1556 1 1636 1637 1638 + 1557 1 1637 1638 1639 + 1558 1 1638 1639 1640 + 1559 1 1641 1642 1643 + 1560 1 1642 1643 1644 + 1561 1 1643 1644 1645 + 1562 1 1644 1645 1646 + 1563 1 1645 1646 1647 + 1564 1 1646 1647 1648 + 1565 1 1647 1648 1649 + 1566 1 1648 1649 1650 + 1567 1 1649 1650 1651 + 1568 1 1650 1651 1652 + 1569 1 1651 1652 1653 + 1570 1 1652 1653 1654 + 1571 1 1653 1654 1655 + 1572 1 1654 1655 1656 + 1573 1 1655 1656 1657 + 1574 1 1656 1657 1658 + 1575 1 1657 1658 1659 + 1576 1 1658 1659 1660 + 1577 1 1659 1660 1661 + 1578 1 1660 1661 1662 + 1579 1 1661 1662 1663 + 1580 1 1662 1663 1664 + 1581 1 1663 1664 1665 + 1582 1 1664 1665 1666 + 1583 1 1665 1666 1667 + 1584 1 1666 1667 1668 + 1585 1 1667 1668 1669 + 1586 1 1668 1669 1670 + 1587 1 1669 1670 1671 + 1588 1 1670 1671 1672 + 1589 1 1671 1672 1673 + 1590 1 1672 1673 1674 + 1591 1 1673 1674 1675 + 1592 1 1674 1675 1676 + 1593 1 1675 1676 1677 + 1594 1 1676 1677 1678 + 1595 1 1677 1678 1679 + 1596 1 1678 1679 1680 + 1597 1 1681 1682 1683 + 1598 1 1682 1683 1684 + 1599 1 1683 1684 1685 + 1600 1 1684 1685 1686 + 1601 1 1685 1686 1687 + 1602 1 1686 1687 1688 + 1603 1 1687 1688 1689 + 1604 1 1688 1689 1690 + 1605 1 1689 1690 1691 + 1606 1 1690 1691 1692 + 1607 1 1691 1692 1693 + 1608 1 1692 1693 1694 + 1609 1 1693 1694 1695 + 1610 1 1694 1695 1696 + 1611 1 1695 1696 1697 + 1612 1 1696 1697 1698 + 1613 1 1697 1698 1699 + 1614 1 1698 1699 1700 + 1615 1 1699 1700 1701 + 1616 1 1700 1701 1702 + 1617 1 1701 1702 1703 + 1618 1 1702 1703 1704 + 1619 1 1703 1704 1705 + 1620 1 1704 1705 1706 + 1621 1 1705 1706 1707 + 1622 1 1706 1707 1708 + 1623 1 1707 1708 1709 + 1624 1 1708 1709 1710 + 1625 1 1709 1710 1711 + 1626 1 1710 1711 1712 + 1627 1 1711 1712 1713 + 1628 1 1712 1713 1714 + 1629 1 1713 1714 1715 + 1630 1 1714 1715 1716 + 1631 1 1715 1716 1717 + 1632 1 1716 1717 1718 + 1633 1 1717 1718 1719 + 1634 1 1718 1719 1720 + 1635 1 1721 1722 1723 + 1636 1 1722 1723 1724 + 1637 1 1723 1724 1725 + 1638 1 1724 1725 1726 + 1639 1 1725 1726 1727 + 1640 1 1726 1727 1728 + 1641 1 1727 1728 1729 + 1642 1 1728 1729 1730 + 1643 1 1729 1730 1731 + 1644 1 1730 1731 1732 + 1645 1 1731 1732 1733 + 1646 1 1732 1733 1734 + 1647 1 1733 1734 1735 + 1648 1 1734 1735 1736 + 1649 1 1735 1736 1737 + 1650 1 1736 1737 1738 + 1651 1 1737 1738 1739 + 1652 1 1738 1739 1740 + 1653 1 1739 1740 1741 + 1654 1 1740 1741 1742 + 1655 1 1741 1742 1743 + 1656 1 1742 1743 1744 + 1657 1 1743 1744 1745 + 1658 1 1744 1745 1746 + 1659 1 1745 1746 1747 + 1660 1 1746 1747 1748 + 1661 1 1747 1748 1749 + 1662 1 1748 1749 1750 + 1663 1 1749 1750 1751 + 1664 1 1750 1751 1752 + 1665 1 1751 1752 1753 + 1666 1 1752 1753 1754 + 1667 1 1753 1754 1755 + 1668 1 1754 1755 1756 + 1669 1 1755 1756 1757 + 1670 1 1756 1757 1758 + 1671 1 1757 1758 1759 + 1672 1 1758 1759 1760 + 1673 1 1761 1762 1763 + 1674 1 1762 1763 1764 + 1675 1 1763 1764 1765 + 1676 1 1764 1765 1766 + 1677 1 1765 1766 1767 + 1678 1 1766 1767 1768 + 1679 1 1767 1768 1769 + 1680 1 1768 1769 1770 + 1681 1 1769 1770 1771 + 1682 1 1770 1771 1772 + 1683 1 1771 1772 1773 + 1684 1 1772 1773 1774 + 1685 1 1773 1774 1775 + 1686 1 1774 1775 1776 + 1687 1 1775 1776 1777 + 1688 1 1776 1777 1778 + 1689 1 1777 1778 1779 + 1690 1 1778 1779 1780 + 1691 1 1779 1780 1781 + 1692 1 1780 1781 1782 + 1693 1 1781 1782 1783 + 1694 1 1782 1783 1784 + 1695 1 1783 1784 1785 + 1696 1 1784 1785 1786 + 1697 1 1785 1786 1787 + 1698 1 1786 1787 1788 + 1699 1 1787 1788 1789 + 1700 1 1788 1789 1790 + 1701 1 1789 1790 1791 + 1702 1 1790 1791 1792 + 1703 1 1791 1792 1793 + 1704 1 1792 1793 1794 + 1705 1 1793 1794 1795 + 1706 1 1794 1795 1796 + 1707 1 1795 1796 1797 + 1708 1 1796 1797 1798 + 1709 1 1797 1798 1799 + 1710 1 1798 1799 1800 + 1711 1 1801 1802 1803 + 1712 1 1802 1803 1804 + 1713 1 1803 1804 1805 + 1714 1 1804 1805 1806 + 1715 1 1805 1806 1807 + 1716 1 1806 1807 1808 + 1717 1 1807 1808 1809 + 1718 1 1808 1809 1810 + 1719 1 1809 1810 1811 + 1720 1 1810 1811 1812 + 1721 1 1811 1812 1813 + 1722 1 1812 1813 1814 + 1723 1 1813 1814 1815 + 1724 1 1814 1815 1816 + 1725 1 1815 1816 1817 + 1726 1 1816 1817 1818 + 1727 1 1817 1818 1819 + 1728 1 1818 1819 1820 + 1729 1 1819 1820 1821 + 1730 1 1820 1821 1822 + 1731 1 1821 1822 1823 + 1732 1 1822 1823 1824 + 1733 1 1823 1824 1825 + 1734 1 1824 1825 1826 + 1735 1 1825 1826 1827 + 1736 1 1826 1827 1828 + 1737 1 1827 1828 1829 + 1738 1 1828 1829 1830 + 1739 1 1829 1830 1831 + 1740 1 1830 1831 1832 + 1741 1 1831 1832 1833 + 1742 1 1832 1833 1834 + 1743 1 1833 1834 1835 + 1744 1 1834 1835 1836 + 1745 1 1835 1836 1837 + 1746 1 1836 1837 1838 + 1747 1 1837 1838 1839 + 1748 1 1838 1839 1840 + 1749 1 1841 1842 1843 + 1750 1 1842 1843 1844 + 1751 1 1843 1844 1845 + 1752 1 1844 1845 1846 + 1753 1 1845 1846 1847 + 1754 1 1846 1847 1848 + 1755 1 1847 1848 1849 + 1756 1 1848 1849 1850 + 1757 1 1849 1850 1851 + 1758 1 1850 1851 1852 + 1759 1 1851 1852 1853 + 1760 1 1852 1853 1854 + 1761 1 1853 1854 1855 + 1762 1 1854 1855 1856 + 1763 1 1855 1856 1857 + 1764 1 1856 1857 1858 + 1765 1 1857 1858 1859 + 1766 1 1858 1859 1860 + 1767 1 1859 1860 1861 + 1768 1 1860 1861 1862 + 1769 1 1861 1862 1863 + 1770 1 1862 1863 1864 + 1771 1 1863 1864 1865 + 1772 1 1864 1865 1866 + 1773 1 1865 1866 1867 + 1774 1 1866 1867 1868 + 1775 1 1867 1868 1869 + 1776 1 1868 1869 1870 + 1777 1 1869 1870 1871 + 1778 1 1870 1871 1872 + 1779 1 1871 1872 1873 + 1780 1 1872 1873 1874 + 1781 1 1873 1874 1875 + 1782 1 1874 1875 1876 + 1783 1 1875 1876 1877 + 1784 1 1876 1877 1878 + 1785 1 1877 1878 1879 + 1786 1 1878 1879 1880 + 1787 1 1881 1882 1883 + 1788 1 1882 1883 1884 + 1789 1 1883 1884 1885 + 1790 1 1884 1885 1886 + 1791 1 1885 1886 1887 + 1792 1 1886 1887 1888 + 1793 1 1887 1888 1889 + 1794 1 1888 1889 1890 + 1795 1 1889 1890 1891 + 1796 1 1890 1891 1892 + 1797 1 1891 1892 1893 + 1798 1 1892 1893 1894 + 1799 1 1893 1894 1895 + 1800 1 1894 1895 1896 + 1801 1 1895 1896 1897 + 1802 1 1896 1897 1898 + 1803 1 1897 1898 1899 + 1804 1 1898 1899 1900 + 1805 1 1899 1900 1901 + 1806 1 1900 1901 1902 + 1807 1 1901 1902 1903 + 1808 1 1902 1903 1904 + 1809 1 1903 1904 1905 + 1810 1 1904 1905 1906 + 1811 1 1905 1906 1907 + 1812 1 1906 1907 1908 + 1813 1 1907 1908 1909 + 1814 1 1908 1909 1910 + 1815 1 1909 1910 1911 + 1816 1 1910 1911 1912 + 1817 1 1911 1912 1913 + 1818 1 1912 1913 1914 + 1819 1 1913 1914 1915 + 1820 1 1914 1915 1916 + 1821 1 1915 1916 1917 + 1822 1 1916 1917 1918 + 1823 1 1917 1918 1919 + 1824 1 1918 1919 1920 + 1825 1 1921 1922 1923 + 1826 1 1922 1923 1924 + 1827 1 1923 1924 1925 + 1828 1 1924 1925 1926 + 1829 1 1925 1926 1927 + 1830 1 1926 1927 1928 + 1831 1 1927 1928 1929 + 1832 1 1928 1929 1930 + 1833 1 1929 1930 1931 + 1834 1 1930 1931 1932 + 1835 1 1931 1932 1933 + 1836 1 1932 1933 1934 + 1837 1 1933 1934 1935 + 1838 1 1934 1935 1936 + 1839 1 1935 1936 1937 + 1840 1 1936 1937 1938 + 1841 1 1937 1938 1939 + 1842 1 1938 1939 1940 + 1843 1 1939 1940 1941 + 1844 1 1940 1941 1942 + 1845 1 1941 1942 1943 + 1846 1 1942 1943 1944 + 1847 1 1943 1944 1945 + 1848 1 1944 1945 1946 + 1849 1 1945 1946 1947 + 1850 1 1946 1947 1948 + 1851 1 1947 1948 1949 + 1852 1 1948 1949 1950 + 1853 1 1949 1950 1951 + 1854 1 1950 1951 1952 + 1855 1 1951 1952 1953 + 1856 1 1952 1953 1954 + 1857 1 1953 1954 1955 + 1858 1 1954 1955 1956 + 1859 1 1955 1956 1957 + 1860 1 1956 1957 1958 + 1861 1 1957 1958 1959 + 1862 1 1958 1959 1960 + 1863 1 1961 1962 1963 + 1864 1 1962 1963 1964 + 1865 1 1963 1964 1965 + 1866 1 1964 1965 1966 + 1867 1 1965 1966 1967 + 1868 1 1966 1967 1968 + 1869 1 1967 1968 1969 + 1870 1 1968 1969 1970 + 1871 1 1969 1970 1971 + 1872 1 1970 1971 1972 + 1873 1 1971 1972 1973 + 1874 1 1972 1973 1974 + 1875 1 1973 1974 1975 + 1876 1 1974 1975 1976 + 1877 1 1975 1976 1977 + 1878 1 1976 1977 1978 + 1879 1 1977 1978 1979 + 1880 1 1978 1979 1980 + 1881 1 1979 1980 1981 + 1882 1 1980 1981 1982 + 1883 1 1981 1982 1983 + 1884 1 1982 1983 1984 + 1885 1 1983 1984 1985 + 1886 1 1984 1985 1986 + 1887 1 1985 1986 1987 + 1888 1 1986 1987 1988 + 1889 1 1987 1988 1989 + 1890 1 1988 1989 1990 + 1891 1 1989 1990 1991 + 1892 1 1990 1991 1992 + 1893 1 1991 1992 1993 + 1894 1 1992 1993 1994 + 1895 1 1993 1994 1995 + 1896 1 1994 1995 1996 + 1897 1 1995 1996 1997 + 1898 1 1996 1997 1998 + 1899 1 1997 1998 1999 + 1900 1 1998 1999 2000 + 1901 1 2001 2002 2003 + 1902 1 2002 2003 2004 + 1903 1 2003 2004 2005 + 1904 1 2004 2005 2006 + 1905 1 2005 2006 2007 + 1906 1 2006 2007 2008 + 1907 1 2007 2008 2009 + 1908 1 2008 2009 2010 + 1909 1 2009 2010 2011 + 1910 1 2010 2011 2012 + 1911 1 2011 2012 2013 + 1912 1 2012 2013 2014 + 1913 1 2013 2014 2015 + 1914 1 2014 2015 2016 + 1915 1 2015 2016 2017 + 1916 1 2016 2017 2018 + 1917 1 2017 2018 2019 + 1918 1 2018 2019 2020 + 1919 1 2019 2020 2021 + 1920 1 2020 2021 2022 + 1921 1 2021 2022 2023 + 1922 1 2022 2023 2024 + 1923 1 2023 2024 2025 + 1924 1 2024 2025 2026 + 1925 1 2025 2026 2027 + 1926 1 2026 2027 2028 + 1927 1 2027 2028 2029 + 1928 1 2028 2029 2030 + 1929 1 2029 2030 2031 + 1930 1 2030 2031 2032 + 1931 1 2031 2032 2033 + 1932 1 2032 2033 2034 + 1933 1 2033 2034 2035 + 1934 1 2034 2035 2036 + 1935 1 2035 2036 2037 + 1936 1 2036 2037 2038 + 1937 1 2037 2038 2039 + 1938 1 2038 2039 2040 + 1939 1 2041 2042 2043 + 1940 1 2042 2043 2044 + 1941 1 2043 2044 2045 + 1942 1 2044 2045 2046 + 1943 1 2045 2046 2047 + 1944 1 2046 2047 2048 + 1945 1 2047 2048 2049 + 1946 1 2048 2049 2050 + 1947 1 2049 2050 2051 + 1948 1 2050 2051 2052 + 1949 1 2051 2052 2053 + 1950 1 2052 2053 2054 + 1951 1 2053 2054 2055 + 1952 1 2054 2055 2056 + 1953 1 2055 2056 2057 + 1954 1 2056 2057 2058 + 1955 1 2057 2058 2059 + 1956 1 2058 2059 2060 + 1957 1 2059 2060 2061 + 1958 1 2060 2061 2062 + 1959 1 2061 2062 2063 + 1960 1 2062 2063 2064 + 1961 1 2063 2064 2065 + 1962 1 2064 2065 2066 + 1963 1 2065 2066 2067 + 1964 1 2066 2067 2068 + 1965 1 2067 2068 2069 + 1966 1 2068 2069 2070 + 1967 1 2069 2070 2071 + 1968 1 2070 2071 2072 + 1969 1 2071 2072 2073 + 1970 1 2072 2073 2074 + 1971 1 2073 2074 2075 + 1972 1 2074 2075 2076 + 1973 1 2075 2076 2077 + 1974 1 2076 2077 2078 + 1975 1 2077 2078 2079 + 1976 1 2078 2079 2080 + 1977 1 2081 2082 2083 + 1978 1 2082 2083 2084 + 1979 1 2083 2084 2085 + 1980 1 2084 2085 2086 + 1981 1 2085 2086 2087 + 1982 1 2086 2087 2088 + 1983 1 2087 2088 2089 + 1984 1 2088 2089 2090 + 1985 1 2089 2090 2091 + 1986 1 2090 2091 2092 + 1987 1 2091 2092 2093 + 1988 1 2092 2093 2094 + 1989 1 2093 2094 2095 + 1990 1 2094 2095 2096 + 1991 1 2095 2096 2097 + 1992 1 2096 2097 2098 + 1993 1 2097 2098 2099 + 1994 1 2098 2099 2100 + 1995 1 2099 2100 2101 + 1996 1 2100 2101 2102 + 1997 1 2101 2102 2103 + 1998 1 2102 2103 2104 + 1999 1 2103 2104 2105 + 2000 1 2104 2105 2106 + 2001 1 2105 2106 2107 + 2002 1 2106 2107 2108 + 2003 1 2107 2108 2109 + 2004 1 2108 2109 2110 + 2005 1 2109 2110 2111 + 2006 1 2110 2111 2112 + 2007 1 2111 2112 2113 + 2008 1 2112 2113 2114 + 2009 1 2113 2114 2115 + 2010 1 2114 2115 2116 + 2011 1 2115 2116 2117 + 2012 1 2116 2117 2118 + 2013 1 2117 2118 2119 + 2014 1 2118 2119 2120 + 2015 1 2121 2122 2123 + 2016 1 2122 2123 2124 + 2017 1 2123 2124 2125 + 2018 1 2124 2125 2126 + 2019 1 2125 2126 2127 + 2020 1 2126 2127 2128 + 2021 1 2127 2128 2129 + 2022 1 2128 2129 2130 + 2023 1 2129 2130 2131 + 2024 1 2130 2131 2132 + 2025 1 2131 2132 2133 + 2026 1 2132 2133 2134 + 2027 1 2133 2134 2135 + 2028 1 2134 2135 2136 + 2029 1 2135 2136 2137 + 2030 1 2136 2137 2138 + 2031 1 2137 2138 2139 + 2032 1 2138 2139 2140 + 2033 1 2139 2140 2141 + 2034 1 2140 2141 2142 + 2035 1 2141 2142 2143 + 2036 1 2142 2143 2144 + 2037 1 2143 2144 2145 + 2038 1 2144 2145 2146 + 2039 1 2145 2146 2147 + 2040 1 2146 2147 2148 + 2041 1 2147 2148 2149 + 2042 1 2148 2149 2150 + 2043 1 2149 2150 2151 + 2044 1 2150 2151 2152 + 2045 1 2151 2152 2153 + 2046 1 2152 2153 2154 + 2047 1 2153 2154 2155 + 2048 1 2154 2155 2156 + 2049 1 2155 2156 2157 + 2050 1 2156 2157 2158 + 2051 1 2157 2158 2159 + 2052 1 2158 2159 2160 + 2053 1 2161 2162 2163 + 2054 1 2162 2163 2164 + 2055 1 2163 2164 2165 + 2056 1 2164 2165 2166 + 2057 1 2165 2166 2167 + 2058 1 2166 2167 2168 + 2059 1 2167 2168 2169 + 2060 1 2168 2169 2170 + 2061 1 2169 2170 2171 + 2062 1 2170 2171 2172 + 2063 1 2171 2172 2173 + 2064 1 2172 2173 2174 + 2065 1 2173 2174 2175 + 2066 1 2174 2175 2176 + 2067 1 2175 2176 2177 + 2068 1 2176 2177 2178 + 2069 1 2177 2178 2179 + 2070 1 2178 2179 2180 + 2071 1 2179 2180 2181 + 2072 1 2180 2181 2182 + 2073 1 2181 2182 2183 + 2074 1 2182 2183 2184 + 2075 1 2183 2184 2185 + 2076 1 2184 2185 2186 + 2077 1 2185 2186 2187 + 2078 1 2186 2187 2188 + 2079 1 2187 2188 2189 + 2080 1 2188 2189 2190 + 2081 1 2189 2190 2191 + 2082 1 2190 2191 2192 + 2083 1 2191 2192 2193 + 2084 1 2192 2193 2194 + 2085 1 2193 2194 2195 + 2086 1 2194 2195 2196 + 2087 1 2195 2196 2197 + 2088 1 2196 2197 2198 + 2089 1 2197 2198 2199 + 2090 1 2198 2199 2200 + 2091 1 2201 2202 2203 + 2092 1 2202 2203 2204 + 2093 1 2203 2204 2205 + 2094 1 2204 2205 2206 + 2095 1 2205 2206 2207 + 2096 1 2206 2207 2208 + 2097 1 2207 2208 2209 + 2098 1 2208 2209 2210 + 2099 1 2209 2210 2211 + 2100 1 2210 2211 2212 + 2101 1 2211 2212 2213 + 2102 1 2212 2213 2214 + 2103 1 2213 2214 2215 + 2104 1 2214 2215 2216 + 2105 1 2215 2216 2217 + 2106 1 2216 2217 2218 + 2107 1 2217 2218 2219 + 2108 1 2218 2219 2220 + 2109 1 2219 2220 2221 + 2110 1 2220 2221 2222 + 2111 1 2221 2222 2223 + 2112 1 2222 2223 2224 + 2113 1 2223 2224 2225 + 2114 1 2224 2225 2226 + 2115 1 2225 2226 2227 + 2116 1 2226 2227 2228 + 2117 1 2227 2228 2229 + 2118 1 2228 2229 2230 + 2119 1 2229 2230 2231 + 2120 1 2230 2231 2232 + 2121 1 2231 2232 2233 + 2122 1 2232 2233 2234 + 2123 1 2233 2234 2235 + 2124 1 2234 2235 2236 + 2125 1 2235 2236 2237 + 2126 1 2236 2237 2238 + 2127 1 2237 2238 2239 + 2128 1 2238 2239 2240 + 2129 1 2241 2242 2243 + 2130 1 2242 2243 2244 + 2131 1 2243 2244 2245 + 2132 1 2244 2245 2246 + 2133 1 2245 2246 2247 + 2134 1 2246 2247 2248 + 2135 1 2247 2248 2249 + 2136 1 2248 2249 2250 + 2137 1 2249 2250 2251 + 2138 1 2250 2251 2252 + 2139 1 2251 2252 2253 + 2140 1 2252 2253 2254 + 2141 1 2253 2254 2255 + 2142 1 2254 2255 2256 + 2143 1 2255 2256 2257 + 2144 1 2256 2257 2258 + 2145 1 2257 2258 2259 + 2146 1 2258 2259 2260 + 2147 1 2259 2260 2261 + 2148 1 2260 2261 2262 + 2149 1 2261 2262 2263 + 2150 1 2262 2263 2264 + 2151 1 2263 2264 2265 + 2152 1 2264 2265 2266 + 2153 1 2265 2266 2267 + 2154 1 2266 2267 2268 + 2155 1 2267 2268 2269 + 2156 1 2268 2269 2270 + 2157 1 2269 2270 2271 + 2158 1 2270 2271 2272 + 2159 1 2271 2272 2273 + 2160 1 2272 2273 2274 + 2161 1 2273 2274 2275 + 2162 1 2274 2275 2276 + 2163 1 2275 2276 2277 + 2164 1 2276 2277 2278 + 2165 1 2277 2278 2279 + 2166 1 2278 2279 2280 + 2167 1 2281 2282 2283 + 2168 1 2282 2283 2284 + 2169 1 2283 2284 2285 + 2170 1 2284 2285 2286 + 2171 1 2285 2286 2287 + 2172 1 2286 2287 2288 + 2173 1 2287 2288 2289 + 2174 1 2288 2289 2290 + 2175 1 2289 2290 2291 + 2176 1 2290 2291 2292 + 2177 1 2291 2292 2293 + 2178 1 2292 2293 2294 + 2179 1 2293 2294 2295 + 2180 1 2294 2295 2296 + 2181 1 2295 2296 2297 + 2182 1 2296 2297 2298 + 2183 1 2297 2298 2299 + 2184 1 2298 2299 2300 + 2185 1 2299 2300 2301 + 2186 1 2300 2301 2302 + 2187 1 2301 2302 2303 + 2188 1 2302 2303 2304 + 2189 1 2303 2304 2305 + 2190 1 2304 2305 2306 + 2191 1 2305 2306 2307 + 2192 1 2306 2307 2308 + 2193 1 2307 2308 2309 + 2194 1 2308 2309 2310 + 2195 1 2309 2310 2311 + 2196 1 2310 2311 2312 + 2197 1 2311 2312 2313 + 2198 1 2312 2313 2314 + 2199 1 2313 2314 2315 + 2200 1 2314 2315 2316 + 2201 1 2315 2316 2317 + 2202 1 2316 2317 2318 + 2203 1 2317 2318 2319 + 2204 1 2318 2319 2320 + 2205 1 2321 2322 2323 + 2206 1 2322 2323 2324 + 2207 1 2323 2324 2325 + 2208 1 2324 2325 2326 + 2209 1 2325 2326 2327 + 2210 1 2326 2327 2328 + 2211 1 2327 2328 2329 + 2212 1 2328 2329 2330 + 2213 1 2329 2330 2331 + 2214 1 2330 2331 2332 + 2215 1 2331 2332 2333 + 2216 1 2332 2333 2334 + 2217 1 2333 2334 2335 + 2218 1 2334 2335 2336 + 2219 1 2335 2336 2337 + 2220 1 2336 2337 2338 + 2221 1 2337 2338 2339 + 2222 1 2338 2339 2340 + 2223 1 2339 2340 2341 + 2224 1 2340 2341 2342 + 2225 1 2341 2342 2343 + 2226 1 2342 2343 2344 + 2227 1 2343 2344 2345 + 2228 1 2344 2345 2346 + 2229 1 2345 2346 2347 + 2230 1 2346 2347 2348 + 2231 1 2347 2348 2349 + 2232 1 2348 2349 2350 + 2233 1 2349 2350 2351 + 2234 1 2350 2351 2352 + 2235 1 2351 2352 2353 + 2236 1 2352 2353 2354 + 2237 1 2353 2354 2355 + 2238 1 2354 2355 2356 + 2239 1 2355 2356 2357 + 2240 1 2356 2357 2358 + 2241 1 2357 2358 2359 + 2242 1 2358 2359 2360 + 2243 1 2361 2362 2363 + 2244 1 2362 2363 2364 + 2245 1 2363 2364 2365 + 2246 1 2364 2365 2366 + 2247 1 2365 2366 2367 + 2248 1 2366 2367 2368 + 2249 1 2367 2368 2369 + 2250 1 2368 2369 2370 + 2251 1 2369 2370 2371 + 2252 1 2370 2371 2372 + 2253 1 2371 2372 2373 + 2254 1 2372 2373 2374 + 2255 1 2373 2374 2375 + 2256 1 2374 2375 2376 + 2257 1 2375 2376 2377 + 2258 1 2376 2377 2378 + 2259 1 2377 2378 2379 + 2260 1 2378 2379 2380 + 2261 1 2379 2380 2381 + 2262 1 2380 2381 2382 + 2263 1 2381 2382 2383 + 2264 1 2382 2383 2384 + 2265 1 2383 2384 2385 + 2266 1 2384 2385 2386 + 2267 1 2385 2386 2387 + 2268 1 2386 2387 2388 + 2269 1 2387 2388 2389 + 2270 1 2388 2389 2390 + 2271 1 2389 2390 2391 + 2272 1 2390 2391 2392 + 2273 1 2391 2392 2393 + 2274 1 2392 2393 2394 + 2275 1 2393 2394 2395 + 2276 1 2394 2395 2396 + 2277 1 2395 2396 2397 + 2278 1 2396 2397 2398 + 2279 1 2397 2398 2399 + 2280 1 2398 2399 2400 + 2281 1 2401 2402 2403 + 2282 1 2402 2403 2404 + 2283 1 2403 2404 2405 + 2284 1 2404 2405 2406 + 2285 1 2405 2406 2407 + 2286 1 2406 2407 2408 + 2287 1 2407 2408 2409 + 2288 1 2408 2409 2410 + 2289 1 2409 2410 2411 + 2290 1 2410 2411 2412 + 2291 1 2411 2412 2413 + 2292 1 2412 2413 2414 + 2293 1 2413 2414 2415 + 2294 1 2414 2415 2416 + 2295 1 2415 2416 2417 + 2296 1 2416 2417 2418 + 2297 1 2417 2418 2419 + 2298 1 2418 2419 2420 + 2299 1 2419 2420 2421 + 2300 1 2420 2421 2422 + 2301 1 2421 2422 2423 + 2302 1 2422 2423 2424 + 2303 1 2423 2424 2425 + 2304 1 2424 2425 2426 + 2305 1 2425 2426 2427 + 2306 1 2426 2427 2428 + 2307 1 2427 2428 2429 + 2308 1 2428 2429 2430 + 2309 1 2429 2430 2431 + 2310 1 2430 2431 2432 + 2311 1 2431 2432 2433 + 2312 1 2432 2433 2434 + 2313 1 2433 2434 2435 + 2314 1 2434 2435 2436 + 2315 1 2435 2436 2437 + 2316 1 2436 2437 2438 + 2317 1 2437 2438 2439 + 2318 1 2438 2439 2440 + 2319 1 2441 2442 2443 + 2320 1 2442 2443 2444 + 2321 1 2443 2444 2445 + 2322 1 2444 2445 2446 + 2323 1 2445 2446 2447 + 2324 1 2446 2447 2448 + 2325 1 2447 2448 2449 + 2326 1 2448 2449 2450 + 2327 1 2449 2450 2451 + 2328 1 2450 2451 2452 + 2329 1 2451 2452 2453 + 2330 1 2452 2453 2454 + 2331 1 2453 2454 2455 + 2332 1 2454 2455 2456 + 2333 1 2455 2456 2457 + 2334 1 2456 2457 2458 + 2335 1 2457 2458 2459 + 2336 1 2458 2459 2460 + 2337 1 2459 2460 2461 + 2338 1 2460 2461 2462 + 2339 1 2461 2462 2463 + 2340 1 2462 2463 2464 + 2341 1 2463 2464 2465 + 2342 1 2464 2465 2466 + 2343 1 2465 2466 2467 + 2344 1 2466 2467 2468 + 2345 1 2467 2468 2469 + 2346 1 2468 2469 2470 + 2347 1 2469 2470 2471 + 2348 1 2470 2471 2472 + 2349 1 2471 2472 2473 + 2350 1 2472 2473 2474 + 2351 1 2473 2474 2475 + 2352 1 2474 2475 2476 + 2353 1 2475 2476 2477 + 2354 1 2476 2477 2478 + 2355 1 2477 2478 2479 + 2356 1 2478 2479 2480 + 2357 1 2481 2482 2483 + 2358 1 2482 2483 2484 + 2359 1 2483 2484 2485 + 2360 1 2484 2485 2486 + 2361 1 2485 2486 2487 + 2362 1 2486 2487 2488 + 2363 1 2487 2488 2489 + 2364 1 2488 2489 2490 + 2365 1 2489 2490 2491 + 2366 1 2490 2491 2492 + 2367 1 2491 2492 2493 + 2368 1 2492 2493 2494 + 2369 1 2493 2494 2495 + 2370 1 2494 2495 2496 + 2371 1 2495 2496 2497 + 2372 1 2496 2497 2498 + 2373 1 2497 2498 2499 + 2374 1 2498 2499 2500 + 2375 1 2499 2500 2501 + 2376 1 2500 2501 2502 + 2377 1 2501 2502 2503 + 2378 1 2502 2503 2504 + 2379 1 2503 2504 2505 + 2380 1 2504 2505 2506 + 2381 1 2505 2506 2507 + 2382 1 2506 2507 2508 + 2383 1 2507 2508 2509 + 2384 1 2508 2509 2510 + 2385 1 2509 2510 2511 + 2386 1 2510 2511 2512 + 2387 1 2511 2512 2513 + 2388 1 2512 2513 2514 + 2389 1 2513 2514 2515 + 2390 1 2514 2515 2516 + 2391 1 2515 2516 2517 + 2392 1 2516 2517 2518 + 2393 1 2517 2518 2519 + 2394 1 2518 2519 2520 + 2395 1 2521 2522 2523 + 2396 1 2522 2523 2524 + 2397 1 2523 2524 2525 + 2398 1 2524 2525 2526 + 2399 1 2525 2526 2527 + 2400 1 2526 2527 2528 + 2401 1 2527 2528 2529 + 2402 1 2528 2529 2530 + 2403 1 2529 2530 2531 + 2404 1 2530 2531 2532 + 2405 1 2531 2532 2533 + 2406 1 2532 2533 2534 + 2407 1 2533 2534 2535 + 2408 1 2534 2535 2536 + 2409 1 2535 2536 2537 + 2410 1 2536 2537 2538 + 2411 1 2537 2538 2539 + 2412 1 2538 2539 2540 + 2413 1 2539 2540 2541 + 2414 1 2540 2541 2542 + 2415 1 2541 2542 2543 + 2416 1 2542 2543 2544 + 2417 1 2543 2544 2545 + 2418 1 2544 2545 2546 + 2419 1 2545 2546 2547 + 2420 1 2546 2547 2548 + 2421 1 2547 2548 2549 + 2422 1 2548 2549 2550 + 2423 1 2549 2550 2551 + 2424 1 2550 2551 2552 + 2425 1 2551 2552 2553 + 2426 1 2552 2553 2554 + 2427 1 2553 2554 2555 + 2428 1 2554 2555 2556 + 2429 1 2555 2556 2557 + 2430 1 2556 2557 2558 + 2431 1 2557 2558 2559 + 2432 1 2558 2559 2560 + 2433 1 2561 2562 2563 + 2434 1 2562 2563 2564 + 2435 1 2563 2564 2565 + 2436 1 2564 2565 2566 + 2437 1 2565 2566 2567 + 2438 1 2566 2567 2568 + 2439 1 2567 2568 2569 + 2440 1 2568 2569 2570 + 2441 1 2569 2570 2571 + 2442 1 2570 2571 2572 + 2443 1 2571 2572 2573 + 2444 1 2572 2573 2574 + 2445 1 2573 2574 2575 + 2446 1 2574 2575 2576 + 2447 1 2575 2576 2577 + 2448 1 2576 2577 2578 + 2449 1 2577 2578 2579 + 2450 1 2578 2579 2580 + 2451 1 2579 2580 2581 + 2452 1 2580 2581 2582 + 2453 1 2581 2582 2583 + 2454 1 2582 2583 2584 + 2455 1 2583 2584 2585 + 2456 1 2584 2585 2586 + 2457 1 2585 2586 2587 + 2458 1 2586 2587 2588 + 2459 1 2587 2588 2589 + 2460 1 2588 2589 2590 + 2461 1 2589 2590 2591 + 2462 1 2590 2591 2592 + 2463 1 2591 2592 2593 + 2464 1 2592 2593 2594 + 2465 1 2593 2594 2595 + 2466 1 2594 2595 2596 + 2467 1 2595 2596 2597 + 2468 1 2596 2597 2598 + 2469 1 2597 2598 2599 + 2470 1 2598 2599 2600 + 2471 1 2601 2602 2603 + 2472 1 2602 2603 2604 + 2473 1 2603 2604 2605 + 2474 1 2604 2605 2606 + 2475 1 2605 2606 2607 + 2476 1 2606 2607 2608 + 2477 1 2607 2608 2609 + 2478 1 2608 2609 2610 + 2479 1 2609 2610 2611 + 2480 1 2610 2611 2612 + 2481 1 2611 2612 2613 + 2482 1 2612 2613 2614 + 2483 1 2613 2614 2615 + 2484 1 2614 2615 2616 + 2485 1 2615 2616 2617 + 2486 1 2616 2617 2618 + 2487 1 2617 2618 2619 + 2488 1 2618 2619 2620 + 2489 1 2619 2620 2621 + 2490 1 2620 2621 2622 + 2491 1 2621 2622 2623 + 2492 1 2622 2623 2624 + 2493 1 2623 2624 2625 + 2494 1 2624 2625 2626 + 2495 1 2625 2626 2627 + 2496 1 2626 2627 2628 + 2497 1 2627 2628 2629 + 2498 1 2628 2629 2630 + 2499 1 2629 2630 2631 + 2500 1 2630 2631 2632 + 2501 1 2631 2632 2633 + 2502 1 2632 2633 2634 + 2503 1 2633 2634 2635 + 2504 1 2634 2635 2636 + 2505 1 2635 2636 2637 + 2506 1 2636 2637 2638 + 2507 1 2637 2638 2639 + 2508 1 2638 2639 2640 + 2509 1 2641 2642 2643 + 2510 1 2642 2643 2644 + 2511 1 2643 2644 2645 + 2512 1 2644 2645 2646 + 2513 1 2645 2646 2647 + 2514 1 2646 2647 2648 + 2515 1 2647 2648 2649 + 2516 1 2648 2649 2650 + 2517 1 2649 2650 2651 + 2518 1 2650 2651 2652 + 2519 1 2651 2652 2653 + 2520 1 2652 2653 2654 + 2521 1 2653 2654 2655 + 2522 1 2654 2655 2656 + 2523 1 2655 2656 2657 + 2524 1 2656 2657 2658 + 2525 1 2657 2658 2659 + 2526 1 2658 2659 2660 + 2527 1 2659 2660 2661 + 2528 1 2660 2661 2662 + 2529 1 2661 2662 2663 + 2530 1 2662 2663 2664 + 2531 1 2663 2664 2665 + 2532 1 2664 2665 2666 + 2533 1 2665 2666 2667 + 2534 1 2666 2667 2668 + 2535 1 2667 2668 2669 + 2536 1 2668 2669 2670 + 2537 1 2669 2670 2671 + 2538 1 2670 2671 2672 + 2539 1 2671 2672 2673 + 2540 1 2672 2673 2674 + 2541 1 2673 2674 2675 + 2542 1 2674 2675 2676 + 2543 1 2675 2676 2677 + 2544 1 2676 2677 2678 + 2545 1 2677 2678 2679 + 2546 1 2678 2679 2680 + 2547 1 2681 2682 2683 + 2548 1 2682 2683 2684 + 2549 1 2683 2684 2685 + 2550 1 2684 2685 2686 + 2551 1 2685 2686 2687 + 2552 1 2686 2687 2688 + 2553 1 2687 2688 2689 + 2554 1 2688 2689 2690 + 2555 1 2689 2690 2691 + 2556 1 2690 2691 2692 + 2557 1 2691 2692 2693 + 2558 1 2692 2693 2694 + 2559 1 2693 2694 2695 + 2560 1 2694 2695 2696 + 2561 1 2695 2696 2697 + 2562 1 2696 2697 2698 + 2563 1 2697 2698 2699 + 2564 1 2698 2699 2700 + 2565 1 2699 2700 2701 + 2566 1 2700 2701 2702 + 2567 1 2701 2702 2703 + 2568 1 2702 2703 2704 + 2569 1 2703 2704 2705 + 2570 1 2704 2705 2706 + 2571 1 2705 2706 2707 + 2572 1 2706 2707 2708 + 2573 1 2707 2708 2709 + 2574 1 2708 2709 2710 + 2575 1 2709 2710 2711 + 2576 1 2710 2711 2712 + 2577 1 2711 2712 2713 + 2578 1 2712 2713 2714 + 2579 1 2713 2714 2715 + 2580 1 2714 2715 2716 + 2581 1 2715 2716 2717 + 2582 1 2716 2717 2718 + 2583 1 2717 2718 2719 + 2584 1 2718 2719 2720 + 2585 1 2721 2722 2723 + 2586 1 2722 2723 2724 + 2587 1 2723 2724 2725 + 2588 1 2724 2725 2726 + 2589 1 2725 2726 2727 + 2590 1 2726 2727 2728 + 2591 1 2727 2728 2729 + 2592 1 2728 2729 2730 + 2593 1 2729 2730 2731 + 2594 1 2730 2731 2732 + 2595 1 2731 2732 2733 + 2596 1 2732 2733 2734 + 2597 1 2733 2734 2735 + 2598 1 2734 2735 2736 + 2599 1 2735 2736 2737 + 2600 1 2736 2737 2738 + 2601 1 2737 2738 2739 + 2602 1 2738 2739 2740 + 2603 1 2739 2740 2741 + 2604 1 2740 2741 2742 + 2605 1 2741 2742 2743 + 2606 1 2742 2743 2744 + 2607 1 2743 2744 2745 + 2608 1 2744 2745 2746 + 2609 1 2745 2746 2747 + 2610 1 2746 2747 2748 + 2611 1 2747 2748 2749 + 2612 1 2748 2749 2750 + 2613 1 2749 2750 2751 + 2614 1 2750 2751 2752 + 2615 1 2751 2752 2753 + 2616 1 2752 2753 2754 + 2617 1 2753 2754 2755 + 2618 1 2754 2755 2756 + 2619 1 2755 2756 2757 + 2620 1 2756 2757 2758 + 2621 1 2757 2758 2759 + 2622 1 2758 2759 2760 + 2623 1 2761 2762 2763 + 2624 1 2762 2763 2764 + 2625 1 2763 2764 2765 + 2626 1 2764 2765 2766 + 2627 1 2765 2766 2767 + 2628 1 2766 2767 2768 + 2629 1 2767 2768 2769 + 2630 1 2768 2769 2770 + 2631 1 2769 2770 2771 + 2632 1 2770 2771 2772 + 2633 1 2771 2772 2773 + 2634 1 2772 2773 2774 + 2635 1 2773 2774 2775 + 2636 1 2774 2775 2776 + 2637 1 2775 2776 2777 + 2638 1 2776 2777 2778 + 2639 1 2777 2778 2779 + 2640 1 2778 2779 2780 + 2641 1 2779 2780 2781 + 2642 1 2780 2781 2782 + 2643 1 2781 2782 2783 + 2644 1 2782 2783 2784 + 2645 1 2783 2784 2785 + 2646 1 2784 2785 2786 + 2647 1 2785 2786 2787 + 2648 1 2786 2787 2788 + 2649 1 2787 2788 2789 + 2650 1 2788 2789 2790 + 2651 1 2789 2790 2791 + 2652 1 2790 2791 2792 + 2653 1 2791 2792 2793 + 2654 1 2792 2793 2794 + 2655 1 2793 2794 2795 + 2656 1 2794 2795 2796 + 2657 1 2795 2796 2797 + 2658 1 2796 2797 2798 + 2659 1 2797 2798 2799 + 2660 1 2798 2799 2800 + 2661 1 2801 2802 2803 + 2662 1 2802 2803 2804 + 2663 1 2803 2804 2805 + 2664 1 2804 2805 2806 + 2665 1 2805 2806 2807 + 2666 1 2806 2807 2808 + 2667 1 2807 2808 2809 + 2668 1 2808 2809 2810 + 2669 1 2809 2810 2811 + 2670 1 2810 2811 2812 + 2671 1 2811 2812 2813 + 2672 1 2812 2813 2814 + 2673 1 2813 2814 2815 + 2674 1 2814 2815 2816 + 2675 1 2815 2816 2817 + 2676 1 2816 2817 2818 + 2677 1 2817 2818 2819 + 2678 1 2818 2819 2820 + 2679 1 2819 2820 2821 + 2680 1 2820 2821 2822 + 2681 1 2821 2822 2823 + 2682 1 2822 2823 2824 + 2683 1 2823 2824 2825 + 2684 1 2824 2825 2826 + 2685 1 2825 2826 2827 + 2686 1 2826 2827 2828 + 2687 1 2827 2828 2829 + 2688 1 2828 2829 2830 + 2689 1 2829 2830 2831 + 2690 1 2830 2831 2832 + 2691 1 2831 2832 2833 + 2692 1 2832 2833 2834 + 2693 1 2833 2834 2835 + 2694 1 2834 2835 2836 + 2695 1 2835 2836 2837 + 2696 1 2836 2837 2838 + 2697 1 2837 2838 2839 + 2698 1 2838 2839 2840 + 2699 1 2841 2842 2843 + 2700 1 2842 2843 2844 + 2701 1 2843 2844 2845 + 2702 1 2844 2845 2846 + 2703 1 2845 2846 2847 + 2704 1 2846 2847 2848 + 2705 1 2847 2848 2849 + 2706 1 2848 2849 2850 + 2707 1 2849 2850 2851 + 2708 1 2850 2851 2852 + 2709 1 2851 2852 2853 + 2710 1 2852 2853 2854 + 2711 1 2853 2854 2855 + 2712 1 2854 2855 2856 + 2713 1 2855 2856 2857 + 2714 1 2856 2857 2858 + 2715 1 2857 2858 2859 + 2716 1 2858 2859 2860 + 2717 1 2859 2860 2861 + 2718 1 2860 2861 2862 + 2719 1 2861 2862 2863 + 2720 1 2862 2863 2864 + 2721 1 2863 2864 2865 + 2722 1 2864 2865 2866 + 2723 1 2865 2866 2867 + 2724 1 2866 2867 2868 + 2725 1 2867 2868 2869 + 2726 1 2868 2869 2870 + 2727 1 2869 2870 2871 + 2728 1 2870 2871 2872 + 2729 1 2871 2872 2873 + 2730 1 2872 2873 2874 + 2731 1 2873 2874 2875 + 2732 1 2874 2875 2876 + 2733 1 2875 2876 2877 + 2734 1 2876 2877 2878 + 2735 1 2877 2878 2879 + 2736 1 2878 2879 2880 + 2737 1 2881 2882 2883 + 2738 1 2882 2883 2884 + 2739 1 2883 2884 2885 + 2740 1 2884 2885 2886 + 2741 1 2885 2886 2887 + 2742 1 2886 2887 2888 + 2743 1 2887 2888 2889 + 2744 1 2888 2889 2890 + 2745 1 2889 2890 2891 + 2746 1 2890 2891 2892 + 2747 1 2891 2892 2893 + 2748 1 2892 2893 2894 + 2749 1 2893 2894 2895 + 2750 1 2894 2895 2896 + 2751 1 2895 2896 2897 + 2752 1 2896 2897 2898 + 2753 1 2897 2898 2899 + 2754 1 2898 2899 2900 + 2755 1 2899 2900 2901 + 2756 1 2900 2901 2902 + 2757 1 2901 2902 2903 + 2758 1 2902 2903 2904 + 2759 1 2903 2904 2905 + 2760 1 2904 2905 2906 + 2761 1 2905 2906 2907 + 2762 1 2906 2907 2908 + 2763 1 2907 2908 2909 + 2764 1 2908 2909 2910 + 2765 1 2909 2910 2911 + 2766 1 2910 2911 2912 + 2767 1 2911 2912 2913 + 2768 1 2912 2913 2914 + 2769 1 2913 2914 2915 + 2770 1 2914 2915 2916 + 2771 1 2915 2916 2917 + 2772 1 2916 2917 2918 + 2773 1 2917 2918 2919 + 2774 1 2918 2919 2920 + 2775 1 2921 2922 2923 + 2776 1 2922 2923 2924 + 2777 1 2923 2924 2925 + 2778 1 2924 2925 2926 + 2779 1 2925 2926 2927 + 2780 1 2926 2927 2928 + 2781 1 2927 2928 2929 + 2782 1 2928 2929 2930 + 2783 1 2929 2930 2931 + 2784 1 2930 2931 2932 + 2785 1 2931 2932 2933 + 2786 1 2932 2933 2934 + 2787 1 2933 2934 2935 + 2788 1 2934 2935 2936 + 2789 1 2935 2936 2937 + 2790 1 2936 2937 2938 + 2791 1 2937 2938 2939 + 2792 1 2938 2939 2940 + 2793 1 2939 2940 2941 + 2794 1 2940 2941 2942 + 2795 1 2941 2942 2943 + 2796 1 2942 2943 2944 + 2797 1 2943 2944 2945 + 2798 1 2944 2945 2946 + 2799 1 2945 2946 2947 + 2800 1 2946 2947 2948 + 2801 1 2947 2948 2949 + 2802 1 2948 2949 2950 + 2803 1 2949 2950 2951 + 2804 1 2950 2951 2952 + 2805 1 2951 2952 2953 + 2806 1 2952 2953 2954 + 2807 1 2953 2954 2955 + 2808 1 2954 2955 2956 + 2809 1 2955 2956 2957 + 2810 1 2956 2957 2958 + 2811 1 2957 2958 2959 + 2812 1 2958 2959 2960 + 2813 1 2961 2962 2963 + 2814 1 2962 2963 2964 + 2815 1 2963 2964 2965 + 2816 1 2964 2965 2966 + 2817 1 2965 2966 2967 + 2818 1 2966 2967 2968 + 2819 1 2967 2968 2969 + 2820 1 2968 2969 2970 + 2821 1 2969 2970 2971 + 2822 1 2970 2971 2972 + 2823 1 2971 2972 2973 + 2824 1 2972 2973 2974 + 2825 1 2973 2974 2975 + 2826 1 2974 2975 2976 + 2827 1 2975 2976 2977 + 2828 1 2976 2977 2978 + 2829 1 2977 2978 2979 + 2830 1 2978 2979 2980 + 2831 1 2979 2980 2981 + 2832 1 2980 2981 2982 + 2833 1 2981 2982 2983 + 2834 1 2982 2983 2984 + 2835 1 2983 2984 2985 + 2836 1 2984 2985 2986 + 2837 1 2985 2986 2987 + 2838 1 2986 2987 2988 + 2839 1 2987 2988 2989 + 2840 1 2988 2989 2990 + 2841 1 2989 2990 2991 + 2842 1 2990 2991 2992 + 2843 1 2991 2992 2993 + 2844 1 2992 2993 2994 + 2845 1 2993 2994 2995 + 2846 1 2994 2995 2996 + 2847 1 2995 2996 2997 + 2848 1 2996 2997 2998 + 2849 1 2997 2998 2999 + 2850 1 2998 2999 3000 + 2851 1 3001 3002 3003 + 2852 1 3002 3003 3004 + 2853 1 3003 3004 3005 + 2854 1 3004 3005 3006 + 2855 1 3005 3006 3007 + 2856 1 3006 3007 3008 + 2857 1 3007 3008 3009 + 2858 1 3008 3009 3010 + 2859 1 3009 3010 3011 + 2860 1 3010 3011 3012 + 2861 1 3011 3012 3013 + 2862 1 3012 3013 3014 + 2863 1 3013 3014 3015 + 2864 1 3014 3015 3016 + 2865 1 3015 3016 3017 + 2866 1 3016 3017 3018 + 2867 1 3017 3018 3019 + 2868 1 3018 3019 3020 + 2869 1 3019 3020 3021 + 2870 1 3020 3021 3022 + 2871 1 3021 3022 3023 + 2872 1 3022 3023 3024 + 2873 1 3023 3024 3025 + 2874 1 3024 3025 3026 + 2875 1 3025 3026 3027 + 2876 1 3026 3027 3028 + 2877 1 3027 3028 3029 + 2878 1 3028 3029 3030 + 2879 1 3029 3030 3031 + 2880 1 3030 3031 3032 + 2881 1 3031 3032 3033 + 2882 1 3032 3033 3034 + 2883 1 3033 3034 3035 + 2884 1 3034 3035 3036 + 2885 1 3035 3036 3037 + 2886 1 3036 3037 3038 + 2887 1 3037 3038 3039 + 2888 1 3038 3039 3040 + 2889 1 3041 3042 3043 + 2890 1 3042 3043 3044 + 2891 1 3043 3044 3045 + 2892 1 3044 3045 3046 + 2893 1 3045 3046 3047 + 2894 1 3046 3047 3048 + 2895 1 3047 3048 3049 + 2896 1 3048 3049 3050 + 2897 1 3049 3050 3051 + 2898 1 3050 3051 3052 + 2899 1 3051 3052 3053 + 2900 1 3052 3053 3054 + 2901 1 3053 3054 3055 + 2902 1 3054 3055 3056 + 2903 1 3055 3056 3057 + 2904 1 3056 3057 3058 + 2905 1 3057 3058 3059 + 2906 1 3058 3059 3060 + 2907 1 3059 3060 3061 + 2908 1 3060 3061 3062 + 2909 1 3061 3062 3063 + 2910 1 3062 3063 3064 + 2911 1 3063 3064 3065 + 2912 1 3064 3065 3066 + 2913 1 3065 3066 3067 + 2914 1 3066 3067 3068 + 2915 1 3067 3068 3069 + 2916 1 3068 3069 3070 + 2917 1 3069 3070 3071 + 2918 1 3070 3071 3072 + 2919 1 3071 3072 3073 + 2920 1 3072 3073 3074 + 2921 1 3073 3074 3075 + 2922 1 3074 3075 3076 + 2923 1 3075 3076 3077 + 2924 1 3076 3077 3078 + 2925 1 3077 3078 3079 + 2926 1 3078 3079 3080 + 2927 1 3081 3082 3083 + 2928 1 3082 3083 3084 + 2929 1 3083 3084 3085 + 2930 1 3084 3085 3086 + 2931 1 3085 3086 3087 + 2932 1 3086 3087 3088 + 2933 1 3087 3088 3089 + 2934 1 3088 3089 3090 + 2935 1 3089 3090 3091 + 2936 1 3090 3091 3092 + 2937 1 3091 3092 3093 + 2938 1 3092 3093 3094 + 2939 1 3093 3094 3095 + 2940 1 3094 3095 3096 + 2941 1 3095 3096 3097 + 2942 1 3096 3097 3098 + 2943 1 3097 3098 3099 + 2944 1 3098 3099 3100 + 2945 1 3099 3100 3101 + 2946 1 3100 3101 3102 + 2947 1 3101 3102 3103 + 2948 1 3102 3103 3104 + 2949 1 3103 3104 3105 + 2950 1 3104 3105 3106 + 2951 1 3105 3106 3107 + 2952 1 3106 3107 3108 + 2953 1 3107 3108 3109 + 2954 1 3108 3109 3110 + 2955 1 3109 3110 3111 + 2956 1 3110 3111 3112 + 2957 1 3111 3112 3113 + 2958 1 3112 3113 3114 + 2959 1 3113 3114 3115 + 2960 1 3114 3115 3116 + 2961 1 3115 3116 3117 + 2962 1 3116 3117 3118 + 2963 1 3117 3118 3119 + 2964 1 3118 3119 3120 + 2965 1 3121 3122 3123 + 2966 1 3122 3123 3124 + 2967 1 3123 3124 3125 + 2968 1 3124 3125 3126 + 2969 1 3125 3126 3127 + 2970 1 3126 3127 3128 + 2971 1 3127 3128 3129 + 2972 1 3128 3129 3130 + 2973 1 3129 3130 3131 + 2974 1 3130 3131 3132 + 2975 1 3131 3132 3133 + 2976 1 3132 3133 3134 + 2977 1 3133 3134 3135 + 2978 1 3134 3135 3136 + 2979 1 3135 3136 3137 + 2980 1 3136 3137 3138 + 2981 1 3137 3138 3139 + 2982 1 3138 3139 3140 + 2983 1 3139 3140 3141 + 2984 1 3140 3141 3142 + 2985 1 3141 3142 3143 + 2986 1 3142 3143 3144 + 2987 1 3143 3144 3145 + 2988 1 3144 3145 3146 + 2989 1 3145 3146 3147 + 2990 1 3146 3147 3148 + 2991 1 3147 3148 3149 + 2992 1 3148 3149 3150 + 2993 1 3149 3150 3151 + 2994 1 3150 3151 3152 + 2995 1 3151 3152 3153 + 2996 1 3152 3153 3154 + 2997 1 3153 3154 3155 + 2998 1 3154 3155 3156 + 2999 1 3155 3156 3157 + 3000 1 3156 3157 3158 + 3001 1 3157 3158 3159 + 3002 1 3158 3159 3160 + 3003 1 3161 3162 3163 + 3004 1 3162 3163 3164 + 3005 1 3163 3164 3165 + 3006 1 3164 3165 3166 + 3007 1 3165 3166 3167 + 3008 1 3166 3167 3168 + 3009 1 3167 3168 3169 + 3010 1 3168 3169 3170 + 3011 1 3169 3170 3171 + 3012 1 3170 3171 3172 + 3013 1 3171 3172 3173 + 3014 1 3172 3173 3174 + 3015 1 3173 3174 3175 + 3016 1 3174 3175 3176 + 3017 1 3175 3176 3177 + 3018 1 3176 3177 3178 + 3019 1 3177 3178 3179 + 3020 1 3178 3179 3180 + 3021 1 3179 3180 3181 + 3022 1 3180 3181 3182 + 3023 1 3181 3182 3183 + 3024 1 3182 3183 3184 + 3025 1 3183 3184 3185 + 3026 1 3184 3185 3186 + 3027 1 3185 3186 3187 + 3028 1 3186 3187 3188 + 3029 1 3187 3188 3189 + 3030 1 3188 3189 3190 + 3031 1 3189 3190 3191 + 3032 1 3190 3191 3192 + 3033 1 3191 3192 3193 + 3034 1 3192 3193 3194 + 3035 1 3193 3194 3195 + 3036 1 3194 3195 3196 + 3037 1 3195 3196 3197 + 3038 1 3196 3197 3198 + 3039 1 3197 3198 3199 + 3040 1 3198 3199 3200 + 3041 1 3201 3202 3203 + 3042 1 3202 3203 3204 + 3043 1 3203 3204 3205 + 3044 1 3204 3205 3206 + 3045 1 3205 3206 3207 + 3046 1 3206 3207 3208 + 3047 1 3207 3208 3209 + 3048 1 3208 3209 3210 + 3049 1 3209 3210 3211 + 3050 1 3210 3211 3212 + 3051 1 3211 3212 3213 + 3052 1 3212 3213 3214 + 3053 1 3213 3214 3215 + 3054 1 3214 3215 3216 + 3055 1 3215 3216 3217 + 3056 1 3216 3217 3218 + 3057 1 3217 3218 3219 + 3058 1 3218 3219 3220 + 3059 1 3219 3220 3221 + 3060 1 3220 3221 3222 + 3061 1 3221 3222 3223 + 3062 1 3222 3223 3224 + 3063 1 3223 3224 3225 + 3064 1 3224 3225 3226 + 3065 1 3225 3226 3227 + 3066 1 3226 3227 3228 + 3067 1 3227 3228 3229 + 3068 1 3228 3229 3230 + 3069 1 3229 3230 3231 + 3070 1 3230 3231 3232 + 3071 1 3231 3232 3233 + 3072 1 3232 3233 3234 + 3073 1 3233 3234 3235 + 3074 1 3234 3235 3236 + 3075 1 3235 3236 3237 + 3076 1 3236 3237 3238 + 3077 1 3237 3238 3239 + 3078 1 3238 3239 3240 + 3079 1 3241 3242 3243 + 3080 1 3242 3243 3244 + 3081 1 3243 3244 3245 + 3082 1 3244 3245 3246 + 3083 1 3245 3246 3247 + 3084 1 3246 3247 3248 + 3085 1 3247 3248 3249 + 3086 1 3248 3249 3250 + 3087 1 3249 3250 3251 + 3088 1 3250 3251 3252 + 3089 1 3251 3252 3253 + 3090 1 3252 3253 3254 + 3091 1 3253 3254 3255 + 3092 1 3254 3255 3256 + 3093 1 3255 3256 3257 + 3094 1 3256 3257 3258 + 3095 1 3257 3258 3259 + 3096 1 3258 3259 3260 + 3097 1 3259 3260 3261 + 3098 1 3260 3261 3262 + 3099 1 3261 3262 3263 + 3100 1 3262 3263 3264 + 3101 1 3263 3264 3265 + 3102 1 3264 3265 3266 + 3103 1 3265 3266 3267 + 3104 1 3266 3267 3268 + 3105 1 3267 3268 3269 + 3106 1 3268 3269 3270 + 3107 1 3269 3270 3271 + 3108 1 3270 3271 3272 + 3109 1 3271 3272 3273 + 3110 1 3272 3273 3274 + 3111 1 3273 3274 3275 + 3112 1 3274 3275 3276 + 3113 1 3275 3276 3277 + 3114 1 3276 3277 3278 + 3115 1 3277 3278 3279 + 3116 1 3278 3279 3280 + 3117 1 3281 3282 3283 + 3118 1 3282 3283 3284 + 3119 1 3283 3284 3285 + 3120 1 3284 3285 3286 + 3121 1 3285 3286 3287 + 3122 1 3286 3287 3288 + 3123 1 3287 3288 3289 + 3124 1 3288 3289 3290 + 3125 1 3289 3290 3291 + 3126 1 3290 3291 3292 + 3127 1 3291 3292 3293 + 3128 1 3292 3293 3294 + 3129 1 3293 3294 3295 + 3130 1 3294 3295 3296 + 3131 1 3295 3296 3297 + 3132 1 3296 3297 3298 + 3133 1 3297 3298 3299 + 3134 1 3298 3299 3300 + 3135 1 3299 3300 3301 + 3136 1 3300 3301 3302 + 3137 1 3301 3302 3303 + 3138 1 3302 3303 3304 + 3139 1 3303 3304 3305 + 3140 1 3304 3305 3306 + 3141 1 3305 3306 3307 + 3142 1 3306 3307 3308 + 3143 1 3307 3308 3309 + 3144 1 3308 3309 3310 + 3145 1 3309 3310 3311 + 3146 1 3310 3311 3312 + 3147 1 3311 3312 3313 + 3148 1 3312 3313 3314 + 3149 1 3313 3314 3315 + 3150 1 3314 3315 3316 + 3151 1 3315 3316 3317 + 3152 1 3316 3317 3318 + 3153 1 3317 3318 3319 + 3154 1 3318 3319 3320 + 3155 1 3321 3322 3323 + 3156 1 3322 3323 3324 + 3157 1 3323 3324 3325 + 3158 1 3324 3325 3326 + 3159 1 3325 3326 3327 + 3160 1 3326 3327 3328 + 3161 1 3327 3328 3329 + 3162 1 3328 3329 3330 + 3163 1 3329 3330 3331 + 3164 1 3330 3331 3332 + 3165 1 3331 3332 3333 + 3166 1 3332 3333 3334 + 3167 1 3333 3334 3335 + 3168 1 3334 3335 3336 + 3169 1 3335 3336 3337 + 3170 1 3336 3337 3338 + 3171 1 3337 3338 3339 + 3172 1 3338 3339 3340 + 3173 1 3339 3340 3341 + 3174 1 3340 3341 3342 + 3175 1 3341 3342 3343 + 3176 1 3342 3343 3344 + 3177 1 3343 3344 3345 + 3178 1 3344 3345 3346 + 3179 1 3345 3346 3347 + 3180 1 3346 3347 3348 + 3181 1 3347 3348 3349 + 3182 1 3348 3349 3350 + 3183 1 3349 3350 3351 + 3184 1 3350 3351 3352 + 3185 1 3351 3352 3353 + 3186 1 3352 3353 3354 + 3187 1 3353 3354 3355 + 3188 1 3354 3355 3356 + 3189 1 3355 3356 3357 + 3190 1 3356 3357 3358 + 3191 1 3357 3358 3359 + 3192 1 3358 3359 3360 + 3193 1 3361 3362 3363 + 3194 1 3362 3363 3364 + 3195 1 3363 3364 3365 + 3196 1 3364 3365 3366 + 3197 1 3365 3366 3367 + 3198 1 3366 3367 3368 + 3199 1 3367 3368 3369 + 3200 1 3368 3369 3370 + 3201 1 3369 3370 3371 + 3202 1 3370 3371 3372 + 3203 1 3371 3372 3373 + 3204 1 3372 3373 3374 + 3205 1 3373 3374 3375 + 3206 1 3374 3375 3376 + 3207 1 3375 3376 3377 + 3208 1 3376 3377 3378 + 3209 1 3377 3378 3379 + 3210 1 3378 3379 3380 + 3211 1 3379 3380 3381 + 3212 1 3380 3381 3382 + 3213 1 3381 3382 3383 + 3214 1 3382 3383 3384 + 3215 1 3383 3384 3385 + 3216 1 3384 3385 3386 + 3217 1 3385 3386 3387 + 3218 1 3386 3387 3388 + 3219 1 3387 3388 3389 + 3220 1 3388 3389 3390 + 3221 1 3389 3390 3391 + 3222 1 3390 3391 3392 + 3223 1 3391 3392 3393 + 3224 1 3392 3393 3394 + 3225 1 3393 3394 3395 + 3226 1 3394 3395 3396 + 3227 1 3395 3396 3397 + 3228 1 3396 3397 3398 + 3229 1 3397 3398 3399 + 3230 1 3398 3399 3400 + 3231 1 3401 3402 3403 + 3232 1 3402 3403 3404 + 3233 1 3403 3404 3405 + 3234 1 3404 3405 3406 + 3235 1 3405 3406 3407 + 3236 1 3406 3407 3408 + 3237 1 3407 3408 3409 + 3238 1 3408 3409 3410 + 3239 1 3409 3410 3411 + 3240 1 3410 3411 3412 + 3241 1 3411 3412 3413 + 3242 1 3412 3413 3414 + 3243 1 3413 3414 3415 + 3244 1 3414 3415 3416 + 3245 1 3415 3416 3417 + 3246 1 3416 3417 3418 + 3247 1 3417 3418 3419 + 3248 1 3418 3419 3420 + 3249 1 3419 3420 3421 + 3250 1 3420 3421 3422 + 3251 1 3421 3422 3423 + 3252 1 3422 3423 3424 + 3253 1 3423 3424 3425 + 3254 1 3424 3425 3426 + 3255 1 3425 3426 3427 + 3256 1 3426 3427 3428 + 3257 1 3427 3428 3429 + 3258 1 3428 3429 3430 + 3259 1 3429 3430 3431 + 3260 1 3430 3431 3432 + 3261 1 3431 3432 3433 + 3262 1 3432 3433 3434 + 3263 1 3433 3434 3435 + 3264 1 3434 3435 3436 + 3265 1 3435 3436 3437 + 3266 1 3436 3437 3438 + 3267 1 3437 3438 3439 + 3268 1 3438 3439 3440 + 3269 1 3441 3442 3443 + 3270 1 3442 3443 3444 + 3271 1 3443 3444 3445 + 3272 1 3444 3445 3446 + 3273 1 3445 3446 3447 + 3274 1 3446 3447 3448 + 3275 1 3447 3448 3449 + 3276 1 3448 3449 3450 + 3277 1 3449 3450 3451 + 3278 1 3450 3451 3452 + 3279 1 3451 3452 3453 + 3280 1 3452 3453 3454 + 3281 1 3453 3454 3455 + 3282 1 3454 3455 3456 + 3283 1 3455 3456 3457 + 3284 1 3456 3457 3458 + 3285 1 3457 3458 3459 + 3286 1 3458 3459 3460 + 3287 1 3459 3460 3461 + 3288 1 3460 3461 3462 + 3289 1 3461 3462 3463 + 3290 1 3462 3463 3464 + 3291 1 3463 3464 3465 + 3292 1 3464 3465 3466 + 3293 1 3465 3466 3467 + 3294 1 3466 3467 3468 + 3295 1 3467 3468 3469 + 3296 1 3468 3469 3470 + 3297 1 3469 3470 3471 + 3298 1 3470 3471 3472 + 3299 1 3471 3472 3473 + 3300 1 3472 3473 3474 + 3301 1 3473 3474 3475 + 3302 1 3474 3475 3476 + 3303 1 3475 3476 3477 + 3304 1 3476 3477 3478 + 3305 1 3477 3478 3479 + 3306 1 3478 3479 3480 + 3307 1 3481 3482 3483 + 3308 1 3482 3483 3484 + 3309 1 3483 3484 3485 + 3310 1 3484 3485 3486 + 3311 1 3485 3486 3487 + 3312 1 3486 3487 3488 + 3313 1 3487 3488 3489 + 3314 1 3488 3489 3490 + 3315 1 3489 3490 3491 + 3316 1 3490 3491 3492 + 3317 1 3491 3492 3493 + 3318 1 3492 3493 3494 + 3319 1 3493 3494 3495 + 3320 1 3494 3495 3496 + 3321 1 3495 3496 3497 + 3322 1 3496 3497 3498 + 3323 1 3497 3498 3499 + 3324 1 3498 3499 3500 + 3325 1 3499 3500 3501 + 3326 1 3500 3501 3502 + 3327 1 3501 3502 3503 + 3328 1 3502 3503 3504 + 3329 1 3503 3504 3505 + 3330 1 3504 3505 3506 + 3331 1 3505 3506 3507 + 3332 1 3506 3507 3508 + 3333 1 3507 3508 3509 + 3334 1 3508 3509 3510 + 3335 1 3509 3510 3511 + 3336 1 3510 3511 3512 + 3337 1 3511 3512 3513 + 3338 1 3512 3513 3514 + 3339 1 3513 3514 3515 + 3340 1 3514 3515 3516 + 3341 1 3515 3516 3517 + 3342 1 3516 3517 3518 + 3343 1 3517 3518 3519 + 3344 1 3518 3519 3520 + 3345 1 3521 3522 3523 + 3346 1 3522 3523 3524 + 3347 1 3523 3524 3525 + 3348 1 3524 3525 3526 + 3349 1 3525 3526 3527 + 3350 1 3526 3527 3528 + 3351 1 3527 3528 3529 + 3352 1 3528 3529 3530 + 3353 1 3529 3530 3531 + 3354 1 3530 3531 3532 + 3355 1 3531 3532 3533 + 3356 1 3532 3533 3534 + 3357 1 3533 3534 3535 + 3358 1 3534 3535 3536 + 3359 1 3535 3536 3537 + 3360 1 3536 3537 3538 + 3361 1 3537 3538 3539 + 3362 1 3538 3539 3540 + 3363 1 3539 3540 3541 + 3364 1 3540 3541 3542 + 3365 1 3541 3542 3543 + 3366 1 3542 3543 3544 + 3367 1 3543 3544 3545 + 3368 1 3544 3545 3546 + 3369 1 3545 3546 3547 + 3370 1 3546 3547 3548 + 3371 1 3547 3548 3549 + 3372 1 3548 3549 3550 + 3373 1 3549 3550 3551 + 3374 1 3550 3551 3552 + 3375 1 3551 3552 3553 + 3376 1 3552 3553 3554 + 3377 1 3553 3554 3555 + 3378 1 3554 3555 3556 + 3379 1 3555 3556 3557 + 3380 1 3556 3557 3558 + 3381 1 3557 3558 3559 + 3382 1 3558 3559 3560 + 3383 1 3561 3562 3563 + 3384 1 3562 3563 3564 + 3385 1 3563 3564 3565 + 3386 1 3564 3565 3566 + 3387 1 3565 3566 3567 + 3388 1 3566 3567 3568 + 3389 1 3567 3568 3569 + 3390 1 3568 3569 3570 + 3391 1 3569 3570 3571 + 3392 1 3570 3571 3572 + 3393 1 3571 3572 3573 + 3394 1 3572 3573 3574 + 3395 1 3573 3574 3575 + 3396 1 3574 3575 3576 + 3397 1 3575 3576 3577 + 3398 1 3576 3577 3578 + 3399 1 3577 3578 3579 + 3400 1 3578 3579 3580 + 3401 1 3579 3580 3581 + 3402 1 3580 3581 3582 + 3403 1 3581 3582 3583 + 3404 1 3582 3583 3584 + 3405 1 3583 3584 3585 + 3406 1 3584 3585 3586 + 3407 1 3585 3586 3587 + 3408 1 3586 3587 3588 + 3409 1 3587 3588 3589 + 3410 1 3588 3589 3590 + 3411 1 3589 3590 3591 + 3412 1 3590 3591 3592 + 3413 1 3591 3592 3593 + 3414 1 3592 3593 3594 + 3415 1 3593 3594 3595 + 3416 1 3594 3595 3596 + 3417 1 3595 3596 3597 + 3418 1 3596 3597 3598 + 3419 1 3597 3598 3599 + 3420 1 3598 3599 3600 + 3421 1 3601 3602 3603 + 3422 1 3602 3603 3604 + 3423 1 3603 3604 3605 + 3424 1 3604 3605 3606 + 3425 1 3605 3606 3607 + 3426 1 3606 3607 3608 + 3427 1 3607 3608 3609 + 3428 1 3608 3609 3610 + 3429 1 3609 3610 3611 + 3430 1 3610 3611 3612 + 3431 1 3611 3612 3613 + 3432 1 3612 3613 3614 + 3433 1 3613 3614 3615 + 3434 1 3614 3615 3616 + 3435 1 3615 3616 3617 + 3436 1 3616 3617 3618 + 3437 1 3617 3618 3619 + 3438 1 3618 3619 3620 + 3439 1 3619 3620 3621 + 3440 1 3620 3621 3622 + 3441 1 3621 3622 3623 + 3442 1 3622 3623 3624 + 3443 1 3623 3624 3625 + 3444 1 3624 3625 3626 + 3445 1 3625 3626 3627 + 3446 1 3626 3627 3628 + 3447 1 3627 3628 3629 + 3448 1 3628 3629 3630 + 3449 1 3629 3630 3631 + 3450 1 3630 3631 3632 + 3451 1 3631 3632 3633 + 3452 1 3632 3633 3634 + 3453 1 3633 3634 3635 + 3454 1 3634 3635 3636 + 3455 1 3635 3636 3637 + 3456 1 3636 3637 3638 + 3457 1 3637 3638 3639 + 3458 1 3638 3639 3640 + 3459 1 3641 3642 3643 + 3460 1 3642 3643 3644 + 3461 1 3643 3644 3645 + 3462 1 3644 3645 3646 + 3463 1 3645 3646 3647 + 3464 1 3646 3647 3648 + 3465 1 3647 3648 3649 + 3466 1 3648 3649 3650 + 3467 1 3649 3650 3651 + 3468 1 3650 3651 3652 + 3469 1 3651 3652 3653 + 3470 1 3652 3653 3654 + 3471 1 3653 3654 3655 + 3472 1 3654 3655 3656 + 3473 1 3655 3656 3657 + 3474 1 3656 3657 3658 + 3475 1 3657 3658 3659 + 3476 1 3658 3659 3660 + 3477 1 3659 3660 3661 + 3478 1 3660 3661 3662 + 3479 1 3661 3662 3663 + 3480 1 3662 3663 3664 + 3481 1 3663 3664 3665 + 3482 1 3664 3665 3666 + 3483 1 3665 3666 3667 + 3484 1 3666 3667 3668 + 3485 1 3667 3668 3669 + 3486 1 3668 3669 3670 + 3487 1 3669 3670 3671 + 3488 1 3670 3671 3672 + 3489 1 3671 3672 3673 + 3490 1 3672 3673 3674 + 3491 1 3673 3674 3675 + 3492 1 3674 3675 3676 + 3493 1 3675 3676 3677 + 3494 1 3676 3677 3678 + 3495 1 3677 3678 3679 + 3496 1 3678 3679 3680 + 3497 1 3681 3682 3683 + 3498 1 3682 3683 3684 + 3499 1 3683 3684 3685 + 3500 1 3684 3685 3686 + 3501 1 3685 3686 3687 + 3502 1 3686 3687 3688 + 3503 1 3687 3688 3689 + 3504 1 3688 3689 3690 + 3505 1 3689 3690 3691 + 3506 1 3690 3691 3692 + 3507 1 3691 3692 3693 + 3508 1 3692 3693 3694 + 3509 1 3693 3694 3695 + 3510 1 3694 3695 3696 + 3511 1 3695 3696 3697 + 3512 1 3696 3697 3698 + 3513 1 3697 3698 3699 + 3514 1 3698 3699 3700 + 3515 1 3699 3700 3701 + 3516 1 3700 3701 3702 + 3517 1 3701 3702 3703 + 3518 1 3702 3703 3704 + 3519 1 3703 3704 3705 + 3520 1 3704 3705 3706 + 3521 1 3705 3706 3707 + 3522 1 3706 3707 3708 + 3523 1 3707 3708 3709 + 3524 1 3708 3709 3710 + 3525 1 3709 3710 3711 + 3526 1 3710 3711 3712 + 3527 1 3711 3712 3713 + 3528 1 3712 3713 3714 + 3529 1 3713 3714 3715 + 3530 1 3714 3715 3716 + 3531 1 3715 3716 3717 + 3532 1 3716 3717 3718 + 3533 1 3717 3718 3719 + 3534 1 3718 3719 3720 + 3535 1 3721 3722 3723 + 3536 1 3722 3723 3724 + 3537 1 3723 3724 3725 + 3538 1 3724 3725 3726 + 3539 1 3725 3726 3727 + 3540 1 3726 3727 3728 + 3541 1 3727 3728 3729 + 3542 1 3728 3729 3730 + 3543 1 3729 3730 3731 + 3544 1 3730 3731 3732 + 3545 1 3731 3732 3733 + 3546 1 3732 3733 3734 + 3547 1 3733 3734 3735 + 3548 1 3734 3735 3736 + 3549 1 3735 3736 3737 + 3550 1 3736 3737 3738 + 3551 1 3737 3738 3739 + 3552 1 3738 3739 3740 + 3553 1 3739 3740 3741 + 3554 1 3740 3741 3742 + 3555 1 3741 3742 3743 + 3556 1 3742 3743 3744 + 3557 1 3743 3744 3745 + 3558 1 3744 3745 3746 + 3559 1 3745 3746 3747 + 3560 1 3746 3747 3748 + 3561 1 3747 3748 3749 + 3562 1 3748 3749 3750 + 3563 1 3749 3750 3751 + 3564 1 3750 3751 3752 + 3565 1 3751 3752 3753 + 3566 1 3752 3753 3754 + 3567 1 3753 3754 3755 + 3568 1 3754 3755 3756 + 3569 1 3755 3756 3757 + 3570 1 3756 3757 3758 + 3571 1 3757 3758 3759 + 3572 1 3758 3759 3760 + 3573 1 3761 3762 3763 + 3574 1 3762 3763 3764 + 3575 1 3763 3764 3765 + 3576 1 3764 3765 3766 + 3577 1 3765 3766 3767 + 3578 1 3766 3767 3768 + 3579 1 3767 3768 3769 + 3580 1 3768 3769 3770 + 3581 1 3769 3770 3771 + 3582 1 3770 3771 3772 + 3583 1 3771 3772 3773 + 3584 1 3772 3773 3774 + 3585 1 3773 3774 3775 + 3586 1 3774 3775 3776 + 3587 1 3775 3776 3777 + 3588 1 3776 3777 3778 + 3589 1 3777 3778 3779 + 3590 1 3778 3779 3780 + 3591 1 3779 3780 3781 + 3592 1 3780 3781 3782 + 3593 1 3781 3782 3783 + 3594 1 3782 3783 3784 + 3595 1 3783 3784 3785 + 3596 1 3784 3785 3786 + 3597 1 3785 3786 3787 + 3598 1 3786 3787 3788 + 3599 1 3787 3788 3789 + 3600 1 3788 3789 3790 + 3601 1 3789 3790 3791 + 3602 1 3790 3791 3792 + 3603 1 3791 3792 3793 + 3604 1 3792 3793 3794 + 3605 1 3793 3794 3795 + 3606 1 3794 3795 3796 + 3607 1 3795 3796 3797 + 3608 1 3796 3797 3798 + 3609 1 3797 3798 3799 + 3610 1 3798 3799 3800 + 3611 1 3801 3802 3803 + 3612 1 3802 3803 3804 + 3613 1 3803 3804 3805 + 3614 1 3804 3805 3806 + 3615 1 3805 3806 3807 + 3616 1 3806 3807 3808 + 3617 1 3807 3808 3809 + 3618 1 3808 3809 3810 + 3619 1 3809 3810 3811 + 3620 1 3810 3811 3812 + 3621 1 3811 3812 3813 + 3622 1 3812 3813 3814 + 3623 1 3813 3814 3815 + 3624 1 3814 3815 3816 + 3625 1 3815 3816 3817 + 3626 1 3816 3817 3818 + 3627 1 3817 3818 3819 + 3628 1 3818 3819 3820 + 3629 1 3819 3820 3821 + 3630 1 3820 3821 3822 + 3631 1 3821 3822 3823 + 3632 1 3822 3823 3824 + 3633 1 3823 3824 3825 + 3634 1 3824 3825 3826 + 3635 1 3825 3826 3827 + 3636 1 3826 3827 3828 + 3637 1 3827 3828 3829 + 3638 1 3828 3829 3830 + 3639 1 3829 3830 3831 + 3640 1 3830 3831 3832 + 3641 1 3831 3832 3833 + 3642 1 3832 3833 3834 + 3643 1 3833 3834 3835 + 3644 1 3834 3835 3836 + 3645 1 3835 3836 3837 + 3646 1 3836 3837 3838 + 3647 1 3837 3838 3839 + 3648 1 3838 3839 3840 + 3649 1 3841 3842 3843 + 3650 1 3842 3843 3844 + 3651 1 3843 3844 3845 + 3652 1 3844 3845 3846 + 3653 1 3845 3846 3847 + 3654 1 3846 3847 3848 + 3655 1 3847 3848 3849 + 3656 1 3848 3849 3850 + 3657 1 3849 3850 3851 + 3658 1 3850 3851 3852 + 3659 1 3851 3852 3853 + 3660 1 3852 3853 3854 + 3661 1 3853 3854 3855 + 3662 1 3854 3855 3856 + 3663 1 3855 3856 3857 + 3664 1 3856 3857 3858 + 3665 1 3857 3858 3859 + 3666 1 3858 3859 3860 + 3667 1 3859 3860 3861 + 3668 1 3860 3861 3862 + 3669 1 3861 3862 3863 + 3670 1 3862 3863 3864 + 3671 1 3863 3864 3865 + 3672 1 3864 3865 3866 + 3673 1 3865 3866 3867 + 3674 1 3866 3867 3868 + 3675 1 3867 3868 3869 + 3676 1 3868 3869 3870 + 3677 1 3869 3870 3871 + 3678 1 3870 3871 3872 + 3679 1 3871 3872 3873 + 3680 1 3872 3873 3874 + 3681 1 3873 3874 3875 + 3682 1 3874 3875 3876 + 3683 1 3875 3876 3877 + 3684 1 3876 3877 3878 + 3685 1 3877 3878 3879 + 3686 1 3878 3879 3880 + 3687 1 3881 3882 3883 + 3688 1 3882 3883 3884 + 3689 1 3883 3884 3885 + 3690 1 3884 3885 3886 + 3691 1 3885 3886 3887 + 3692 1 3886 3887 3888 + 3693 1 3887 3888 3889 + 3694 1 3888 3889 3890 + 3695 1 3889 3890 3891 + 3696 1 3890 3891 3892 + 3697 1 3891 3892 3893 + 3698 1 3892 3893 3894 + 3699 1 3893 3894 3895 + 3700 1 3894 3895 3896 + 3701 1 3895 3896 3897 + 3702 1 3896 3897 3898 + 3703 1 3897 3898 3899 + 3704 1 3898 3899 3900 + 3705 1 3899 3900 3901 + 3706 1 3900 3901 3902 + 3707 1 3901 3902 3903 + 3708 1 3902 3903 3904 + 3709 1 3903 3904 3905 + 3710 1 3904 3905 3906 + 3711 1 3905 3906 3907 + 3712 1 3906 3907 3908 + 3713 1 3907 3908 3909 + 3714 1 3908 3909 3910 + 3715 1 3909 3910 3911 + 3716 1 3910 3911 3912 + 3717 1 3911 3912 3913 + 3718 1 3912 3913 3914 + 3719 1 3913 3914 3915 + 3720 1 3914 3915 3916 + 3721 1 3915 3916 3917 + 3722 1 3916 3917 3918 + 3723 1 3917 3918 3919 + 3724 1 3918 3919 3920 + 3725 1 3921 3922 3923 + 3726 1 3922 3923 3924 + 3727 1 3923 3924 3925 + 3728 1 3924 3925 3926 + 3729 1 3925 3926 3927 + 3730 1 3926 3927 3928 + 3731 1 3927 3928 3929 + 3732 1 3928 3929 3930 + 3733 1 3929 3930 3931 + 3734 1 3930 3931 3932 + 3735 1 3931 3932 3933 + 3736 1 3932 3933 3934 + 3737 1 3933 3934 3935 + 3738 1 3934 3935 3936 + 3739 1 3935 3936 3937 + 3740 1 3936 3937 3938 + 3741 1 3937 3938 3939 + 3742 1 3938 3939 3940 + 3743 1 3939 3940 3941 + 3744 1 3940 3941 3942 + 3745 1 3941 3942 3943 + 3746 1 3942 3943 3944 + 3747 1 3943 3944 3945 + 3748 1 3944 3945 3946 + 3749 1 3945 3946 3947 + 3750 1 3946 3947 3948 + 3751 1 3947 3948 3949 + 3752 1 3948 3949 3950 + 3753 1 3949 3950 3951 + 3754 1 3950 3951 3952 + 3755 1 3951 3952 3953 + 3756 1 3952 3953 3954 + 3757 1 3953 3954 3955 + 3758 1 3954 3955 3956 + 3759 1 3955 3956 3957 + 3760 1 3956 3957 3958 + 3761 1 3957 3958 3959 + 3762 1 3958 3959 3960 + 3763 1 3961 3962 3963 + 3764 1 3962 3963 3964 + 3765 1 3963 3964 3965 + 3766 1 3964 3965 3966 + 3767 1 3965 3966 3967 + 3768 1 3966 3967 3968 + 3769 1 3967 3968 3969 + 3770 1 3968 3969 3970 + 3771 1 3969 3970 3971 + 3772 1 3970 3971 3972 + 3773 1 3971 3972 3973 + 3774 1 3972 3973 3974 + 3775 1 3973 3974 3975 + 3776 1 3974 3975 3976 + 3777 1 3975 3976 3977 + 3778 1 3976 3977 3978 + 3779 1 3977 3978 3979 + 3780 1 3978 3979 3980 + 3781 1 3979 3980 3981 + 3782 1 3980 3981 3982 + 3783 1 3981 3982 3983 + 3784 1 3982 3983 3984 + 3785 1 3983 3984 3985 + 3786 1 3984 3985 3986 + 3787 1 3985 3986 3987 + 3788 1 3986 3987 3988 + 3789 1 3987 3988 3989 + 3790 1 3988 3989 3990 + 3791 1 3989 3990 3991 + 3792 1 3990 3991 3992 + 3793 1 3991 3992 3993 + 3794 1 3992 3993 3994 + 3795 1 3993 3994 3995 + 3796 1 3994 3995 3996 + 3797 1 3995 3996 3997 + 3798 1 3996 3997 3998 + 3799 1 3997 3998 3999 + 3800 1 3998 3999 4000 diff --git a/examples/gcmc/data.spce b/examples/mc/data.spce similarity index 100% rename from examples/gcmc/data.spce rename to examples/mc/data.spce diff --git a/examples/gcmc/data.widom.lj b/examples/mc/data.widom.lj similarity index 100% rename from examples/gcmc/data.widom.lj rename to examples/mc/data.widom.lj diff --git a/examples/gcmc/in.gcmc.co2 b/examples/mc/in.gcmc.co2 similarity index 100% rename from examples/gcmc/in.gcmc.co2 rename to examples/mc/in.gcmc.co2 diff --git a/examples/gcmc/in.gcmc.h2o b/examples/mc/in.gcmc.h2o similarity index 100% rename from examples/gcmc/in.gcmc.h2o rename to examples/mc/in.gcmc.h2o diff --git a/examples/gcmc/in.gcmc.lj b/examples/mc/in.gcmc.lj similarity index 100% rename from examples/gcmc/in.gcmc.lj rename to examples/mc/in.gcmc.lj diff --git a/examples/mc/in.mixed b/examples/mc/in.mixed new file mode 100644 index 0000000000..318bb1312c --- /dev/null +++ b/examples/mc/in.mixed @@ -0,0 +1,44 @@ +# test script for fix mol/swap +# initial system is 50/50 chains of type 1 and type 2 +# b/c epsilon12 is set to 1.02 (weakly same as 1/1 or 1/2) the +# system will stay in equilibrium as a mix of both chain types +# fix mol/swap helps this happen quickly +# see the last 2 columns of thermo output for counts of 2 chain types + +units lj +atom_style angle +neighbor 0.36 bin +neigh_modify delay 0 + +pair_style lj/cut 1.1224620483 +bond_style fene +angle_style cosine +special_bonds lj 0.0 1.0 1.0 + +read_data data.bead + +pair_coeff * * 1.0 1.0 1.1224620483 +pair_coeff 1 2 1.02 1.0 1.1224620483 +bond_coeff 1 30.0 1.5 1.0 1.0 +angle_coeff 1 1.500 +pair_modify shift yes + +variable vt1 atom type==1 +variable vt2 atom type==2 +group g1 dynamic all var vt1 every 100 +group g2 dynamic all var vt2 every 100 +variable count1 equal count(g1) +variable count2 equal count(g2) + +timestep 0.010 + +fix 1 all langevin 1.0 1.0 100.0 702547 +fix 2 all nve +fix 3 all mol/swap 100 1 1 2 482794 1.0 + +compute p all pressure thermo_temp +thermo 1000 +thermo_style custom step temp etotal press f_3[1] f_3[2] v_count1 v_count2 + +run 50000 + diff --git a/examples/mc/in.pure b/examples/mc/in.pure new file mode 100644 index 0000000000..b12d2f7891 --- /dev/null +++ b/examples/mc/in.pure @@ -0,0 +1,44 @@ +# test script for fix mol/swap +# initial system is 50/50 chains of type 1 and type 2 +# b/c epsilon12 is set to 1.1 (stronger than 1/1 or 2/2) the +# system will go to equilibrium as mostly one type or the other +# fix mol/swap helps this happen quickly +# see the last 2 columns of thermo output for counts of 2 chain types + +units lj +atom_style angle +neighbor 0.36 bin +neigh_modify delay 0 + +pair_style lj/cut 1.1224620483 +bond_style fene +angle_style cosine +special_bonds lj 0.0 1.0 1.0 + +read_data data.bead + +pair_coeff * * 1.0 1.0 1.1224620483 +pair_coeff 1 2 1.1 1.0 1.1224620483 +bond_coeff 1 30.0 1.5 1.0 1.0 +angle_coeff 1 1.500 +pair_modify shift yes + +variable vt1 atom type==1 +variable vt2 atom type==2 +group g1 dynamic all var vt1 every 100 +group g2 dynamic all var vt2 every 100 +variable count1 equal count(g1) +variable count2 equal count(g2) + +timestep 0.010 + +fix 1 all langevin 1.0 1.0 100.0 702547 +fix 2 all nve +fix 3 all mol/swap 100 1 1 2 482794 1.0 + +compute p all pressure thermo_temp +thermo 1000 +thermo_style custom step temp etotal press f_3[1] f_3[2] v_count1 v_count2 + +run 50000 + diff --git a/examples/gcmc/in.widom.lj b/examples/mc/in.widom.lj similarity index 100% rename from examples/gcmc/in.widom.lj rename to examples/mc/in.widom.lj diff --git a/examples/gcmc/in.widom.spce b/examples/mc/in.widom.spce similarity index 100% rename from examples/gcmc/in.widom.spce rename to examples/mc/in.widom.spce diff --git a/examples/mc/log.13Oct21.mixed.g++.4 b/examples/mc/log.13Oct21.mixed.g++.4 new file mode 100644 index 0000000000..3602a17827 --- /dev/null +++ b/examples/mc/log.13Oct21.mixed.g++.4 @@ -0,0 +1,164 @@ +LAMMPS (29 Sep 2021) +# test script for fix mol/swap +# initial system is 50/50 chains of type 1 and type 2 +# b/c epsilon12 is set to 1.02 (weakly same as 1/1 or 1/2) the +# system will stay in equilibrium as a mix of both chain types +# fix mol/swap helps this happen quickly +# see the last 2 columns of thermo output for counts of 2 chain types + +units lj +atom_style angle +neighbor 0.36 bin +neigh_modify delay 0 + +pair_style lj/cut 1.1224620483 +bond_style fene +angle_style cosine +special_bonds lj 0.0 1.0 1.0 + +read_data data.bead +Reading data file ... + orthogonal box = (-8.2115700 -8.2115700 -8.2115700) to (8.2115700 8.2115700 8.2115700) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 4000 atoms + scanning bonds ... + 1 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3900 bonds + reading angles ... + 3800 angles +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.001 seconds + read_data CPU = 0.028 seconds + +pair_coeff * * 1.0 1.0 1.1224620483 +pair_coeff 1 2 1.02 1.0 1.1224620483 +bond_coeff 1 30.0 1.5 1.0 1.0 +angle_coeff 1 1.500 +pair_modify shift yes + +variable vt1 atom type==1 +variable vt2 atom type==2 +group g1 dynamic all var vt1 every 100 +dynamic group g1 defined +group g2 dynamic all var vt2 every 100 +dynamic group g2 defined +variable count1 equal count(g1) +variable count2 equal count(g2) + +timestep 0.010 + +fix 1 all langevin 1.0 1.0 100.0 702547 +fix 2 all nve +fix 3 all mol/swap 100 1 1 2 482794 1.0 + +compute p all pressure thermo_temp +thermo 1000 +thermo_style custom step temp etotal press f_3[1] f_3[2] v_count1 v_count2 + +run 50000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.482462 + ghost atom cutoff = 1.482462 + binsize = 0.74123102, bins = 23 23 23 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +WARNING: Communication cutoff 1.4824620483 is shorter than a bond length based estimate of 1.815. This may lead to errors. (../comm.cpp:728) +Per MPI rank memory allocation (min/avg/max) = 5.313 | 5.314 | 5.314 Mbytes +Step Temp TotEng Press f_3[1] f_3[2] v_count1 v_count2 + 0 0 21.451627 5.079399 0 0 2000 2000 + 1000 0.49011138 21.59359 4.2337989 10 10 2000 2000 + 2000 0.55288866 21.724374 4.4596786 20 20 2080 1920 + 3000 0.59299724 21.844178 4.6112243 30 29 2280 1720 + 4000 0.64746348 21.964318 4.9463669 40 39 2280 1720 + 5000 0.67853936 22.053147 5.1950218 50 48 2320 1680 + 6000 0.70751144 22.147453 5.0636869 60 58 2240 1760 + 7000 0.73570064 22.233705 5.4872622 70 68 2160 1840 + 8000 0.7677554 22.312938 5.4283736 80 77 2360 1640 + 9000 0.78493237 22.383155 5.8547233 90 87 2440 1560 + 10000 0.80634514 22.449402 5.8785731 100 96 2400 1600 + 11000 0.82563194 22.475286 5.8193738 110 104 2400 1600 + 12000 0.81684024 22.527492 6.0323967 120 114 2320 1680 + 13000 0.84497155 22.567888 6.0488755 130 122 2240 1760 + 14000 0.85452242 22.606908 6.1983634 140 132 2080 1920 + 15000 0.88109242 22.654336 6.1408279 150 141 1960 2040 + 16000 0.88925915 22.707597 6.1560975 160 150 2000 2000 + 17000 0.91598439 22.762791 6.1071728 170 160 2000 2000 + 18000 0.92453211 22.778304 6.3330693 180 170 2240 1760 + 19000 0.92839551 22.797316 6.2917909 190 180 2000 2000 + 20000 0.93054033 22.819289 6.091701 200 189 2200 1800 + 21000 0.93955351 22.844135 6.5833013 210 198 2000 2000 + 22000 0.94454858 22.856272 6.5661753 220 207 2200 1800 + 23000 0.95446407 22.878735 6.5957294 230 216 2160 1840 + 24000 0.94748257 22.894539 6.6187447 240 226 1920 2080 + 25000 0.95732202 22.912292 6.4795471 250 236 1680 2320 + 26000 0.96970172 22.908988 6.537366 260 245 1720 2280 + 27000 0.96032166 22.924899 6.6238248 270 255 1960 2040 + 28000 0.96197769 22.9358 6.8926097 280 264 1920 2080 + 29000 0.98745595 22.964694 6.5839025 290 271 2040 1960 + 30000 0.99264869 22.947884 6.3893499 300 280 1920 2080 + 31000 0.96953069 22.957927 6.6616047 310 289 1800 2200 + 32000 0.99955117 22.963979 6.5958456 320 298 1680 2320 + 33000 0.97090103 22.969029 6.9087296 330 307 1800 2200 + 34000 0.99818457 22.988477 6.6471994 340 316 1920 2080 + 35000 0.9965288 22.992883 6.9691785 350 325 2040 1960 + 36000 0.99533174 22.983774 6.6585089 360 334 2000 2000 + 37000 0.98819278 22.995387 6.618802 370 344 2080 1920 + 38000 0.99598576 22.991892 6.7536669 380 354 2080 1920 + 39000 0.99312702 22.989239 6.4028165 390 364 2080 1920 + 40000 1.0035821 23.001944 6.9307671 400 374 1920 2080 + 41000 0.99914733 23.00134 6.6251677 410 383 1880 2120 + 42000 0.98054536 22.981781 6.5918554 420 393 1880 2120 + 43000 0.99413829 23.008 6.7390795 430 403 1720 2280 + 44000 0.98867961 23.00521 6.8505543 440 412 1600 2400 + 45000 0.99626811 23.019995 6.827741 450 421 1640 2360 + 46000 1.0186043 23.020759 6.6195562 460 430 1680 2320 + 47000 1.0121335 23.019271 6.6022102 470 439 1800 2200 + 48000 0.99883756 23.013973 6.5255522 480 448 1920 2080 + 49000 0.99425223 23.022708 6.609746 490 458 2240 1760 + 50000 0.99505489 23.012641 6.4592863 500 468 2240 1760 +Loop time of 19.4175 on 4 procs for 50000 steps with 4000 atoms + +Performance: 2224796.830 tau/day, 2574.996 timesteps/s +95.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.5467 | 2.6684 | 2.7896 | 6.3 | 13.74 +Bond | 2.3037 | 2.4117 | 2.5085 | 5.3 | 12.42 +Neigh | 7.3597 | 7.3633 | 7.3673 | 0.1 | 37.92 +Comm | 3.0482 | 3.2694 | 3.4997 | 10.2 | 16.84 +Output | 0.0014609 | 0.0017069 | 0.0021793 | 0.7 | 0.01 +Modify | 2.9624 | 3.0581 | 3.1424 | 4.7 | 15.75 +Other | | 0.6447 | | | 3.32 + +Nlocal: 1000.00 ave 1013 max 986 min +Histogram: 1 0 0 1 0 0 0 1 0 1 +Nghost: 1186.25 ave 1198 max 1178 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Neighs: 4927.00 ave 5028 max 4790 min +Histogram: 1 0 0 0 0 1 0 1 0 1 + +Total # of neighbors = 19708 +Ave neighs/atom = 4.9270000 +Ave special neighs/atom = 5.7000000 +Neighbor list builds = 10721 +Dangerous builds = 0 + +Total wall time: 0:00:19 diff --git a/examples/mc/log.13Oct21.pure.g++.4 b/examples/mc/log.13Oct21.pure.g++.4 new file mode 100644 index 0000000000..46f29bf6e4 --- /dev/null +++ b/examples/mc/log.13Oct21.pure.g++.4 @@ -0,0 +1,164 @@ +LAMMPS (29 Sep 2021) +# test script for fix mol/swap +# initial system is 50/50 chains of type 1 and type 2 +# b/c epsilon12 is set to 1.1 (stronger than 1/1 or 2/2) the +# system will go to equilibrium as mostly one type or the other +# fix mol/swap helps this happen quickly +# see the last 2 columns of thermo output for counts of 2 chain types + +units lj +atom_style angle +neighbor 0.36 bin +neigh_modify delay 0 + +pair_style lj/cut 1.1224620483 +bond_style fene +angle_style cosine +special_bonds lj 0.0 1.0 1.0 + +read_data data.bead +Reading data file ... + orthogonal box = (-8.2115700 -8.2115700 -8.2115700) to (8.2115700 8.2115700 8.2115700) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 4000 atoms + scanning bonds ... + 1 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3900 bonds + reading angles ... + 3800 angles +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.001 seconds + read_data CPU = 0.034 seconds + +pair_coeff * * 1.0 1.0 1.1224620483 +pair_coeff 1 2 1.1 1.0 1.1224620483 +bond_coeff 1 30.0 1.5 1.0 1.0 +angle_coeff 1 1.500 +pair_modify shift yes + +variable vt1 atom type==1 +variable vt2 atom type==2 +group g1 dynamic all var vt1 every 100 +dynamic group g1 defined +group g2 dynamic all var vt2 every 100 +dynamic group g2 defined +variable count1 equal count(g1) +variable count2 equal count(g2) + +timestep 0.010 + +fix 1 all langevin 1.0 1.0 100.0 702547 +fix 2 all nve +fix 3 all mol/swap 100 1 1 2 482794 1.0 + +compute p all pressure thermo_temp +thermo 1000 +thermo_style custom step temp etotal press f_3[1] f_3[2] v_count1 v_count2 + +run 50000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.482462 + ghost atom cutoff = 1.482462 + binsize = 0.74123102, bins = 23 23 23 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +WARNING: Communication cutoff 1.4824620483 is shorter than a bond length based estimate of 1.815. This may lead to errors. (../comm.cpp:728) +Per MPI rank memory allocation (min/avg/max) = 5.313 | 5.314 | 5.314 Mbytes +Step Temp TotEng Press f_3[1] f_3[2] v_count1 v_count2 + 0 0 21.4699 5.230121 0 0 2000 2000 + 1000 0.50228459 21.61044 4.3659303 10 9 1960 2040 + 2000 0.55721903 21.75955 4.5695439 20 17 1960 2040 + 3000 0.61139287 21.892943 4.6514755 30 26 2240 1760 + 4000 0.65767189 22.002303 5.1854503 40 33 2280 1720 + 5000 0.69383416 22.110271 5.3803498 50 41 2280 1720 + 6000 0.72692038 22.205887 5.1756569 60 49 2280 1720 + 7000 0.77151336 22.306777 5.5743555 70 56 2240 1760 + 8000 0.78606858 22.37036 5.7745208 80 64 2560 1440 + 9000 0.79363653 22.420931 5.7369418 90 71 2680 1320 + 10000 0.82352629 22.488759 6.0238896 100 76 2720 1280 + 11000 0.83867685 22.534887 6.1263771 110 82 2800 1200 + 12000 0.85335127 22.590281 6.1499954 120 86 2800 1200 + 13000 0.86430985 22.632068 6.1654016 130 89 2760 1240 + 14000 0.88057592 22.680253 6.2162735 140 94 2800 1200 + 15000 0.89326694 22.719731 6.4789839 150 97 2760 1240 + 16000 0.90667644 22.737367 6.214481 160 101 2760 1240 + 17000 0.91190336 22.758572 6.2293336 170 105 2600 1400 + 18000 0.93182455 22.782019 6.2865382 180 111 2680 1320 + 19000 0.93002139 22.797048 6.5579988 190 117 2600 1400 + 20000 0.92396243 22.796108 6.6207461 200 122 2800 1200 + 21000 0.92949808 22.802813 6.3753268 210 125 2920 1080 + 22000 0.93415719 22.807112 6.4696121 220 130 3040 960 + 23000 0.9214833 22.82116 6.4146288 230 131 3080 920 + 24000 0.95693685 22.839738 6.4035728 240 135 2920 1080 + 25000 0.95421851 22.865199 6.4510751 250 138 2880 1120 + 26000 0.95476555 22.878082 6.4652888 260 145 3000 1000 + 27000 0.95773535 22.880671 6.757952 270 149 3000 1000 + 28000 0.95405332 22.896053 6.7425175 280 155 3080 920 + 29000 0.95955713 22.904144 6.6672832 290 161 3240 760 + 30000 0.95521498 22.886699 6.6197941 300 164 3360 640 + 31000 0.96431176 22.91094 6.6373887 310 168 3440 560 + 32000 0.96592495 22.903679 6.4245884 320 172 3520 480 + 33000 0.96457971 22.922681 6.6987987 330 175 3480 520 + 34000 0.96541889 22.92116 6.5992755 340 178 3600 400 + 35000 0.96892691 22.923361 6.7973298 350 178 3600 400 + 36000 0.97267726 22.923431 6.6577403 360 179 3640 360 + 37000 0.97514714 22.939979 6.4028068 370 183 3640 360 + 38000 0.98638599 22.952022 6.6518868 380 183 3640 360 + 39000 0.97864891 22.962534 6.3906837 390 184 3680 320 + 40000 0.9933016 22.975785 6.6819613 400 185 3720 280 + 41000 0.9861477 22.977271 6.6747347 410 187 3800 200 + 42000 0.98157369 22.963129 6.830028 420 187 3800 200 + 43000 0.98202452 22.966947 6.5257905 430 187 3800 200 + 44000 0.99540503 22.971262 6.5546513 440 187 3800 200 + 45000 0.98433653 22.978028 6.4316725 450 189 3800 200 + 46000 0.97912775 22.981328 6.9139851 460 189 3800 200 + 47000 0.9791927 22.981131 6.6417971 470 190 3840 160 + 48000 0.99601024 22.998536 6.6756953 480 191 3880 120 + 49000 0.99589958 22.998489 6.9262843 490 191 3880 120 + 50000 0.99294715 23.00399 6.6976013 500 192 3920 80 +Loop time of 19.5161 on 4 procs for 50000 steps with 4000 atoms + +Performance: 2213556.537 tau/day, 2561.987 timesteps/s +95.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.6256 | 2.7183 | 2.8265 | 5.2 | 13.93 +Bond | 2.3363 | 2.4406 | 2.5197 | 4.8 | 12.51 +Neigh | 7.382 | 7.3884 | 7.3936 | 0.2 | 37.86 +Comm | 3.014 | 3.2136 | 3.3994 | 9.4 | 16.47 +Output | 0.0014574 | 0.0017086 | 0.0020613 | 0.5 | 0.01 +Modify | 3.0282 | 3.1295 | 3.2034 | 4.1 | 16.04 +Other | | 0.624 | | | 3.20 + +Nlocal: 1000.00 ave 1011 max 993 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Nghost: 1187.25 ave 1202 max 1179 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Neighs: 4939.25 ave 5067 max 4850 min +Histogram: 1 0 0 2 0 0 0 0 0 1 + +Total # of neighbors = 19757 +Ave neighs/atom = 4.9392500 +Ave special neighs/atom = 5.7000000 +Neighbor list builds = 10714 +Dangerous builds = 0 + +Total wall time: 0:00:19 diff --git a/examples/gcmc/log.27Nov18.gcmc.h2o.g++.1 b/examples/mc/log.27Nov18.gcmc.h2o.g++.1 similarity index 100% rename from examples/gcmc/log.27Nov18.gcmc.h2o.g++.1 rename to examples/mc/log.27Nov18.gcmc.h2o.g++.1 diff --git a/examples/gcmc/log.27Nov18.gcmc.lj.g++.1 b/examples/mc/log.27Nov18.gcmc.lj.g++.1 similarity index 100% rename from examples/gcmc/log.27Nov18.gcmc.lj.g++.1 rename to examples/mc/log.27Nov18.gcmc.lj.g++.1 diff --git a/examples/gcmc/log.27Nov18.gcmc.lj.g++.4 b/examples/mc/log.27Nov18.gcmc.lj.g++.4 similarity index 100% rename from examples/gcmc/log.27Nov18.gcmc.lj.g++.4 rename to examples/mc/log.27Nov18.gcmc.lj.g++.4 diff --git a/examples/gcmc/log.30Jun20.widom.lj.g++.1 b/examples/mc/log.30Jun20.widom.lj.g++.1 similarity index 100% rename from examples/gcmc/log.30Jun20.widom.lj.g++.1 rename to examples/mc/log.30Jun20.widom.lj.g++.1 diff --git a/examples/gcmc/log.30Jun20.widom.lj.g++.4 b/examples/mc/log.30Jun20.widom.lj.g++.4 similarity index 100% rename from examples/gcmc/log.30Jun20.widom.lj.g++.4 rename to examples/mc/log.30Jun20.widom.lj.g++.4 diff --git a/examples/gcmc/log.30Jun20.widom.spce.g++.1 b/examples/mc/log.30Jun20.widom.spce.g++.1 similarity index 100% rename from examples/gcmc/log.30Jun20.widom.spce.g++.1 rename to examples/mc/log.30Jun20.widom.spce.g++.1 diff --git a/examples/gcmc/log.31Mar21.gcmc.co2.g++.1 b/examples/mc/log.31Mar21.gcmc.co2.g++.1 similarity index 100% rename from examples/gcmc/log.31Mar21.gcmc.co2.g++.1 rename to examples/mc/log.31Mar21.gcmc.co2.g++.1 diff --git a/examples/plugins/CMakeLists.txt b/examples/plugins/CMakeLists.txt index 59c2802b45..0ca2c025e2 100644 --- a/examples/plugins/CMakeLists.txt +++ b/examples/plugins/CMakeLists.txt @@ -14,6 +14,15 @@ endif() project(plugins VERSION 1.0 LANGUAGES CXX) +# 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() + # 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") @@ -32,15 +41,10 @@ set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Need -restrict with Intel compilers -if((CMAKE_CXX_COMPILER_ID STREQUAL "Intel") OR (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")) +if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -restrict") endif() -# bail out on windows -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}) include(CheckIncludeFileCXX) include(LAMMPSInterfaceCXX) @@ -62,12 +66,21 @@ 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 "" - LINK_FLAGS "-rdynamic") +set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin PROPERTIES PREFIX "") # MacOS seems to need this if(CMAKE_SYSTEM_NAME STREQUAL Darwin) + set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin + PROPERTIES LINK_FLAGS "-Wl,-undefined,dynamic_lookup") +elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") +# tell CMake to export all symbols to a .dll on Windows with special case for MinGW cross-compilers + set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin + PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + if(CMAKE_CROSSCOMPILING) + set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin + PROPERTIES LINK_FLAGS "-Wl,--export-all-symbols") + endif() +else() set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin PROPERTIES - LINK_FLAGS "-Wl,-undefined,dynamic_lookup") + LINK_FLAGS "-rdynamic") endif() diff --git a/examples/plugins/LAMMPSInterfaceCXX.cmake b/examples/plugins/LAMMPSInterfaceCXX.cmake index 02f9159319..d52cf8f4e5 100644 --- a/examples/plugins/LAMMPSInterfaceCXX.cmake +++ b/examples/plugins/LAMMPSInterfaceCXX.cmake @@ -23,7 +23,9 @@ endfunction(validate_option) # LAMMPS C++ interface. We only need the header related parts. add_library(lammps INTERFACE) target_include_directories(lammps INTERFACE ${LAMMPS_HEADER_DIR}) - +if((CMAKE_SYSTEM_NAME STREQUAL "Windows") AND CMAKE_CROSSCOMPILING) + target_link_libraries(lammps INTERFACE ${CMAKE_BINARY_DIR}/../liblammps.dll.a) +endif() ################################################################################ # MPI configuration if(NOT CMAKE_CROSSCOMPILING) diff --git a/examples/reaxff/water/acks2_ff.water b/examples/reaxff/water/acks2_ff.water new file mode 120000 index 0000000000..26dd420190 --- /dev/null +++ b/examples/reaxff/water/acks2_ff.water @@ -0,0 +1 @@ +../../../potentials/acks2_ff.water \ No newline at end of file diff --git a/examples/reaxff/water/data.water b/examples/reaxff/water/data.water new file mode 100644 index 0000000000..5da2c434eb --- /dev/null +++ b/examples/reaxff/water/data.water @@ -0,0 +1,3016 @@ +LAMMPS data file + +3000 atoms +2 atom types + +0.0000000000000000e+00 3.1043045599999999e+01 xlo xhi +0.0000000000000000e+00 3.1043045599999999e+01 ylo yhi +0.0000000000000000e+00 3.1043045599999999e+01 zlo zhi + +Masses + +1 15.9994 +2 1.008 + +Atoms # charge + +1497 2 3.8692754524846124e-01 4.4005135488793817e-01 6.8027067297961290e+00 5.5831272410063155e+00 1 1 0 +2401 1 -7.3547395604658661e-01 2.8088432936816430e+00 5.9999842940434611e+00 7.5341673350383074e+00 0 0 1 +498 2 3.0554141478230923e-01 3.1386470457186180e+00 2.2943733261485031e+00 5.1875440798585783e+00 0 0 0 +496 1 -7.5716565194584284e-01 3.8873560175490196e+00 2.3951000308343597e+00 4.5394769377363851e+00 0 0 0 +497 2 3.7474917326292168e-01 3.7024128468444144e+00 3.2217803242562795e+00 4.1929178141452947e+00 0 0 0 +141 2 3.2819006595815370e-01 2.5785003546035381e+00 5.9522998290113884e+00 5.8385480391059792e+00 0 0 0 +139 1 -7.7172999478983184e-01 2.0053458831978461e+00 5.9351684255357595e+00 4.9823207910634197e+00 0 0 0 +140 2 3.4612974959574128e-01 1.9901552204785218e+00 4.9986259421397863e+00 4.6918048080889641e+00 0 0 0 +1528 1 -7.5149674240312681e-01 1.2212058305113851e+00 3.1560995554557962e+00 5.1718212890067647e+00 0 0 1 +1530 2 3.7575023559399656e-01 1.0614876365158610e+00 2.8589915602608413e+00 4.2601977545295187e+00 0 0 1 +239 2 3.1918884951446297e-01 3.4548424578221191e+00 6.8686033008322411e+00 4.0968412335733095e+00 0 0 0 +1631 2 3.6861828487030079e-01 3.9941113970107973e+00 8.2656574262085822e+00 3.7036119701634340e+00 0 0 1 +238 1 -7.2526545622797589e-01 4.2937849132106294e+00 7.3521044049343605e+00 3.8476838702946998e+00 0 0 0 +1529 2 3.8946339762840293e-01 4.7692250699647681e-01 2.8107643958401316e+00 5.8055619177966395e+00 0 0 1 +803 2 3.6060640616141898e-01 5.1999339494958026e+00 7.1414015202400929e+00 5.2920488833458919e+00 0 0 0 +25 1 -6.8827487728119863e-01 3.0985740485415683e+01 2.1645132256403783e+00 7.1925310016229442e+00 -1 0 0 +27 2 3.9080868164496113e-01 3.1038026593265343e+01 1.2354407250465411e+00 6.7561483851304862e+00 -1 0 0 +2163 2 3.6472103780410930e-01 4.6878345557312040e-01 4.4573173444597218e+00 8.2821613647545185e+00 1 1 0 +1496 2 3.6063498463225496e-01 5.7206768577255742e+00 2.4384675008031360e+00 7.1873570706862715e+00 1 1 0 +115 1 -7.4965480601589229e-01 3.9517920662385966e+00 4.5447061663723476e+00 2.6662584102276901e+00 0 0 0 +1085 2 3.3764339144646993e-01 3.9978584926219818e+00 5.4230104078563821e+00 3.1053878503627486e+00 0 1 0 +314 2 3.5708750153667096e-01 1.0310030023560768e+00 6.7316041319369146e+00 3.3734266629564154e+00 0 0 0 +819 2 3.6128343578796446e-01 4.0463343017695772e+00 7.1003506727668608e-01 3.6622194337536271e+00 0 1 0 +2403 2 3.5806910955956361e-01 3.1226344268198925e+00 5.0377455961668165e+00 7.5171760439731976e+00 0 0 1 +1574 2 3.5863203818711292e-01 4.9947645983585964e+00 1.2493041620163177e+00 5.6377122255901835e+00 0 0 1 +116 2 3.4196008866457084e-01 4.7958254257633097e+00 4.5134813120446164e+00 2.1983078109383745e+00 0 0 0 +1636 1 -7.3478551595100094e-01 5.6121875121579743e+00 9.8694416382053440e-01 6.3597906501324371e+00 0 0 1 +2065 1 -6.8215047066870260e-01 1.6875908310066173e+01 1.1238310027866776e+01 5.4081336330899350e-02 0 0 1 +802 1 -7.2240461296520764e-01 6.0892988070798753e+00 7.3641709926087646e+00 5.7407764588525003e+00 0 0 0 +59 2 3.5081337980355071e-01 1.3604526173929814e+00 2.3513564015736548e+00 2.0377862637213977e+00 0 0 0 +33 2 3.6353567283317345e-01 3.0775061814683362e+01 6.5696256871609071e+00 2.6276539222916169e+00 -1 0 0 +2127 2 3.8311301768239048e-01 3.6974335831421676e+00 2.7027373781194757e+00 1.4961865571696141e+01 1 0 0 +550 1 -7.4281091881652961e-01 2.3465162274577466e+01 9.3744257059057343e+00 1.5241859744894187e+01 0 0 0 +309 2 3.7176965299895415e-01 1.4990887604490121e+01 2.5382454665563348e-01 2.1346503640246048e+00 0 0 0 +2232 2 3.4815014742283323e-01 8.5202267262527187e-01 5.3847185145336800e+00 4.3093648474523089e-01 1 0 1 +226 1 -7.4722095769484009e-01 6.0692884597532881e+00 2.3731132049765241e-01 1.3056780543916178e+00 0 0 0 +1637 2 3.6806353395792374e-01 6.5164572239659728e+00 8.5646744910183303e-01 5.9444090391217541e+00 0 0 1 +260 2 3.5228697506239837e-01 5.8972736974633246e+00 7.8289186664455324e+00 6.5863339763837985e+00 0 0 0 +1086 2 3.2722459596763726e-01 7.0330455928520674e+00 5.8850176611591190e+00 6.8095906828009625e+00 0 1 0 +1840 1 -6.9152209464673109e-01 7.3245865814791085e+00 7.9057953792723765e+00 1.2980778971057452e+00 0 0 1 +2612 2 4.1176928679744829e-01 7.0756137615931474e+00 8.4166252144604954e+00 2.1531585977535128e+00 0 1 1 +1842 2 3.6725157545857429e-01 8.3748740565416746e+00 7.8690080028348319e+00 1.3560226011424448e+00 0 0 1 +963 2 4.1022870020113211e-01 9.9106967870758638e+00 8.0146702338176699e+00 7.2466157795297530e+00 0 0 0 +1084 1 -7.4044322693270392e-01 7.6057467080876133e+00 5.0781976218288616e+00 6.7743760963270709e+00 0 1 0 +1663 1 -7.1834560936369407e-01 9.9879391215874271e+00 8.0388811719689492e+00 1.2917807541733919e+00 0 0 1 +821 2 3.5209674216131409e-01 6.9247313199235387e+00 4.3047612584180914e+00 6.9943975000286365e+00 0 1 0 +1791 2 4.0841331548659748e-01 7.7878722270508298e+00 5.3818187244858136e+00 5.1636842205127689e+00 0 0 1 +2023 1 -7.3605189371990465e-01 1.1063137080072600e+01 6.0098264472003251e+00 4.7345199683786516e+00 0 0 1 +1664 2 3.6238506868933806e-01 1.0108354841357976e+01 8.8072390044573137e+00 1.9305013188119438e+00 0 0 1 +1767 2 3.6100076072975557e-01 1.1741733648682450e+01 5.8658042545439084e+00 5.4513143091575005e+00 0 0 1 +2311 1 -7.3005291084991386e-01 8.3020764393069832e+00 5.1948566338776221e+00 4.3179489922325596e+00 0 1 1 +2312 2 3.9274744365696557e-01 9.1759366291491578e+00 5.5291322309174307e+00 4.3792866152146628e+00 0 1 1 +303 2 3.8608151180006473e-01 1.2482611497403401e+01 1.6658621953141555e+00 7.1576373240832911e+00 0 0 0 +1853 2 3.8557910794412215e-01 6.6913261295433673e+00 8.6875135976398994e+00 4.3705239171971151e+00 0 0 1 +1852 1 -7.6091540778352407e-01 6.8668361281846897e+00 9.2238953384065479e+00 3.5736208524521458e+00 0 0 1 +829 1 -7.3432390170804673e-01 1.2651767705075731e+01 2.5248313732060534e+00 7.4965512157935255e+00 0 1 0 +2875 1 -6.8813502015404293e-01 9.1874051384777449e+00 7.6860288086314632e-01 7.6608447591038757e+00 1 1 0 +2759 2 3.7682339456265845e-01 8.5249450804126656e+00 3.3731054837881027e+00 4.0641841504019780e+00 0 1 1 +249 2 3.6791165233171941e-01 7.2214553136648609e+00 4.7206182695467334e+00 2.3723286638248067e+00 0 0 0 +993 2 3.9800531948136814e-01 7.9893180393450729e+00 1.2276942134777038e+00 4.9666634620494534e+00 0 1 0 +401 2 3.6396631747563196e-01 7.2262707803170203e+00 5.8369412728614911e+00 1.3803763554044857e+00 0 0 0 +247 1 -7.0764043316735903e-01 7.0942828324841241e+00 4.9106461584568386e+00 1.4288882775766745e+00 0 0 0 +1103 2 3.7230345163383838e-01 1.1235962979488763e+01 5.4404357695885279e+00 3.9635214837262134e+00 0 1 1 +2876 2 3.9583804731902583e-01 9.0582611669642077e+00 1.2231093581437821e-01 8.4012470775560555e+00 1 1 0 +1011 2 3.1959728574581830e-01 1.2437946514638131e+01 1.8732979306873965e+00 3.6181266905009841e+00 0 1 0 +1893 2 3.7036844773404975e-01 1.1900156966658409e+01 7.4502596457796590e+00 3.8797921320454436e+00 0 0 0 +2877 2 3.7223487628956575e-01 1.0152687605106527e+01 7.0850125780251816e-01 7.3676117410643789e+00 1 1 0 +1841 2 3.9790957842087205e-01 9.8835907129974281e+00 8.4957358744048488e+00 4.8066780575509332e-01 0 0 1 +203 2 3.6407021234816317e-01 9.4391284270869331e+00 2.2161312855505408e+00 3.4466407008994877e+00 0 0 0 +2466 2 3.9557744289353053e-01 1.0478382294700539e+01 1.9034549670425855e+00 1.1912053570753032e+00 0 1 0 +1700 2 3.4174585658026774e-01 7.6681567751202886e+00 4.9737131302251258e+00 8.6429890150973634e+00 0 0 0 +218 2 3.9489709747944879e-01 1.0903840596118812e+01 5.9682168503065460e+00 7.8542237295695791e+00 0 0 0 +202 1 -6.9246227426584595e-01 8.5034914220925781e+00 2.4316557415608751e+00 3.8001377954723088e+00 0 0 0 +1104 2 4.1528548950455579e-01 8.3645436315872566e+00 3.1379844007295282e-01 6.1604329151249164e+00 0 1 1 +991 1 -7.6182583273993854e-01 8.0263667515679185e+00 3.4744605461058575e-01 5.2922470899230607e+00 0 1 0 +102 2 3.6492516758405213e-01 8.0013989365832714e+00 1.4028078508187747e+00 1.5379165763135083e+01 0 0 0 +2029 1 -7.8283617067763300e-01 1.2424136860279537e+01 5.4791209410548314e+00 7.1612535440534977e+00 0 0 1 +2025 2 3.5494230815894440e-01 1.2591724131934392e+01 4.5209311627752200e+00 7.2145026163518384e+00 0 0 1 +2031 2 3.9304550594436322e-01 1.3267174250891356e+01 5.8828315339307844e+00 7.3758229847280052e+00 0 0 1 +1111 1 -7.5194924903800975e-01 1.1789258909767749e+01 4.2473893606497439e+00 2.7973156311830794e+00 0 1 0 +1112 2 3.8149161266254628e-01 1.1325719951844707e+01 3.5140850737691274e+00 2.4518247585030761e+00 0 1 0 +1009 1 -6.7933790730634036e-01 1.2973399971679061e+01 1.2394482882933624e+00 4.1644406722513532e+00 0 1 0 +1113 2 3.2793652825314779e-01 1.2508853849264057e+01 3.8651741180754389e+00 3.4664525276051128e+00 0 1 0 +983 2 3.8034871224020939e-01 1.6372200409886108e+01 3.2828243758410647e+00 5.8612475722303015e-01 0 1 0 +982 1 -7.3826897087316046e-01 1.6538672856583677e+01 2.3344314174687226e+00 3.5593412007078301e-01 0 1 0 +196 1 -7.4549107934801362e-01 1.2855296474912164e+01 5.4732616414580368e+00 3.3990948313494568e-01 0 0 0 +379 1 -7.5307613958567499e-01 1.7194559173341730e+01 6.4295472504929743e+00 3.1166682064054481e+00 0 0 0 +954 2 3.2002351836232878e-01 1.5888333805783443e+01 5.3623905112413706e+00 1.6366381459492292e+00 0 0 0 +197 2 3.9353316471972760e-01 1.2366235949554447e+01 5.2689950079443948e+00 1.0819343253779545e+00 0 0 0 +308 2 3.8053566932308219e-01 1.5827400649134340e+01 1.5102383139749007e+00 1.6944312751168922e+00 0 0 0 +2674 1 -7.5251563708889002e-01 1.6616504346881126e+01 3.8056411956327221e+00 3.9613426800009357e+00 0 1 0 +2675 2 3.6376048259316174e-01 1.5794339487607786e+01 4.0211703398579264e+00 4.4872213323852286e+00 0 1 0 +381 2 3.7093646473040048e-01 1.6989489495356811e+01 5.5370106263854231e+00 3.4535566149823853e+00 0 0 0 +2676 2 3.5623982090771111e-01 1.6485199958957558e+01 2.9341789231643403e+00 3.5795848239229255e+00 0 1 0 +221 2 3.1224109180106219e-01 1.3507875971913872e+01 5.1731003897988455e+00 4.2683251224427101e+00 0 0 0 +220 1 -7.3383156196182264e-01 1.3725487235521911e+01 4.3585589872930308e+00 4.6808284626942935e+00 0 0 0 +222 2 3.2778663941490466e-01 1.3273816959634512e+01 4.4026137329898694e+00 5.5445678182165032e+00 0 0 0 +958 1 -7.4610017930944261e-01 1.5663290274330219e+01 4.9796893426559716e+00 7.5150390905448938e-01 0 0 0 +960 2 3.7551283813146968e-01 1.4736666783744411e+01 5.3254716418768213e+00 7.1438023451097432e-01 0 0 0 +320 2 3.4147571367646573e-01 1.4548277543914198e+01 7.7726612206472465e+00 8.6200265130584590e+00 0 0 0 +380 2 3.8288888396260523e-01 1.8086680823606102e+01 6.6958699296408941e+00 3.4346868318853470e+00 0 0 0 +319 1 -7.5289236146249161e-01 1.4504190487958663e+01 6.8302827431032336e+00 8.3585598210513634e+00 0 0 0 +2078 2 3.6896467802253480e-01 1.9837126505526836e+01 9.4872638994601708e+00 1.4545504814288625e+01 0 0 0 +2042 2 3.8133266548460326e-01 1.8632936926135795e+01 1.8847209418642434e+00 1.0661866182918509e+00 0 0 1 +525 2 3.5767804986002788e-01 1.6044729651565728e+01 7.7152962602539885e+00 4.9279045177504499e-01 0 0 0 +526 1 -7.1675182179051944e-01 1.7338617473894164e+01 3.9073780698890020e-01 4.3862477545242067e+00 0 0 0 +527 2 3.7606096783862469e-01 1.6471133582835396e+01 6.4871802983856663e-01 3.9292007431044085e+00 0 0 0 +534 2 3.5687435904323250e-01 1.8050783975465485e+01 3.7181143555290390e+00 5.1537709798264908e+00 0 0 0 +119 2 3.7458680445139569e-01 2.0487263421233615e+00 5.4481575893417078e-01 1.3498519365226000e+01 0 0 0 +307 1 -7.5313456861153183e-01 1.5516325859493993e+01 1.0041223608999403e+00 2.5148439529207085e+00 0 0 0 +434 2 3.6060382443901440e-01 2.8318372247716162e+01 6.0000350790735746e-01 1.3039033487948334e+01 0 0 0 +2538 2 3.7038237727101675e-01 1.5873081510603580e+01 7.3431633253088568e+00 4.2151889384124237e+00 0 1 0 +362 2 3.5138788653950254e-01 1.3822311947328766e+01 1.2399332735227380e+00 3.7058472510950380e+00 0 1 0 +1773 2 3.7574693015917909e-01 2.4710555149281316e+01 1.1915637515904558e+01 8.9573752514615723e+00 0 0 0 +1441 1 -7.3263272810282853e-01 2.6976878393661949e+01 3.0627092401548633e-01 6.9616920124764707e+00 0 0 0 +2049 2 3.5088136504355405e-01 2.7431266984046175e+01 1.4851721772360399e+01 4.7815946067125177e+00 0 0 1 +1311 2 3.5918535518609329e-01 1.1906016994206430e+01 1.4181562861585023e-01 5.7126228122925715e+00 0 1 0 +1194 2 3.4995179923095754e-01 1.7833416122412100e+01 1.5436461184933348e-01 9.0760596623794463e+00 0 1 0 +1144 1 -7.2894009311541352e-01 2.1625386814021507e+01 5.4650300718290135e+00 6.7230254595329866e+00 0 0 0 +2043 2 3.8805213934516697e-01 1.9877585541745020e+01 1.0369100917515413e+00 9.1741760286022211e-01 0 0 1 +532 1 -7.0517978497245426e-01 1.8491368955069976e+01 3.5217019209699156e+00 6.0490036778759615e+00 0 0 0 +533 2 3.9142658940071773e-01 1.8144895666077264e+01 4.3371633326148933e+00 6.6153233851801607e+00 0 0 0 +2041 1 -7.1168345284775480e-01 1.9352240103205951e+01 1.5571033521169870e+00 1.5405407560902771e+00 0 0 1 +1905 2 3.6418908688370261e-01 2.1605773287702167e+01 4.2765165277270425e+00 5.1106621918495518e+00 0 0 1 +1903 1 -6.9792797977161336e-01 2.1748551405429989e+01 4.0998926315357895e+00 4.1658099232003689e+00 0 0 1 +1217 2 3.7913386240549446e-01 2.2836463194848776e+01 5.2406299294258698e+00 2.9961168585826239e+00 0 1 0 +1904 2 3.6724890029640833e-01 2.1010627209303685e+01 3.3761847111544125e+00 4.0045156441401977e+00 0 0 1 +1216 1 -7.2604871901178580e-01 2.3447202645475159e+01 5.5920326273056826e+00 2.2944876098746829e+00 0 1 0 +248 2 3.3978223300435040e-01 2.3198037218540914e+01 7.6326540121433748e+00 2.6633349332777576e+00 0 0 0 +1146 2 3.4792706746670926e-01 2.1431062769332790e+01 6.3968311439957963e+00 6.5873809264560750e+00 0 0 0 +515 2 3.7066235504587541e-01 2.3336985121668135e+01 4.9569713602477519e+00 1.5211960503752682e+00 0 0 0 +1116 2 3.5646923248294565e-01 2.0298081690348930e+01 5.4854204901743469e+00 3.5506637971694550e+00 0 1 0 +1114 1 -7.0395571779608335e-01 1.9907703230303699e+01 6.1513486169178977e+00 3.0110646253217355e+00 0 1 0 +1115 2 3.8069079044468124e-01 1.9945826625468705e+01 5.9246211790915924e+00 2.0351856889836997e+00 0 1 0 +579 2 3.9547297628369682e-01 2.3996070039116375e+01 1.0529411602750995e+00 1.1165198143647250e+00 0 0 0 +585 2 3.7096507480798313e-01 2.3767754484183236e+01 2.6411712385066539e+00 1.1225288846698618e+00 0 0 0 +1196 2 3.5072559348999632e-01 1.9373676533195667e+01 2.4530216578494639e+00 4.7668697348213600e+00 0 1 0 +1714 1 -7.0802398477202177e-01 1.9900350884093399e+01 5.2222678995018956e+00 3.7497577490663969e-01 0 0 0 +2814 2 3.9150922204105332e-01 1.6699795914991270e+01 9.4769974678379248e-02 5.7930995252327664e+00 0 1 1 +2819 2 3.3914466909902691e-01 2.3808226622202906e+01 1.4027657188514016e+01 1.5194174847249243e+01 0 0 0 +583 1 -7.3812607951190867e-01 2.4143811703288495e+01 1.9114222006859189e+00 1.6122127404924802e+00 0 0 0 +624 2 3.5387842445422352e-01 2.4421069009592568e+01 6.6814349771311372e+00 7.2476246528316957e-01 0 0 0 +1195 1 -7.0634180393460455e-01 1.9969889729479270e+01 1.9322909693732215e+00 4.0979444083531487e+00 0 1 0 +1197 2 4.0772620806047699e-01 1.9396653865507815e+01 1.5237357262145894e+00 3.3353295837171375e+00 0 1 0 +418 1 -7.0399715143996378e-01 2.4418330292019323e+01 1.7532752213027898e+00 4.5070628850662953e+00 0 0 0 +420 2 3.8368844685430692e-01 2.4262150970924750e+01 7.7767358985760937e-01 4.5882878553516822e+00 0 0 0 +419 2 4.1155198449350688e-01 2.4460738669155493e+01 2.0224169088874415e+00 3.6037300525953690e+00 0 0 0 +1145 2 3.3232971594426863e-01 2.4543873230681669e+01 6.5476103457458166e+00 6.4993358688362211e+00 0 0 0 +1171 1 -6.8843097609044668e-01 1.3127471808587817e+01 1.5430342606026111e+01 5.2162038862750935e+00 0 0 0 +503 2 3.5852519131886351e-01 2.3431171518107213e+01 5.6038697706205145e+00 5.8644913703225265e+00 0 0 0 +1280 2 3.5376168279638437e-01 2.1067713619991196e+01 1.5516513195141689e+01 3.1292364926754366e+00 0 0 0 +502 1 -7.3571741856961170e-01 2.4383876101821894e+01 5.6246216646123770e+00 6.2255871204360247e+00 0 0 0 +884 2 3.3705342906758395e-01 2.0831958439525298e+01 8.4319099928220318e+00 1.4983513705461160e+01 -1 1 0 +2161 1 -7.2741868531417841e-01 3.1002324428745287e-01 5.3902843230030770e+00 8.4582030730450217e+00 1 1 0 +32 2 3.7224714013611548e-01 2.8969088068039767e+01 5.8853613725276244e-01 1.3415063196894363e+00 -1 0 0 +31 1 -7.0701682996664361e-01 2.8861481885382837e+01 1.6305346253392183e+00 1.2125555964014341e+00 -1 0 0 +1397 2 3.7287783474065178e-01 2.9021060975786416e+01 5.8230468622467777e+00 1.1493524979364806e+00 0 1 0 +615 2 3.8565372047805646e-01 2.4926495528292843e+01 2.4681537292063078e+00 6.2171953534894255e+00 0 0 0 +302 2 3.6922138072184107e-01 3.0448744544102141e+01 6.4864682511493870e+00 6.6729371988181709e+00 -1 0 0 +2901 2 4.2376035006718926e-01 3.0021935022741616e+01 2.3328327033627505e+00 7.4094868457492877e+00 0 1 1 +301 1 -7.8432242912457006e-01 3.0600037180261197e+01 6.9519317345137130e+00 5.8723762844978475e+00 -1 0 0 +58 1 -6.9908992171353024e-01 6.3748292073836732e-01 2.0463572721280681e+00 2.6294907465286599e+00 0 0 0 +240 2 3.3485166879456130e-01 3.0843398181986625e+01 2.1919511746150593e+00 2.1074553862407970e+00 -1 0 0 +2007 2 3.6413535825084464e-01 2.7884518960634296e+01 6.6614101874550382e+00 2.9471974124708211e+00 0 0 1 +622 1 -7.5750477464126409e-01 2.5145684392649883e+01 7.1849543661857584e+00 3.5392257365769353e-01 0 0 0 +1298 2 3.3441853145114819e-01 2.7818478639726820e+01 3.3144672824362722e+00 4.0335774579265600e+00 0 1 0 +448 1 -7.0318713721338333e-01 2.8097674324043851e+01 2.4598468287538888e+00 4.1297936159472464e+00 0 0 0 +2004 2 3.7851807512870878e-01 2.8277280394440744e+01 2.1676827663847433e+00 3.2511065976651894e+00 0 0 0 +1415 2 3.5501881145054931e-01 2.7398178513195557e+01 4.8176197476632554e+00 8.1955155867095399e+00 0 0 0 +935 2 3.7926192283897481e-01 2.7867354921700084e+01 2.3163446476640237e+00 7.1464374500543952e+00 -1 1 0 +934 1 -7.0550798053293162e-01 2.8514066684769428e+01 3.0309372866169420e+00 6.9865725072981961e+00 -1 1 0 +936 2 3.5802385594781078e-01 2.8350968993500395e+01 3.1826801669888085e+00 6.0233873348596116e+00 -1 1 0 +1654 1 -7.2778148499228823e-01 2.6000151339640546e+01 6.2984732742535758e+00 3.9240473831981197e+00 -1 0 1 +1656 2 3.8027277584560176e-01 2.5187286537297961e+01 6.1459731664565673e+00 3.3539954771306548e+00 -1 0 1 +1416 2 3.7533076508460606e-01 2.7486061051601464e+01 6.1751659468413065e+00 7.6778011869943370e+00 0 0 0 +1284 2 3.7296810722231194e-01 2.5695725667684769e+01 6.1010097723828309e+00 4.7757707803728042e+00 -1 1 0 +1282 1 -7.2633138156117139e-01 2.6533195522991019e+01 3.0430789772738978e+00 9.4074079366307362e-01 -1 1 0 +395 2 3.7194150494052364e-01 2.0721686406351484e+01 1.4825699905520535e+01 6.7864002498783798e+00 0 -1 0 +315 2 3.9182710238531726e-01 2.7194063305354611e+01 2.3585563875597009e+00 7.3548938961926469e-01 -1 0 0 +2005 1 -7.3670581211206421e-01 2.8797406268766185e+01 6.8426764115822305e+00 2.7028840681739510e+00 0 0 1 +1283 2 3.8989794328252242e-01 2.5720251978925841e+01 2.5003236123211270e+00 1.1432158812361251e+00 -1 1 0 +2454 2 3.5521705336813136e-01 5.1507876412977160e-01 1.3637905550535947e+01 1.3746168208106381e+01 0 0 0 +143 2 3.6506930274778204e-01 2.8548886820557613e+01 7.1302593790984945e+00 5.5261781302066835e+00 -1 0 0 +322 1 -7.1522081979271412e-01 2.7851815251966961e+01 1.1251230139737199e+01 1.0598254784622664e+01 0 0 0 +2006 2 3.8260586691915549e-01 2.8793657450713877e+01 7.7546719844509173e+00 2.2997713633332033e+00 0 0 1 +144 2 3.6242795555462648e-01 2.7062070631452631e+01 7.2243739405285794e+00 5.1544861901002568e+00 -1 0 0 +142 1 -7.4158746208401738e-01 2.7655742999010020e+01 7.0029279966475046e+00 5.9266458450432316e+00 -1 0 0 +128 2 3.6493793175219513e-01 2.9251866054560224e+01 1.8128122219449998e+00 2.9835519613040862e-01 -1 0 0 +893 2 3.7946920482746471e-01 2.0789415683959433e+01 5.0171134231841330e-01 4.9622184914003116e+00 -1 1 0 +613 1 -7.2930970719515864e-01 2.5354487785368573e+01 2.9206965939664045e+00 7.0171052428807306e+00 0 0 0 +1854 2 3.6046538469487516e-01 6.0186383954012292e+00 9.6181536881972463e+00 3.3021872686892668e+00 0 0 1 +313 1 -7.2860828500242214e-01 6.6309818808902365e-01 6.8670236808095488e+00 2.5073334000482266e+00 0 0 0 +489 2 3.8242671450949917e-01 3.2789655077764341e+00 1.0335182590066815e+01 3.1661711981267127e+00 1 0 0 +1582 1 -6.9633133541634928e-01 3.9175816189525694e+00 8.8798388320891473e+00 6.6440531322343496e-02 0 0 1 +1583 2 3.8330519894733267e-01 3.7157303505667616e+00 9.3075520118682071e+00 9.5043849871585739e-01 0 0 1 +1545 2 3.3547912585773454e-01 1.7513554097617570e+00 1.4264802299774038e+01 1.3255855811745821e+01 0 0 0 +487 1 -7.5962823214403985e-01 4.0623364446220558e+00 1.0069168258611036e+01 2.6871955226819590e+00 1 0 0 +488 2 3.3513510512049199e-01 4.4047292342860924e+00 1.0884175221904872e+01 2.3609347733608774e+00 1 0 0 +236 2 3.3992074273664707e-01 5.8140865525284569e-01 1.0447318523122952e+01 4.6983525142782989e+00 0 0 0 +1087 1 -7.7121238428502759e-01 2.2878236686215194e+00 1.0794053515937286e+01 4.6705075461661476e+00 0 0 0 +876 2 3.7577555404776669e-01 2.6906293270298849e+00 1.0167016969107877e+01 5.3443139055192077e+00 0 0 0 +1089 2 3.5301346996899213e-01 2.4523046410709441e+00 1.1721309434211925e+01 5.0512172834935525e+00 0 0 0 +988 1 -7.3980602252790906e-01 3.0605477789577495e+00 8.6425406263411908e+00 6.3050430950897791e+00 0 0 0 +989 2 3.5221983851749666e-01 2.7372684251186699e+00 7.7380758558943352e+00 6.3162320630704851e+00 0 0 0 +351 2 3.5476259391158621e-01 4.9008643683721811e+00 1.3370829450075949e+01 1.4978719937142511e+00 0 0 0 +349 1 -7.2438225240095444e-01 3.9668742629788083e+00 1.3106368663758122e+01 1.3619716573037230e+00 0 0 0 +2204 2 3.3502436980086803e-01 1.3133732729193814e+00 1.1046095576944669e+01 7.3879940582274928e-01 1 0 1 +2090 2 3.1416504629569597e-01 3.5713442770377184e+00 1.3601010630849697e+01 2.1393200249164996e+00 1 0 0 +2165 2 3.6187320847216919e-01 3.0809439330817803e+01 1.3842330112549433e+01 4.6223282175213347e+00 0 -1 1 +2822 2 3.8410087331911397e-01 7.0484164184591402e-01 8.6201759024897981e+00 2.2996257689948187e+00 1 0 1 +2821 1 -6.9317519523929871e-01 1.0510035515236795e+00 9.5837781336614452e+00 2.2453884041254644e+00 1 0 1 +2838 2 3.4514550685245993e-01 9.6234805605568241e-01 9.9084729669537506e+00 3.1471571998744992e+00 1 0 1 +2164 1 -7.5352117053148004e-01 3.0047419170952306e+01 1.3303786185264741e+01 4.3623085402350235e+00 0 -1 1 +975 2 3.7682730648664148e-01 4.1159794867671584e+00 1.3015015958314439e+01 5.9005683034394236e+00 0 0 0 +2066 2 3.8742997998029072e-01 1.6019479085528225e+01 1.1685737415708365e+01 2.1333527031933200e-01 0 0 1 +2935 1 -7.3059112897193779e-01 1.3639244652625697e+00 1.1859835077454461e+01 1.5196214658237747e-01 1 0 1 +2244 2 3.5548258327564458e-01 2.1573034557559936e+00 1.2211891396818533e+01 4.2478770601766352e-01 1 0 1 +990 2 3.5068291930645673e-01 4.0201368215177693e+00 8.5826932481606466e+00 6.5452969738789379e+00 0 0 0 +2149 1 -7.4148447957628705e-01 1.2019739267070590e+00 1.4672260592254840e+01 5.5630992204181284e+00 1 0 1 +973 1 -7.8775790214207508e-01 3.2808598996908067e+00 1.2848526359195688e+01 6.2732967928043202e+00 0 0 0 +762 2 3.6025664654146405e-01 1.9056954910051354e+00 1.4057376445312965e+01 5.5313206816203708e+00 0 0 0 +2795 2 3.9224283641486529e-01 2.6521176460952926e+01 4.6186126865153296e+00 2.5126444848059759e-01 0 1 1 +122 2 3.6819491116834224e-01 2.3324552592077765e+01 3.5796379652413099e-02 7.4527908359156143e+00 -1 0 0 +358 1 -7.4765682452255755e-01 5.4380659569255423e+00 1.3878425473942585e+01 4.4473440250118168e+00 0 0 0 +417 2 3.7382189272773941e-01 1.7560447634827046e+01 1.5143597939000566e+01 8.1699992837828930e+00 0 0 0 +961 1 -7.6642246769839772e-01 1.0042308679106254e+01 8.9584766183836724e+00 7.1840235780789001e+00 0 0 0 +962 2 3.6857664079591451e-01 9.1568370079591368e+00 9.4753221975802866e+00 7.3013392451650754e+00 0 0 0 +2030 2 3.8077556991114592e-01 1.1274953341341806e+01 9.1756604772778196e+00 8.2615689499298348e+00 0 0 1 +296 2 3.8390767271087611e-01 8.3870652149458866e+00 1.0498040232468407e+01 4.1447572130468879e+00 0 0 0 +1684 1 -7.2814409094719501e-01 7.3903507455065967e+00 1.1071556853951039e+01 1.2250354825262861e+00 0 0 1 +295 1 -7.5867788325900443e-01 8.3606792224635225e+00 1.1198565313529352e+01 4.7578819239418824e+00 0 0 0 +297 2 3.8050488962837858e-01 8.1992673935332281e+00 1.0810184886840672e+01 5.5982050466612767e+00 0 0 0 +752 2 3.7058099998233940e-01 6.9641895936893086e+00 1.2308111468798824e+01 6.9658155757407219e+00 0 0 0 +751 1 -7.4278412639228442e-01 6.8317676886338417e+00 1.3225459031894374e+01 6.7438315667638911e+00 0 0 0 +333 2 3.2594448957973510e-01 1.0940086812021329e+01 1.0907622350149609e+01 2.3696570893195164e+00 0 0 0 +1721 2 3.6555965852011851e-01 1.0108207122612409e+01 1.2939405571008342e+01 1.8138351188170265e+00 0 0 1 +1720 1 -6.7979005435637685e-01 1.0139115176726332e+01 1.2619264235791288e+01 9.1494055886703352e-01 0 0 1 +1722 2 3.1408722434581637e-01 9.3407660548652700e+00 1.3012442918969811e+01 4.6724181254637065e-01 0 0 1 +513 2 3.5331149898951131e-01 6.1258136386977373e+00 1.3650690886881765e+01 5.1785295600723549e+00 0 0 0 +359 2 3.3369997701578780e-01 5.9767384049249790e+00 1.3598746260467328e+01 3.6815405445583935e+00 0 0 0 +1686 2 3.5240375771748844e-01 6.9460097646681369e+00 1.1918500061515987e+01 1.4366910383412708e+00 0 0 1 +2280 2 3.7119825856449817e-01 7.2401035636003090e+00 1.4224140737357329e+01 1.1984115186101394e+00 0 0 1 +332 2 3.4834558761665085e-01 1.0853174350853518e+01 1.0627732179932620e+01 6.3333012192419424e+00 0 0 0 +994 1 -7.1059773710688490e-01 1.1083273692355830e+01 1.1613748775864417e+01 6.4686656234184738e+00 0 0 0 +341 2 3.3735279609069491e-01 7.0764838609572767e+00 9.4518567379441283e+00 7.8554150256115385e+00 0 0 0 +340 1 -7.5518289903745917e-01 7.6864902765107814e+00 1.0199138450529055e+01 7.5550827779115322e+00 0 0 0 +2278 1 -7.8009249592433916e-01 6.8004361878348911e+00 1.3720896671082105e+01 1.9284680084598940e+00 0 0 1 +331 1 -7.3418890315657181e-01 1.0267332256594415e+01 1.0457999131588730e+01 2.9030361238710336e+00 0 0 0 +1272 2 3.1651297923855615e-01 1.0320620493004430e+01 1.1044707571318979e+01 3.6633258241542537e+00 0 0 0 +2279 2 3.0287135476369220e-01 7.5119692850690356e+00 1.3642877563459185e+01 2.5709230452345122e+00 0 0 1 +552 2 3.1157287016550422e-01 2.2611381264759519e+01 9.5628153947696610e+00 1.4801127234723051e+01 0 0 0 +1071 2 3.6370197009760108e-01 9.2109793110600613e+00 1.2678296857439486e+01 4.1086137374479605e+00 0 0 0 +753 2 3.8398429683529961e-01 7.6805428689642357e+00 1.3657573344140784e+01 6.9011137950325541e+00 0 0 0 +996 2 3.7894194562482475e-01 1.2011414776837247e+01 1.1748453532754196e+01 6.1451088221579040e+00 0 0 0 +649 1 -7.3435592382189663e-01 1.3706413328780920e+00 1.3953920709658846e+01 1.4118039306937186e+01 1 0 0 +1069 1 -7.7126130153104555e-01 9.6710350248297203e+00 1.3461439256148447e+01 3.6996363509544015e+00 0 0 0 +698 2 3.8485248110641607e-01 1.0125965419176254e+01 1.2973195546590683e+01 7.2780509680289356e+00 1 0 0 +2720 2 3.5902734372621675e-01 2.5263573307082972e+01 1.4868669781495987e+01 9.8064356926907124e+00 0 1 0 +806 2 3.6058437088561074e-01 1.0569862483970079e+01 1.3309830973784278e+01 3.9004031613580823e+00 0 0 0 +524 2 3.7925251782370911e-01 1.7318664733722265e+01 7.6410073785404355e+00 1.4165581848616602e+00 0 0 0 +523 1 -7.2080194552706012e-01 1.6846011175578873e+01 8.1855784635332398e+00 8.6426136208733129e-01 0 0 0 +1892 2 3.3559177520446359e-01 1.2031997034331688e+01 8.9284412640576942e+00 3.4755052150328223e+00 0 0 0 +977 2 3.5661278293438609e-01 1.2923340356870726e+01 1.3924500954723241e+01 2.8572605709043160e+00 0 0 0 +1270 1 -7.6167366620956856e-01 1.3625015813317914e+01 1.1635889254372275e+01 5.3936156072980204e+00 0 0 0 +1271 2 3.2283997763176686e-01 1.3363419589478919e+01 1.2055222357868308e+01 4.5025536195181903e+00 0 0 0 +1891 1 -7.1511451722943142e-01 1.2546260930801695e+01 8.1678258594311988e+00 3.7054756391045220e+00 0 0 0 +374 2 3.7100735648407795e-01 1.4671305077239150e+01 8.4693641702357034e+00 6.5010617381468663e+00 0 0 0 +999 2 3.7673389148422226e-01 1.6858188839617025e+01 1.3260840101787142e+01 3.6536277097279157e+00 0 0 0 +976 1 -7.6500251118257601e-01 1.2495194270294981e+01 1.3064141836183607e+01 2.9073867924432082e+00 0 0 0 +2537 2 3.4154322829704103e-01 1.4449902508342412e+01 8.1164653714006967e+00 4.4858453812232160e+00 0 1 0 +945 2 3.5756763237003220e-01 1.2874768239465711e+01 1.2619148926920694e+01 2.2110146519842866e+00 0 0 0 +1925 2 3.4095981919838175e-01 1.5692511942686176e+01 9.6147015634048660e+00 3.3486570916909053e+00 0 0 0 +1924 1 -7.2404266196428380e-01 1.5221695559658110e+01 1.0459664212803514e+01 3.1680209738104517e+00 0 0 0 +1926 2 3.1717212270082579e-01 1.4608794019453144e+01 1.0494730065994817e+01 3.9453561254685292e+00 0 0 0 +1128 2 3.7402235582157090e-01 1.5045005346193431e+01 1.3260823429527811e+01 1.1281503733802314e+00 0 0 0 +1126 1 -7.7268408356808438e-01 1.4601781128230201e+01 1.2432780275579875e+01 1.0212338110373231e+00 0 0 0 +1127 2 3.4268230352755635e-01 1.4871898918240923e+01 1.1922153454176515e+01 1.8370952174557196e+00 0 0 0 +997 1 -7.5019155484829303e-01 1.6185721333585239e+01 1.2897821630729570e+01 4.2814784430507942e+00 0 0 0 +1962 2 3.3676684637680410e-01 1.5928223210051311e+01 1.2042646060180729e+01 3.8470288527138665e+00 0 0 1 +373 1 -7.3021666868400825e-01 1.4189227303820456e+01 9.1725985459417014e+00 7.0508923828249097e+00 0 0 0 +558 2 3.4524258190978491e-01 1.7275618272182506e+01 1.1647239440605443e+01 5.1520170782588597e+00 0 0 0 +2536 1 -7.3118747489834701e-01 1.5339710978302147e+01 7.8541542818862613e+00 4.8443859035052554e+00 0 1 0 +1758 2 3.6338525820394019e-01 1.4247358999328338e+01 1.2307757516201359e+01 5.7088167338458087e+00 0 0 0 +2450 2 3.8953285002764459e-01 1.5772388334175179e+01 1.3474992876695412e+01 6.0753715007786573e+00 0 0 0 +1060 1 -7.7834296710778439e-01 1.5161746436035390e+01 1.3765190928991137e+01 6.7030838997542705e+00 0 0 0 +1052 2 3.7091095558428605e-01 1.8874535562468576e+01 1.0112325706223350e+01 4.9605214777657274e+00 0 0 0 +952 1 -7.4211657418473165e-01 1.5899211349038151e+01 1.4813070298548183e+01 3.5141057336039394e-01 0 0 0 +1160 2 3.5794340822123361e-01 1.2922128370188350e+01 1.5070432297648827e+01 4.3865123063701645e+00 0 0 0 +1061 2 3.9340394586448718e-01 1.4686691678917770e+01 1.4503427917135310e+01 6.3605934765078400e+00 0 0 0 +2157 2 3.4733707346504189e-01 1.2826235656375388e+01 1.5424466508002052e+01 1.4236822660756496e+00 0 0 1 +271 1 -7.3284933903259986e-01 1.9797012417861556e+01 1.0198648564118789e+01 2.1808724178878028e-01 0 0 0 +2843 2 3.6286479239287156e-01 2.5028410449812743e+01 1.3224309494639456e+01 1.5379719493730903e+00 0 0 1 +2865 2 3.8321205054164886e-01 2.4981110364415954e+01 1.1787790131490294e+01 1.0665015240334432e+00 0 0 1 +2336 2 3.4760543734255200e-01 2.6794298776418618e+01 4.7204019993334845e-02 1.1493774722804988e+01 -1 1 1 +560 2 4.1327771374331596e-01 2.4698030269425669e+01 1.4859157153438852e+01 6.4557658311544310e+00 0 0 0 +1002 2 3.6831536018504235e-01 9.0709264057027355e+00 1.5175519125043248e+01 4.0706270566276270e+00 0 0 0 +556 1 -7.1120261122680717e-01 1.8023493016279513e+01 1.1324096084893167e+01 5.7339965207913473e+00 0 0 0 +557 2 3.7278171676663396e-01 1.8744556612773923e+01 1.1998961480393996e+01 5.7709015871253806e+00 0 0 0 +1051 1 -7.5106068386773239e-01 1.9463097868557114e+01 9.4375597435248260e+00 4.4429166969099612e+00 0 0 0 +1141 1 -7.0865497417696000e-01 2.3622330297184394e+01 8.0976140201513047e+00 3.4823814250952703e+00 0 0 0 +1143 2 3.5276029334045467e-01 2.3877297116691985e+01 8.4869227450750060e+00 5.9959241109173318e+00 0 0 0 +1142 2 3.8480780230000083e-01 2.4009491806606366e+01 8.8987499849634037e+00 3.1807848067586919e+00 0 0 0 +1344 2 3.4431754370412976e-01 2.2031646719938472e+01 8.3703161142980598e+00 4.7295540868584167e+00 0 0 0 +1342 1 -6.8308981538894631e-01 2.4624194584247398e+01 8.6718279784660304e+00 6.4315465104822378e+00 0 0 0 +1279 1 -7.2047636044830288e-01 2.1194438088659144e+01 1.4655113145176898e+01 3.5599068905706899e+00 0 0 0 +1323 2 3.2231289034768323e-01 2.4319336433573465e+01 1.2486041030298008e+01 3.4344236859922881e+00 0 0 0 +749 2 3.4257377797706601e-01 1.8165041987963619e+01 1.4215742191736197e+01 2.0663913242721450e+00 0 0 0 +750 2 3.4918107205585291e-01 1.9293946610269717e+01 1.3944062873668372e+01 3.0360673982438584e+00 0 0 0 +1053 2 3.7355122674223473e-01 1.9981613596945731e+01 1.0142044406269951e+01 3.6721064556180352e+00 0 0 0 +1364 2 3.6485201855729510e-01 1.9318564114233528e+01 1.1646004194054118e+01 2.7559119559059511e+00 0 0 0 +1343 2 3.7323439077733678e-01 2.5272702753623754e+01 8.8444474476632546e+00 5.6789401336957352e+00 0 0 0 +1363 1 -7.2813137446444254e-01 2.0174853811185752e+01 1.1180685316542265e+01 2.6899483744839250e+00 0 0 0 +1365 2 3.9713794882029002e-01 2.0227614540723657e+01 1.0639849292957415e+01 1.8135908162679584e+00 0 0 0 +1294 1 -7.5872247108158186e-01 2.1586974012361846e+01 8.5220006770698973e+00 5.6332414905894312e+00 0 1 0 +1229 2 3.6559621130358355e-01 2.5796342575252574e+01 1.0434659060781394e+01 3.9758072329309679e+00 0 0 0 +1296 2 3.6607457751404843e-01 2.0366112239366135e+01 9.1572924816627204e+00 5.1228506915628627e+00 0 1 0 +2934 2 4.0311508896507325e-01 2.3942267593843457e+01 1.4796025914797434e+01 1.3442222386508997e+00 0 0 1 +2850 2 3.8315464193520832e-01 2.4620142727404136e+01 1.4909320955578064e+01 2.7131452306888910e+00 0 0 1 +2932 1 -7.8039979922039138e-01 2.4013594742696309e+01 1.4359470428390750e+01 2.2266960707494654e+00 0 0 1 +748 1 -7.3018650304512345e-01 1.8427046215860823e+01 1.3583293653000359e+01 2.7271658023086571e+00 0 0 0 +1321 1 -6.5864153984116669e-01 2.4268201200445308e+01 1.1986392490174696e+01 4.2974713873037711e+00 0 0 0 +1281 2 3.5433692469751338e-01 2.2077395306594351e+01 1.4348392712373405e+01 3.1790452010726651e+00 0 0 0 +2780 2 3.6847894214086452e-01 2.0657071677182085e+01 1.3437978308603224e+01 5.0024740459382340e+00 0 0 1 +1295 2 3.8008842647280749e-01 2.2075169149491696e+01 9.3884094689527533e+00 6.0161724973545869e+00 0 1 0 +1177 1 -7.2133807426964403e-01 2.0445471297606030e+01 1.3020624667663823e+01 5.9033396771857563e+00 0 0 0 +1178 2 3.8760922709331613e-01 2.1123036439837861e+01 1.2364993781325525e+01 6.1885183465221001e+00 0 0 0 +2228 2 3.4804715633184741e-01 2.4810796102968023e+01 9.2674126213427019e+00 1.1286540554542459e+00 0 0 1 +1322 2 3.3033554877197840e-01 2.4605511059419875e+01 1.2673089397605336e+01 4.8771040732884554e+00 0 0 0 +224 2 3.5080382579655595e-01 1.9820240129964642e+01 7.6595505302338704e+00 6.4471005405667841e+00 0 0 0 +2227 1 -7.2929343957952986e-01 2.4726632068728112e+01 9.9745764484836581e+00 1.7381256100416549e+00 0 0 1 +2229 2 3.2258576344761747e-01 2.5640140643847204e+01 9.9550075705358392e+00 2.1361854473283866e+00 0 0 1 +507 2 3.4073756485913104e-01 2.2660158628013029e+01 1.4128931869446916e+01 1.4168782827577042e+01 0 0 0 +2080 1 -7.1497924938304980e-01 2.1835153667262524e+01 1.0736491192306897e+01 6.9156177707814352e+00 0 0 0 +2082 2 3.6731570280412973e-01 2.2588381513180167e+01 1.0893927333057611e+01 7.5772875029759232e+00 0 0 0 +431 2 3.6489346980624221e-01 3.0534173399577149e+01 8.3380848420287279e+00 6.5163502149762520e+00 0 0 0 +1632 2 3.8167188596816054e-01 3.0422394593164292e+01 1.1494413603359128e+01 4.6230591406290511e+00 -1 0 1 +1630 1 -7.2546998377165361e-01 3.0594866062596974e+01 1.0538283577190228e+01 4.6956648343540257e+00 -1 0 1 +2166 2 3.6335358282092878e-01 2.9345361139250041e+01 1.3735034155610570e+01 4.8968147581269275e+00 0 -1 1 +1917 2 3.2831460205591412e-01 1.9266198291343610e+01 1.5112588328716638e+01 2.2304837569120856e-01 0 0 1 +2203 1 -7.5258231877874160e-01 2.9176683859194647e+01 1.3163150997103514e+01 8.3128994673950860e+00 0 0 1 +1180 1 -7.0673420754785987e-01 2.6303583275596061e+01 9.8250799245261149e+00 4.5254814934012977e+00 0 0 0 +127 1 -7.1578102381674791e-01 2.7732456825143593e+01 9.2933380246859176e+00 7.6714896220953657e+00 -1 0 0 +12 2 3.6193354459566540e-01 2.7540038293111024e+01 8.4959479214118510e+00 7.0545459217828670e+00 -1 0 0 +2095 1 -7.0831593411319604e-01 3.0349609271392325e+01 9.2925902847310340e+00 7.0978653600088935e+00 0 0 1 +2096 2 3.5281360484553997e-01 3.0398418861229050e+01 1.0051212924202549e+01 6.2213252553154827e+00 0 0 1 +623 2 3.5880766260311747e-01 2.9201482049435800e+01 9.2244346653423044e+00 7.4358684922306608e+00 0 0 0 +2159 2 3.3823564268491546e-01 3.0803202576366676e+01 1.1920531603542944e+01 1.3415442326919869e+00 0 0 1 +2158 1 -7.6119678411316760e-01 2.9918961599720525e+01 1.2338436941275864e+01 1.5832925508022093e+00 0 0 1 +2130 2 3.2749563037318280e-01 2.7349919815107906e+01 8.4101723016108476e+00 5.8452461182870985e-01 0 0 1 +1182 2 3.6320659557072082e-01 2.6759606122075066e+01 1.0434746236492805e+01 5.1603883516707372e+00 0 0 0 +2128 1 -7.4887991140858612e-01 2.8193494970906894e+01 8.7573589475964475e+00 9.2231447524737176e-01 0 0 1 +2129 2 3.4655998913080804e-01 2.7963380512288413e+01 9.6628989688977480e+00 1.3165453879185831e+00 0 0 1 +2870 2 3.8236049531283289e-01 2.8378756069119923e+01 1.1602593554863265e+01 2.0292751474858477e+00 0 0 1 +1328 2 3.8257873680038068e-01 2.8970511947163111e+01 1.4437357976968004e+01 7.0268108477778783e+00 0 0 0 +2869 1 -7.2788703577564851e-01 2.7464457162804660e+01 1.1234554557070336e+01 2.0922560348112369e+00 0 0 1 +610 1 -7.5670187498919206e-01 2.7428196957311773e+01 1.1811720209771533e+01 6.5291027444831045e+00 0 0 0 +611 2 3.8633155299559213e-01 2.7984044401595391e+01 1.2201081873390617e+01 7.1949645419678045e+00 0 0 0 +2160 2 3.5874055738087113e-01 3.0072740007557556e+01 1.2736754349937966e+01 2.4906916468330875e+00 0 0 1 +612 2 3.4738415209155832e-01 2.6702794741356012e+01 1.2389274641474589e+01 6.3231656173156452e+00 0 0 0 +759 2 3.9616694464984792e-01 2.7539456960359395e+01 1.0156517527325532e+01 7.2848106393189465e+00 -1 0 0 +559 1 -7.6802716399825677e-01 2.5314039050599870e+01 1.4074321651001933e+01 6.4730245007519622e+00 0 0 0 +561 2 3.7947197609714545e-01 2.5773924435289068e+01 1.4104908221359842e+01 7.3426255188206442e+00 0 0 0 +2048 2 3.3591653857891007e-01 2.6130737768723165e+01 1.3963141533124302e+01 4.6591233878349740e+00 0 0 1 +1623 2 3.3553535013638147e-01 2.3138636559317027e+00 8.9397229842037773e-01 1.2855145624292841e-01 0 0 1 +2047 1 -7.0776349214812362e-01 2.6594343953738139e+01 1.4706967508049495e+01 4.1879832928810821e+00 0 0 1 +2871 2 3.5675816071708077e-01 2.6911060654405620e+01 1.1711113956614183e+01 1.4175830917304237e+00 0 0 1 +1379 2 3.7241022699859389e-01 2.9281223062034392e+00 3.6528369544011947e+00 1.5515745498743394e+00 1 1 0 +2863 1 -7.2210570654265871e-01 2.5501068128887301e+01 1.2537161650963242e+01 8.9119591835198164e-01 0 0 1 +1327 1 -7.9225778065681240e-01 2.8811271119403859e+01 1.4901043031405694e+01 6.2030426088140684e+00 0 0 0 +228 2 4.0263595287173426e-01 5.9708137404961015e+00 1.0298900434273990e+00 7.7292692797755957e-01 0 0 0 +1495 1 -7.4698069194326755e-01 5.7133136422425741e+00 3.3509113292494890e+00 7.7236616434180014e+00 1 1 0 +1706 2 3.5283818767689318e-01 2.3690454189175880e+00 3.2404197638510954e+00 6.8417722693677980e+00 0 0 0 +1707 2 3.4478117026980820e-01 3.6857667798295326e+00 3.0473906768742740e+00 7.4777849585167786e+00 0 0 0 +1100 2 3.7628027277296727e-01 6.1575532700915261e+00 3.1089099103660129e+00 8.5453585887206884e+00 0 1 0 +117 2 3.9455890049263220e-01 1.8833110884786941e+00 5.9475010730976550e+00 7.8668284206495871e+00 0 0 0 +6 2 3.4014153576746908e-01 6.6653646394599662e+00 1.7006186811850021e+00 1.0874927030134137e+01 0 0 0 +4 1 -7.2571111880246442e-01 6.7333840652394521e+00 2.3787727470738345e+00 1.0219750954424841e+01 0 0 0 +1527 2 4.0100653288494820e-01 5.4528014673772898e+00 1.3956758948560801e+00 1.5307386648498444e+01 0 0 0 +151 1 -7.2910801690274551e-01 2.7262298784151353e+00 4.2955663940398221e+00 1.0510748319366119e+01 0 0 0 +153 2 3.7237597048485871e-01 2.6371530330396142e+00 4.0278556956960045e+00 9.5908798943605404e+00 0 0 0 +1119 2 3.8835260883331613e-01 4.4268410355053716e+00 4.7329718288267433e+00 1.0728787081880176e+01 0 1 0 +147 2 3.7708792650528411e-01 7.5267048627925659e-01 2.3059348787375873e+00 1.3112627078656976e+01 0 0 0 +1117 1 -7.5142747813406152e-01 5.1387664257184182e+00 4.9803723392331127e+00 1.1342304349160040e+01 0 1 0 +1118 2 3.6271966363746028e-01 5.4984890411492540e+00 5.8908091924721653e+00 1.1127059252087154e+01 0 1 0 +1123 1 -7.4006805555028954e-01 6.3042443441123792e+00 7.2148468774146242e+00 1.0319917218624509e+01 0 1 0 +5 2 3.0950048252677159e-01 6.1984768332792770e+00 3.0689625281473445e+00 1.0689680908331225e+01 0 0 0 +2433 2 3.6790902828033573e-01 4.1653063962835608e+00 6.3273345186813721e+00 1.3999319382857966e+01 0 1 0 +2431 1 -7.3438271689388468e-01 4.7187226779524876e+00 5.4769634480967486e+00 1.3945376600475882e+01 0 1 0 +2432 2 3.9084393881077384e-01 4.7398138108415253e+00 5.1990830606188325e+00 1.2995460855747162e+01 0 1 0 +152 2 3.3992824104581582e-01 2.4155991985277527e+00 3.5382690774085708e+00 1.0987691593868808e+01 0 0 0 +857 2 3.8124271137402527e-01 2.4747479270569568e+00 6.6203061567186445e+00 1.0887159393930956e+01 0 0 0 +923 2 3.2869068578915284e-01 6.3697320057901470e+00 6.6784125010570463e+00 1.3501034206207150e+01 0 1 0 +1525 1 -7.5992241024094487e-01 4.5103057463138860e+00 1.1475765232913371e+00 1.5133305617863787e+01 0 0 0 +856 1 -7.2800469554517955e-01 2.2942863580243062e+00 7.5346055017169800e+00 1.0829874489228526e+01 0 0 0 +858 2 3.4450384066690903e-01 2.7729168460391116e+00 7.8972231176541925e+00 1.1679026265479433e+01 0 0 0 +120 2 3.5154660324048509e-01 2.3446515644617008e+00 1.6742848679669022e+00 1.4471381758370747e+01 0 0 0 +118 1 -7.1973118402817282e-01 1.6337449119010632e+00 1.1435179646868354e+00 1.4125673846681433e+01 0 0 0 +1705 1 -7.4619529430445708e-01 2.8020966808238748e+00 3.3596387585687006e+00 7.6862162452808773e+00 0 0 0 +792 2 3.8162134395491909e-01 4.7476299851296516e-01 7.5080694733013980e+00 1.1117422277791169e+01 0 1 0 +145 1 -7.2456733119125016e-01 9.7035303704488512e-02 2.8037480815284308e+00 1.2502648753185213e+01 0 0 0 +146 2 3.6960101144384100e-01 3.3213958954874911e-01 3.7881333174906344e+00 1.2651781996324514e+01 0 0 0 +885 2 3.6343115339204518e-01 3.9216228535512293e-01 5.7211140002981447e+00 1.2421215920920250e+01 0 1 0 +733 1 -7.2939243403239429e-01 1.0591558935808338e+00 5.2316792952360576e+00 1.3040137299130430e+01 1 0 0 +734 2 3.7885173336262007e-01 7.7356250970958040e-01 5.2155320245704964e+00 1.3943828663846643e+01 1 0 0 +2326 1 -7.5959298392515695e-01 3.4747639361285931e+00 7.7758768787384263e+00 1.3523957449850817e+01 0 1 0 +2118 2 3.7032656930185393e-01 7.7843948181891809e-01 6.7423516357047797e+00 1.4849541735561921e+01 1 0 0 +1871 2 3.7742868774015342e-01 1.2907370063895211e+01 4.4263912919383808e+00 1.5492392870088166e+01 0 0 0 +2205 2 3.5816460566448205e-01 2.8946845771120604e+01 1.2627751108813840e+01 9.1250146354086610e+00 0 0 1 +1641 2 3.4073380398166719e-01 7.1111993645099947e+00 1.1366622304192653e+01 1.5359188902057735e+01 0 0 0 +1208 2 3.6388529937889968e-01 2.5056081596788722e+01 1.4584530002965888e+00 1.1020268642399330e+01 0 1 0 +1125 2 3.5950591727482978e-01 6.8748449510385647e+00 6.4533818108221057e+00 9.8958183731961320e+00 0 1 0 +1124 2 3.6079497036949704e-01 6.8670303828595243e+00 7.5817382274248049e+00 1.1016727356105484e+01 0 1 0 +75 2 3.8204465030924051e-01 7.1142711055162033e+00 7.4286205407604458e+00 1.4657265748022505e+01 0 0 0 +1699 1 -7.2931258945533617e-01 8.0658743106840500e+00 5.4073124961907117e+00 9.4539036839712871e+00 0 0 0 +1701 2 3.7159147156970163e-01 8.2335210912987247e+00 4.7266377202255532e+00 1.0177642672103413e+01 0 0 0 +830 2 3.5956669984241846e-01 1.3400883293480890e+01 2.3588279160837056e+00 8.0615325900692927e+00 0 1 0 +73 1 -7.5694911019102484e-01 7.2938075580930937e+00 6.8554873823714217e+00 1.3873973895860502e+01 0 0 0 +848 2 3.5315011637445082e-01 7.6614448452830199e+00 8.0302126081544554e+00 1.2642514058156374e+01 0 0 0 +101 2 3.6642454244934813e-01 7.2517605405166901e+00 1.2005813022855081e+00 1.3975943969519834e+01 0 0 0 +217 1 -7.0702430479286171e-01 1.0085707824014888e+01 6.5561230328896141e+00 8.0915255535996220e+00 0 0 0 +219 2 3.7622741341933796e-01 9.2985003663325791e+00 6.0191502568826607e+00 7.8377760739129236e+00 0 0 0 +820 1 -7.2553446153842394e-01 1.1880570912905165e+01 3.4432634914317197e+00 1.0382975998786526e+01 0 1 0 +822 2 3.4320117180500115e-01 1.2011507734689886e+01 3.1042560325459547e+00 9.4523576660266677e+00 0 1 0 +2937 2 3.2429534466538423e-01 2.9647128738089414e+01 1.5235459388641615e+01 5.9945384093753304e+00 0 0 1 +2293 1 -7.2726234223499353e-01 8.0404399513760083e+00 4.3439217238147378e+00 1.3755030513215200e+01 0 1 0 +2585 2 3.7659831892793261e-01 9.7960146545419313e+00 4.6050109223523279e+00 1.3951856085888535e+01 0 1 0 +2586 2 3.5592816744559364e-01 1.1356255901199329e+01 4.4804001893060894e+00 1.4228130964569861e+01 0 1 0 +2295 2 3.5623744243767957e-01 7.6461122285125604e+00 3.7650915357505688e+00 1.4455339332419513e+01 0 1 0 +567 2 4.0714735396839730e-01 2.1459914129644218e+01 9.0359099877329443e-02 1.1951506949480251e+01 0 0 0 +100 1 -7.1917012813285031e-01 7.1710414426954534e+00 1.5952229176299946e+00 1.4910248227520436e+01 0 0 0 +2300 2 3.7659586689290209e-01 1.0875148664424408e+01 3.5493398962347711e+00 1.0616015335094025e+01 0 1 0 +1559 2 3.5039867302626498e-01 1.0884136499129305e+01 7.0708785770579992e+00 1.3919477973256607e+01 0 0 0 +1522 1 -7.5891955514033194e-01 1.0306342379913511e+01 8.2620202951080319e+00 1.0775546187730539e+01 0 0 0 +1524 2 3.7292101546655892e-01 1.1131579343509493e+01 8.4596096396323102e+00 1.0284470239703452e+01 0 0 0 +53 2 3.6921541695409194e-01 8.8009057386326699e+00 3.9237712801575633e+00 1.1939014204161996e+01 0 0 0 +54 2 3.9677587277412490e-01 8.2006061888405046e+00 2.9551428942942040e+00 1.0984331249647768e+01 0 0 0 +52 1 -7.5399507143701594e-01 8.9736740142172291e+00 3.4644949499441897e+00 1.1129417096795120e+01 0 0 0 +1558 1 -7.0982689216245853e-01 1.0736636700935271e+01 8.0392435980254859e+00 1.3677296770396085e+01 0 0 0 +1523 2 3.5617246436127509e-01 9.8246901650007672e+00 7.7074572213170116e+00 1.0195397330490612e+01 0 0 0 +1560 2 3.7060906657481996e-01 1.0622419309330631e+01 7.9885487528953618e+00 1.2739077872884986e+01 0 0 0 +1035 2 3.5430395266288411e-01 1.1755990067763298e+01 1.5531919009169568e+00 1.4699794161400284e+01 0 1 0 +1033 1 -7.4239732885452370e-01 1.1462755227583308e+01 6.4250326314457440e-01 1.4811198729257669e+01 0 1 0 +849 2 3.2588457826761136e-01 8.4494469543540944e+00 8.7386137534629054e+00 1.1506531414782774e+01 0 0 0 +2584 1 -7.5666937390064370e-01 1.0587786945850189e+01 5.0905357888490519e+00 1.4303284175726585e+01 0 1 0 +193 1 -7.1287083432825538e-01 7.8382265342042690e+00 2.3779209227304340e-01 1.2514005498705270e+01 0 0 0 +1692 2 3.6522500943951181e-01 1.3534655771838898e+01 7.4176192148884805e+00 1.6295776923088712e-01 0 0 1 +1547 2 3.9166368478328889e-01 7.8127611458585022e+00 5.2785968207496676e+00 1.4085507762735677e+01 0 0 0 +1443 2 3.8374231033145811e-01 2.5998019544678456e+01 2.8394336364644585e-01 7.0548265690801184e+00 0 0 0 +832 1 -6.9673257579541992e-01 1.2840610249101658e+01 1.3841791945474853e+00 1.2181402975252579e+01 0 1 0 +833 2 3.5884040781426424e-01 1.2376086065692428e+01 1.8667618491299727e+00 1.1456946786471265e+01 0 1 0 +2642 2 3.6981504723344494e-01 2.7071245340385886e+01 1.2004734280878186e+01 1.3941196865662315e+01 0 0 0 +603 2 3.5243032749698672e-01 2.1323013615519361e+01 3.1366377295372072e-01 6.9373111750742895e+00 0 0 0 +1949 2 3.5927253244587376e-01 1.7627695566807684e+01 6.7390027859976085e+00 1.5169383768081236e+01 0 0 1 +56 2 3.5460786295729047e-01 1.5430802090070969e+01 6.6069356227314815e+00 8.0459831895907676e+00 0 0 0 +1998 2 3.8092999858822763e-01 1.3629256348678762e+01 6.2081487222913481e+00 9.7558929481132246e+00 0 0 0 +1996 1 -7.2640888473934240e-01 1.3165107561590442e+01 6.0337852110526731e+00 1.0569893871710724e+01 0 0 0 +2394 2 3.7955176869700491e-01 1.6528327719850296e+01 1.1576886767317813e+00 1.1896604473667898e+01 0 1 0 +2392 1 -7.6881336977051029e-01 1.5632143431262186e+01 9.0429830282334211e-01 1.2183148993929432e+01 0 1 0 +1997 2 3.6663644849215593e-01 1.2759100558626701e+01 5.0750909933917931e+00 1.0464243508742552e+01 0 0 0 +2393 2 3.8419389942242832e-01 1.5542558701553912e+01 1.1696011527051366e+00 1.3102245564015671e+01 0 1 0 +831 2 3.2987354907166927e-01 1.3756734760099002e+01 1.4251576584910015e+00 1.1767007872056187e+01 0 1 0 +343 1 -6.7059247534451183e-01 1.5178509152001014e+01 2.0862989205225126e+00 9.1205032185698958e+00 0 0 0 +345 2 3.3546865276217364e-01 1.5593169009727291e+01 1.8614151463305353e+00 9.9543209648358513e+00 0 0 0 +492 2 3.2163642474231885e-01 1.5072739477871830e+01 2.9379796849983619e+00 1.4599114764632004e+01 0 0 0 +490 1 -6.8923155762771027e-01 1.5870664080705264e+01 2.2946748312771486e+00 1.4622540169784720e+01 0 0 0 +344 2 3.2709224677898363e-01 1.5260077170758947e+01 1.1881908703163702e+00 8.7864480986886573e+00 0 0 0 +520 1 -7.1909122473513598e-01 1.7196179393454212e+01 5.3160814081286532e+00 7.4190619249913814e+00 0 0 0 +521 2 3.9324981174881513e-01 1.7515121661074613e+01 5.2364937919488321e+00 8.3752986681744126e+00 0 0 0 +522 2 3.7366943836384536e-01 1.7659531806788582e+01 6.1391560605467985e+00 7.1304365771098972e+00 0 0 0 +1756 1 -7.5920068941129171e-01 1.4658426527003499e+01 5.4131185264803490e+00 1.3029751411629096e+01 0 0 0 +1747 1 -7.6977085098305553e-01 1.2951722182284975e+01 3.4261101982938764e+00 1.3951502709799188e+01 0 0 0 +1749 2 3.8069646076011232e-01 1.3031148144009412e+01 2.5934113104381828e+00 1.3420560270630570e+01 0 0 0 +267 2 3.6472195954212816e-01 1.3423192309218713e+01 4.1516343738345025e+00 1.3468895058772269e+01 0 0 0 +356 2 3.4386349506320291e-01 1.6552260029851563e+01 4.3293187167755542e+00 1.2745163994997455e+01 0 0 0 +2478 2 3.3570330258088549e-01 1.5751225260829186e+01 1.5326252644421219e+01 1.3452394066409243e+01 0 0 0 +292 1 -7.6930786348559488e-01 1.7498856879713266e+01 4.4234803340157081e+00 1.2821595326717844e+01 0 0 0 +293 2 3.7740954655498354e-01 1.7626170157134943e+01 5.0554943057059312e+00 1.3559100941008857e+01 0 0 0 +1107 2 3.7509855283061289e-01 1.8344004032485415e+01 9.7556653751391431e-01 1.5364596329616360e+01 0 1 0 +1105 1 -6.7518709531011267e-01 1.8723242139432877e+01 4.3558395874367029e-01 1.4634747326163616e+01 0 1 0 +2125 1 -7.2564151296795454e-01 3.2825009797657576e+00 3.5620178750378977e+00 1.5105453773350597e+01 1 0 0 +43 1 -7.6895660931875232e-01 1.4525041166807853e+01 7.6337968708818593e+00 1.5062981791735449e+01 0 0 0 +1757 2 3.3649682619480270e-01 1.4240228224212217e+01 5.6841728368902089e+00 1.2158828663489908e+01 0 0 0 +509 2 3.5271511808719580e-01 1.4800378720215621e+01 6.2276266425671079e+00 1.3420897004972213e+01 0 0 0 +1380 2 3.5419580005962442e-01 1.8629586546026868e+00 3.5734243636620358e+00 4.3615791560615447e-01 1 1 0 +578 2 3.9713960387532932e-01 1.9423597927993939e+01 2.9087318733399328e+00 7.5262129406817797e+00 0 0 0 +367 1 -7.2710051161364753e-01 1.2416579314956541e+01 1.3715613318069197e+01 1.4282946030400939e+01 0 0 0 +511 1 -7.4512171403837524e-01 2.4803930176844077e+01 1.5302413347388612e+01 1.1822671179344709e+01 0 0 0 +2011 1 -7.4709735292318813e-01 1.8293031422855183e+01 5.9346095513880632e+00 1.5000140911255304e+01 0 0 1 +1475 2 3.7317206201114816e-01 1.8722213765556745e+01 1.6548596530678135e+00 1.1537800875257661e+01 0 1 0 +601 1 -7.3361955356670383e-01 2.1503320401422290e+01 5.9271631056304008e-01 7.9231840338727277e+00 0 0 0 +2187 2 3.9199351910503838e-01 2.0383710913812656e+01 1.8097855837437467e+00 8.0543115564475762e+00 0 0 1 +577 1 -7.1127677377745213e-01 1.9771472487393350e+01 2.5487891083800212e+00 8.3316328506980515e+00 0 0 0 +614 2 3.7407505471021024e-01 2.5086527208419309e+01 3.8100320200869837e+00 6.9347479762894189e+00 0 0 0 +2866 1 -7.1838721784639314e-01 2.2238867143818478e+01 6.6206143565943476e-01 1.4928980901267295e+01 0 1 0 +1474 1 -7.3385455535695043e-01 1.7918285931244117e+01 1.8130464925742915e+00 1.0997306604195431e+01 0 1 0 +1476 2 3.4120536749794717e-01 1.7757211567132394e+01 2.7166985286889385e+00 1.1133431815624004e+01 0 1 0 +1218 2 3.8295664823557690e-01 2.1369664604147701e+01 5.2399459239212680e+00 7.6448964751219899e+00 0 1 0 +688 1 -7.2755518245297979e-01 2.4293169407784752e+01 3.9273309354706862e+00 1.0643415684716048e+01 0 0 0 +1499 2 3.8499485474923101e-01 1.9764920848695187e+01 2.0728330953581264e+00 1.3749685454709892e+01 0 1 0 +1498 1 -7.2744822404421194e-01 1.9745330612381039e+01 2.5562014222464264e+00 1.2927390608295685e+01 0 1 0 +1258 1 -7.5280235702916753e-01 2.1617875467307812e+01 4.7266631525898264e+00 1.2180684242899421e+01 0 1 0 +1259 2 3.6065897597166990e-01 2.2531985320522988e+01 4.5834971460310134e+00 1.1847305831217536e+01 0 1 0 +1260 2 3.7948299592490964e-01 2.1251128340378809e+01 3.9240324328407725e+00 1.2406167656940005e+01 0 1 0 +516 2 3.6355959192629644e-01 1.8963523036386565e+01 4.9644183039953784e+00 9.8160073701109241e+00 0 0 0 +450 2 3.6319861548005317e-01 1.7848789498040787e+01 4.7885244433410792e+00 1.0916461708628269e+01 0 0 0 +514 1 -7.5075433757592747e-01 1.7987631123439659e+01 5.1223746744036243e+00 1.0033030945088347e+01 0 0 0 +543 2 3.4132266198773081e-01 2.3867112800622952e+01 1.6422617546848621e+00 1.5138059691781502e+01 0 0 0 +477 2 3.6838885712128094e-01 2.1428327513080283e+01 6.0937984323510017e+00 1.3625290474690019e+01 0 0 0 +1500 2 3.5740794308851537e-01 1.8960890627387890e+01 3.1658381752513125e+00 1.3002813973944345e+01 0 1 0 +540 2 3.8842943715533584e-01 1.9969925118498818e+01 6.1533798695849091e+00 1.4036472502277128e+01 0 0 0 +475 1 -7.2524608520236422e-01 2.0721609429132087e+01 6.7240774213857311e+00 1.3843706035189133e+01 0 0 0 +519 2 3.6530567454443974e-01 2.0367391722149197e+01 3.7827098785259343e+00 9.4710867505824847e+00 0 0 0 +518 2 3.8659561321700209e-01 2.0835639071694882e+01 4.8767936584255667e+00 1.0505604454054886e+01 0 0 0 +517 1 -7.2066827505495823e-01 2.0646024547525908e+01 4.7807012491235161e+00 9.5878601215390802e+00 0 0 0 +1463 2 3.7001165460315288e-01 2.5059579336733343e+01 4.2763792425139195e+00 1.2290755791753025e+01 0 0 0 +690 2 3.6693302663680660e-01 2.4310976815310109e+01 4.7688926171791550e+00 1.0023589800306729e+01 0 0 0 +305 2 3.7494168538359440e-01 1.8241266517473772e+01 7.0521986669749470e+00 1.0514820728488631e+01 0 0 0 +1427 2 3.6857040212391262e-01 2.3981080670517841e+01 7.8018909703968005e+00 1.4881169962592374e+01 0 0 0 +705 2 3.8425099015734254e-01 2.2158210635817589e+01 1.0129117115909334e+00 1.2994618483866436e+01 0 0 0 +541 1 -7.2403593484458073e-01 2.4818789731263312e+01 1.9865041075917433e+00 1.5121754790064486e+01 0 0 0 +1899 2 3.5006908968893219e-01 2.4629951035817367e+01 5.8571271246248955e+00 8.3141505342192570e+00 0 0 0 +1426 1 -7.3252070929554536e-01 2.4364470171787243e+01 7.0626678839497599e+00 1.4261751884869325e+01 0 0 0 +1428 2 3.8811277937038174e-01 2.5314987960777852e+01 7.3058943500301545e+00 1.4178682086942812e+01 0 0 0 +1414 1 -7.3360064589594565e-01 2.7550993312303770e+01 5.6656193425421897e+00 8.5318781731843671e+00 0 0 0 +1927 1 -7.1226092232480398e-01 1.9729614667682423e+01 1.5424098996174450e+01 1.4474084736050346e+01 0 -1 0 +689 2 3.5766754950756602e-01 2.5048967802606384e+01 3.5056094159587645e+00 1.0381098217008788e+01 0 0 0 +435 2 3.7931327983461433e-01 2.9446989394442696e+01 1.6218432754743712e+00 1.3276518359438416e+01 0 0 0 +2162 2 3.4970524972792255e-01 3.0881876535836799e+01 5.3481350682064557e+00 9.3333566602071443e+00 0 1 0 +542 2 3.5429491755211329e-01 2.4853376276356393e+01 2.6291827450099525e+00 1.4360183767796540e+01 0 0 0 +1462 1 -7.5273842885691056e-01 2.4961405255763978e+01 4.3820559262979417e+00 1.3252482556716789e+01 0 0 0 +1464 2 3.6588036398348228e-01 2.4675418213377018e+01 5.2665533818946253e+00 1.3521796518492849e+01 0 0 0 +433 1 -7.4496846761722701e-01 2.8815112296954197e+01 1.1197361386327909e+00 1.3787799256087547e+01 0 0 0 +790 1 -7.5639345045353734e-01 3.0908502199854400e+01 7.2335211641266817e+00 1.1809308959148076e+01 -1 1 0 +791 2 3.6378133514370009e-01 3.0163753828671656e+01 6.7203935794026775e+00 1.1419903438246410e+01 -1 1 0 +1898 2 3.5604854841982447e-01 2.5893725848115270e+01 5.6819508484033321e+00 9.2472145514554978e+00 0 0 0 +932 2 3.8928443975686011e-01 2.8884150973543537e+01 5.1476857725271996e+00 1.1737063860324186e+01 -1 1 0 +1897 1 -7.4283557466891181e-01 2.4963791994829780e+01 6.0131427661728312e+00 9.2015076259513453e+00 0 0 0 +65 2 3.6082840563451934e-01 2.6885396675267820e+01 4.6028681473046484e+00 1.3481959750039932e+01 -1 0 0 +931 1 -8.1088513364181436e-01 2.9255858784630693e+01 5.3273925909343962e+00 1.0897493567716483e+01 -1 1 0 +619 1 -7.1897738960383728e-01 2.6129680901438498e+01 1.9080919771772891e+00 9.4393291344901300e+00 0 0 0 +621 2 3.4805877891152026e-01 2.6709713348679507e+01 1.1306369025534946e+00 9.4562024416560426e+00 0 0 0 +149 2 3.9863672181096071e-01 2.9710227484758057e+01 3.7273264779773094e+00 1.0386017198568913e+01 -1 0 0 +620 2 4.0245852268132121e-01 2.5757537478202931e+01 2.0588464877755692e+00 8.5413076989905914e+00 0 0 0 +64 1 -7.1031165311971567e-01 2.7835584228745912e+01 4.5979208713487276e+00 1.3304429629555900e+01 -1 0 0 +933 2 3.7767524248048312e-01 2.8529341729640390e+01 5.6097797335513393e+00 1.0327938664820277e+01 -1 1 0 +66 2 3.8410634538348182e-01 2.8208691812263652e+01 4.3345433020500499e+00 1.4146818622807317e+01 -1 0 0 +150 2 4.0268078220208936e-01 3.0587651121091721e+01 2.4562019655713105e+00 1.0913608954452620e+01 -1 0 0 +148 1 -6.3523680236714652e-01 3.0014261231985849e+01 2.8296976555733773e+00 1.0158711234295309e+01 -1 0 0 +1410 2 3.6647851066022674e-01 2.7488614868809975e+01 7.1557091370555070e-01 1.5224526324660104e+01 0 1 0 +565 1 -7.0889569352593951e-01 2.2228996263999704e+01 6.0238629867093429e-01 1.2108798677536178e+01 0 0 0 +632 2 3.6323187105566485e-01 2.5144041786703801e+00 9.4766086883921563e+00 8.2812127516801031e+00 1 0 0 +2361 2 3.4036869030220601e-01 2.9674900959485498e+01 1.4554021886093295e+01 1.2414896945940716e-01 -1 0 1 +175 1 -7.1256654098368699e-01 5.0510690378808478e+00 1.4054240563036581e+01 1.5192545137924117e+01 0 0 0 +2328 2 3.7945131769037721e-01 3.9755357360033243e+00 8.3278810059172610e+00 1.4157480598329165e+01 0 1 0 +176 2 3.9534833332635477e-01 5.3966204843848313e+00 1.3142753310221739e+01 1.5262334948571340e+01 0 0 0 +330 2 3.8113145336997034e-01 5.8265739962506391e+00 1.4525990156178503e+01 1.4974835903439269e+01 0 0 0 +2327 2 3.3778404717192428e-01 2.6210714833892559e+00 7.6150242495597000e+00 1.4009654743941478e+01 0 1 0 +62 2 3.9022171798512079e-01 2.4270912233213426e+00 1.4619355445812479e+01 1.0945158420731445e+01 0 0 0 +1041 2 3.9381067712012852e-01 4.1247444702289715e-01 1.5282437437760446e+01 1.0247937301268676e+01 0 0 0 +1351 1 -7.1844759922879664e-01 3.2647902595068965e+00 1.5019216694508511e+01 1.1275636723095214e+01 1 0 0 +2198 2 3.8695732532320609e-01 9.3302114669402680e-01 1.1426457102712940e+01 8.4224985261841550e+00 1 0 1 +974 2 3.6570859822813900e-01 3.4743395439333682e+00 1.2715522170313381e+01 7.1995715196440289e+00 0 0 0 +631 1 -7.3454660884554557e-01 2.3473583134333067e+00 9.9816407567125189e+00 9.0883602162905728e+00 1 0 0 +1088 2 3.4986801754381086e-01 2.3658031539947602e+00 9.2965667631731783e+00 9.7881976239072763e+00 0 0 0 +2199 2 3.3300954549302841e-01 1.4942537249128416e+00 1.2277814561966592e+01 7.3708249797022791e+00 1 0 1 +235 1 -6.9185039046371155e-01 2.7858714028179783e+00 1.1373552859314389e+01 1.1473971760379191e+01 0 0 0 +898 1 -7.1546013722357327e-01 4.5728877373402117e+00 9.7356503938037537e+00 1.5228266034106058e+01 0 0 0 +900 2 3.8551458325678650e-01 4.0662714882203721e+00 1.0534941764101706e+01 1.4941000064104637e+01 0 0 0 +600 2 3.7616842927993599e-01 3.8592090106160084e+00 1.1258886749178458e+01 8.8955421940629442e+00 1 0 0 +69 2 3.5437298951555540e-01 3.0175793727847826e+00 1.1344702898904723e+01 1.3249419028151904e+01 0 0 0 +1353 2 3.6261572656089902e-01 3.8907736665690482e+00 1.4969924434423264e+01 1.0517398272303460e+01 1 0 0 +67 1 -7.5721933547325304e-01 2.7977829457583492e+00 1.1595097936647573e+01 1.4202652389008371e+01 0 0 0 +598 1 -7.4548411408638593e-01 4.6085102326547531e+00 1.1671350202005954e+01 8.5945596401325108e+00 1 0 0 +2097 2 3.2616634809562145e-01 5.1932452087937717e+00 1.1628802911703145e+01 9.4141628986432853e+00 1 0 1 +2402 2 3.3232902575633561e-01 2.9203238072282449e+00 1.0537214466214817e+01 1.0955919204746792e+01 0 0 1 +237 2 3.6117813687213041e-01 3.7306249546188499e+00 1.1674842950233487e+01 1.1600395594646823e+01 0 0 0 +68 2 3.7369642806847442e-01 2.3291316493498266e+00 1.2501622035907316e+01 1.4144076842591076e+01 0 0 0 +2116 1 -7.7467702004768768e-01 8.2509460147234337e-01 7.7332871707655277e+00 1.4708910945969693e+01 1 0 0 +1040 2 3.6824975972104207e-01 6.7726099912866222e-01 1.3934154697437014e+01 9.4292664487016502e+00 0 0 0 +1039 1 -7.1915875524611683e-01 7.7061219812285620e-01 1.4407170423297879e+01 1.0281047320349066e+01 0 0 0 +2117 2 3.4165987529066466e-01 6.8809203875384128e-01 7.7099421116350584e+00 1.3707451004693933e+01 1 0 0 +2825 2 3.3634351290587594e-01 4.5731908619027911e-01 1.0013474287264552e+01 1.3886569726088378e+01 1 0 0 +706 1 -7.7577799668990832e-01 5.3402842681625984e+00 8.8242451468595107e+00 8.0314052894323549e+00 1 0 0 +707 2 3.6197410070447383e-01 5.4133691767784029e+00 8.1890158701469744e+00 8.7881009544477156e+00 1 0 0 +416 2 4.0897508337024036e-01 1.8938881161337186e+01 1.5423961340711873e+01 7.4916310555025651e+00 0 0 0 +1515 2 3.4854657550425927e-01 5.2407497151329068e+00 9.7038874935259685e+00 8.3966252068746865e+00 0 0 0 +2197 1 -7.3270182105120618e-01 8.3638097207326800e-01 1.2301219737199974e+01 8.1123058565547019e+00 1 0 1 +342 2 3.6869306631487608e-01 7.9752491031405643e+00 1.0593815814522161e+01 8.4267344213652517e+00 0 0 0 +1820 2 3.4835300792302981e-01 7.9080190360120870e+00 1.3742529101460926e+01 1.4836547168486410e+01 0 0 0 +1396 1 -6.8160967262519656e-01 2.9199425610566159e+01 5.1557316302804956e+00 4.6058973490166810e-01 0 1 0 +1971 2 3.4378221006170773e-01 4.2691464692347942e+00 4.2911180777030433e-01 1.3541214377972180e+01 1 1 0 +864 2 3.6221396727336957e-01 5.4011107038344548e+00 1.3622666988440319e+01 8.6630142516521040e+00 0 0 0 +862 1 -7.2312990450742654e-01 5.3164288643742870e+00 1.4508037162843033e+01 9.1832503475579799e+00 0 0 0 +179 2 3.6983465043738645e-01 8.3681498642717074e+00 1.5287477348211810e+01 1.0932559507091939e+01 0 0 0 +368 2 3.7384765574432249e-01 1.2113975015615358e+01 1.4373441936166605e+01 1.3613044619767901e+01 0 0 0 +847 1 -7.4625410459184238e-01 7.6114411201264192e+00 8.8345758186914498e+00 1.2031997872207691e+01 0 0 0 +1556 2 3.4607933991430101e-01 8.4894321682405600e+00 1.3260036097534050e+01 1.3453906753586784e+01 0 0 0 +1849 1 -7.5826327946819061e-01 8.2219713509954904e+00 1.0534883720263394e+01 1.4261587656728096e+01 0 0 0 +875 2 3.4628831556292750e-01 6.2036199822241187e+00 1.0816092574783342e+01 1.1756085309391285e+01 0 0 0 +874 1 -7.6721271103192745e-01 5.5006746482693147e+00 1.1429298196254583e+01 1.1461487068386344e+01 0 0 0 +1850 2 3.4368576799360379e-01 8.5532727468126719e+00 1.1371405936897432e+01 1.3878305151510423e+01 0 0 0 +1352 2 3.6099020013418986e-01 5.8634257921349411e+00 1.2273479037391111e+01 1.1527736381924981e+01 1 0 0 +697 1 -6.7372755743035562e-01 9.5368907373516105e+00 1.3728358780387213e+01 7.5879373029887853e+00 1 0 0 +1819 1 -7.2384686721009794e-01 7.7749767883787735e+00 1.3744469529055349e+01 1.3854457093015277e+01 0 0 0 +863 2 3.7101867574652236e-01 6.0616787569562973e+00 1.4440997872349303e+01 9.8370058480532414e+00 0 0 0 +1889 2 3.7154349698977801e-01 1.0569027162466815e+01 1.2225452339569722e+01 1.2187159933206958e+01 0 0 0 +259 1 -7.3907422426271996e-01 9.2212299334563479e+00 1.1011001983258442e+01 9.5277153321190706e+00 0 0 0 +261 2 3.3123664523105278e-01 1.0019057265055931e+01 1.0799423178478612e+01 8.9854322204571613e+00 0 0 0 +995 2 3.1441156819427241e-01 9.2962010878406485e+00 1.0252617092324030e+01 1.0084691998616259e+01 0 0 0 +1034 2 3.8202031942421089e-01 1.2236019915196165e+01 2.0685842576854424e-01 1.5127120751213184e+01 0 1 0 +699 2 3.9128160412870866e-01 1.0226361816213313e+01 1.4417677632816389e+01 7.8262147116734138e+00 1 0 0 +2623 1 -7.8518436937249569e-01 7.3251743975931358e+00 1.3703751981950591e+01 1.1060579822248586e+01 0 1 0 +1888 1 -7.5230914550575378e-01 9.5714256225588858e+00 1.2192901377913387e+01 1.2098450530410913e+01 0 0 0 +1890 2 3.7826304768593366e-01 9.4246157725069910e+00 1.1844281426848662e+01 1.1243283609994752e+01 0 0 0 +2624 2 3.6799455844006079e-01 7.2220783572003864e+00 1.3822915732590209e+01 1.1987387143676774e+01 0 1 0 +2625 2 3.7047237374636399e-01 8.2147933065206811e+00 1.3487682189002763e+01 1.1022853040391489e+01 0 1 0 +1851 2 3.7557884113773271e-01 8.0098905038594843e+00 9.9884053512695825e+00 1.3496647955433131e+01 0 0 0 +2299 1 -7.4935019161293304e-01 1.2108997577930463e+01 9.3578992994288690e+00 8.8624506400222973e+00 0 1 0 +1703 2 3.5213714684172709e-01 1.2600364127449541e+01 1.2378754731062484e+01 1.3174034048480326e+01 0 0 0 +1702 1 -7.3445128669028947e-01 1.2352568694707379e+01 1.1536266125690561e+01 1.2635485852958809e+01 0 0 0 +1797 2 3.9086193618279358e-01 1.2929499620837738e+01 1.0904275148930514e+01 1.3028315991352713e+01 0 0 0 +335 2 3.8436601110728097e-01 1.2790915079262431e+01 1.0950884681179991e+01 9.3226942830891133e+00 0 0 0 +336 2 3.7749356398398981e-01 1.2994880735222880e+01 1.1519746584911347e+01 1.0834419198523271e+01 0 0 0 +334 1 -6.9194193699388473e-01 1.3070709353243952e+01 1.1736784095631251e+01 9.8966579973736319e+00 0 0 0 +1685 2 3.6794997010952657e-01 7.7724225295432223e+00 1.0794020274007613e+01 1.9980259744134663e+00 0 0 1 +537 2 3.7617949555891889e-01 3.0352608007898755e+01 1.5292762429650033e+01 1.3611914768050639e+01 0 0 0 +375 2 3.5985771637074726e-01 1.4050934342318588e+01 9.8507658621470711e+00 6.3699004785784918e+00 0 0 0 +436 1 -6.9628992781636767e-01 1.7861427948118685e+01 1.4005275285175220e+01 1.0087469238618057e+01 0 0 0 +2465 2 4.1049144451903985e-01 1.1053064864600064e+01 7.9770982711656047e-01 2.2060582074997805e+00 0 1 0 +2477 2 3.5334407817839336e-01 1.6983953987250555e+01 1.4789005891330811e+01 1.4000184816240790e+01 0 0 0 +1207 1 -7.2685808496485005e-01 2.5068993021377405e+01 7.1517949332431752e-01 1.1646346191865806e+01 0 1 0 +2301 2 3.5587697542778574e-01 1.2899300625474321e+01 9.0347428312602815e+00 8.2532099987662626e+00 0 1 0 +2464 1 -7.6547446209804382e-01 1.0803626904458927e+01 1.7415316898854185e+00 2.1278171410067301e+00 0 1 0 +1049 2 3.7618877708325776e-01 5.6525939448965365e+00 1.5470483925689594e+01 4.3424559501640170e+00 0 0 0 +2508 2 3.6626666131299679e-01 1.2419309659202666e+01 8.9877037724421296e+00 1.3186787138226194e+01 0 1 0 +347 2 3.8832070273161101e-01 1.7536610563872866e+01 8.6584416778594342e+00 1.4864686067386366e+01 0 0 0 +1378 1 -7.2407938002267280e-01 2.5198976932286881e+00 3.0459831679154385e+00 8.4447489177580748e-01 1 1 0 +2507 2 3.4796346709787190e-01 1.3415241860187432e+01 8.9266991728841596e+00 1.2056842476039316e+01 0 1 0 +491 2 3.6802830129143027e-01 1.6546261003130770e+01 2.8622352328216270e+00 1.4957035963695160e+01 0 0 0 +44 2 3.5170765723501285e-01 1.4233628718958199e+01 8.2605359337797601e+00 1.4352839044873956e+01 0 0 0 +2506 1 -7.6317509688909824e-01 1.3307926903842354e+01 9.2412988590119980e+00 1.2980159702996358e+01 0 1 0 +2445 2 3.8910472272986035e-01 1.4150829933315288e+01 1.4082554114346150e+01 8.3164131937419423e+00 0 0 0 +2444 2 3.7597674789307645e-01 1.3410647645922783e+01 1.3800511309957566e+01 9.5912670583587065e+00 0 0 0 +2443 1 -7.0695820898623263e-01 1.3591216817836305e+01 1.4508245843689529e+01 8.9772679054738855e+00 0 0 0 +1679 2 3.9415597946906744e-01 1.7002627673007073e+01 1.2643479626950681e+01 9.1738436528182632e+00 0 0 0 +294 2 3.7677434630057410e-01 1.7499630436375082e+01 1.0050748771611607e+01 1.2911418550692350e+01 0 0 0 +2322 2 3.2454267056843245e-01 1.4418146245027749e+01 7.7528064629374400e+00 1.0603328670803052e+01 0 1 0 +1236 2 4.1591465031405017e-01 1.7038090739215136e+01 1.0212083559286407e+01 8.8210327502874826e+00 0 0 0 +1234 1 -7.0181594927675783e-01 1.6910844522357635e+01 9.3334833730111821e+00 9.0614270710616918e+00 0 0 0 +2320 1 -7.7995955009736828e-01 1.4564659966903978e+01 8.7119669984032271e+00 1.0394426096987834e+01 0 1 0 +2321 2 3.2706515324009028e-01 1.3914541178163393e+01 8.9283197438642361e+00 9.7040632582504482e+00 0 1 0 +1235 2 3.6000161630653205e-01 1.5922382217166840e+01 9.2636062839886115e+00 9.4017718976185218e+00 0 0 0 +192 2 3.7863753918516846e-01 1.5795994234107379e+01 1.0013697455798233e+01 1.1414632202568395e+01 0 0 0 +225 2 3.5900476150387772e-01 1.8424084703550506e+01 8.1329111016575091e+00 6.1039447215342895e+00 0 0 0 +190 1 -7.6440824714737277e-01 1.6212701087864936e+01 1.0753573118072811e+01 1.1800204804492413e+01 0 0 0 +191 2 3.6426841542444666e-01 1.6096934002153485e+01 1.1390818153436520e+01 1.1117083763735293e+01 0 0 0 +464 2 3.3345857964535902e-01 1.6533493286225973e+01 1.2100672942793659e+01 1.3391494518708470e+01 0 0 0 +1678 1 -7.4542523415333728e-01 1.6340555987389582e+01 1.1993857169746310e+01 8.9562111676013973e+00 0 0 0 +1680 2 3.7797532836806036e-01 1.5890575282685097e+01 1.2281921236486545e+01 8.2100808005516992e+00 0 0 0 +265 1 -7.2792815830226498e-01 1.8053227773245663e+01 9.3399328369175585e+00 1.3341691701114369e+01 0 0 0 +1629 2 4.0207408133331468e-01 3.7525524134059589e+00 4.1945307319817848e+00 1.4528339249235058e+01 0 0 0 +463 1 -7.1928622889755167e-01 1.7248864875875505e+01 1.2664574242922360e+01 1.3819109714817531e+01 0 0 0 +1821 2 3.5318199884344503e-01 1.7987912599434498e+01 8.5728177173768749e+00 1.2695167140692295e+01 0 0 0 +465 2 3.9282018413119174e-01 1.8038071129362386e+01 1.2682127503630825e+01 1.3205666115817445e+01 0 0 0 +438 2 3.6262695588460714e-01 1.8639554917877131e+01 1.3557804478367318e+01 1.0588356249900754e+01 0 0 0 +437 2 3.8069747748786925e-01 1.7632612931389684e+01 1.4850547478971897e+01 1.0657604169213638e+01 0 0 0 +348 2 3.5849033921804402e-01 1.6076875177668288e+01 8.1604527645670508e+00 1.5325095379922852e+01 0 0 0 +2684 2 3.8165231504517405e-01 2.0370591487101755e+01 1.3046331621233044e+01 1.2442167957333156e+01 0 0 0 +2685 2 3.6716241882986833e-01 1.9444306985277990e+01 1.4237067004688502e+01 1.2986582256910832e+01 0 0 0 +2683 1 -7.2729365554285530e-01 1.9407295761853856e+01 1.3405376665675909e+01 1.2416062788389333e+01 0 0 0 +1299 2 3.5662067612573489e-01 2.1511128828889710e+01 8.3664829944472050e+00 1.2878807838265264e+01 0 1 0 +1297 1 -7.8038793636572479e-01 2.2133032912490517e+01 9.0628496499327920e+00 1.2664604505005762e+01 0 1 0 +369 2 3.7700999843324917e-01 1.1680050854260362e+01 1.3674395632821453e+01 1.4869813829585434e+01 0 0 0 +223 1 -7.0432946310929068e-01 1.8854239159834265e+01 7.4548083806965701e+00 6.5982823053108541e+00 0 0 0 +306 2 3.9116104018299891e-01 1.8137828835965667e+01 8.5378840045810875e+00 1.0171322109686470e+01 0 0 0 +216 2 3.7407262888710491e-01 2.1851238764469500e+01 1.3498802481852247e+01 1.0073563374735084e+01 0 0 -1 +2903 2 3.6697304517318297e-01 2.4754134515445305e+01 7.5329058594875944e+00 1.0809023206215731e+01 0 1 1 +2818 1 -7.5464418300264435e-01 2.3178456689671755e+01 1.4653008311281141e+01 1.4783164273894650e+01 0 0 0 +304 1 -7.4900016640674760e-01 1.8546635977164048e+01 7.9079602000544309e+00 1.0824929005761328e+01 0 0 0 +215 2 3.6461639849292388e-01 2.2384672803760374e+01 1.2353447380936000e+01 9.3456918184227487e+00 0 0 -1 +1771 1 -6.9945300201792360e-01 2.4046967718602335e+01 1.2121887617509843e+01 8.2376687707388125e+00 0 0 0 +2091 2 3.5092494554714743e-01 3.8290290067108770e+00 1.4667353589554441e+01 4.7654658315901333e-01 1 0 0 +357 2 4.0003205593279401e-01 2.4928996728156832e+01 9.8558011994321664e+00 1.0980002832701787e+01 0 0 0 +2060 2 3.8162999792195684e-01 2.2000437013527819e+01 1.1863156510915559e+01 1.5190051362214954e+01 0 0 0 +476 2 3.6931796488627072e-01 2.2944145117267688e+01 8.8501336859294213e+00 1.3082555903369343e+01 0 0 0 +539 2 3.9721062311427563e-01 2.0116610008006489e+01 8.2230001853087984e+00 1.0482880295579346e+01 0 0 0 +2081 2 3.7162549465230527e-01 2.1033819751188460e+01 1.0438444646746214e+01 7.5940513801972971e+00 0 0 0 +566 2 3.2754303058235495e-01 2.1625340373215931e+01 8.4916514376649364e+00 1.0841286836116350e+01 0 0 0 +2661 2 3.6520916481788801e-01 2.1794398977913627e+01 1.1205390879030327e+01 1.2742696462033910e+01 0 0 0 +2659 1 -7.3199643929306590e-01 2.1766278273622181e+01 1.2062785442966065e+01 1.3228902446727293e+01 0 0 0 +538 1 -6.8738599585666416e-01 2.1051957186109437e+01 8.2330807363867518e+00 1.0062721727541366e+01 0 0 0 +2679 2 3.4337609102700573e-01 2.2697596936349349e+01 1.2351395432047699e+01 1.3024946648562894e+01 0 0 0 +743 2 3.6321216341445989e-01 2.0637042975477872e+01 1.1283999243175000e+01 9.2446869920364598e+00 0 0 0 +744 2 3.6492990438233003e-01 2.0790529728540090e+01 9.6768202240555077e+00 9.4545415539637307e+00 0 0 0 +742 1 -6.9910926044188471e-01 2.0249225932928244e+01 1.0460038352663576e+01 8.9427573607720099e+00 0 0 0 +214 1 -7.3819453976054428e-01 2.1833412337973130e+01 1.2574418146008139e+01 1.0066659124827012e+01 0 0 -1 +2904 2 3.3747869463845837e-01 2.3456844808901081e+01 8.4346530516689331e+00 1.1340364575618912e+01 0 1 1 +2902 1 -6.9652996043492099e-01 2.4444775969407988e+01 8.2713960771545221e+00 1.1410153869487301e+01 0 1 1 +2150 2 3.6355431465394411e-01 1.5401705396129437e+00 1.5483672391355634e+01 6.0537436598866821e+00 1 0 1 +599 2 3.8656076985198329e-01 2.9626195230369184e+01 9.6166167997728706e+00 1.2407232060777559e+01 0 0 0 +508 1 -7.2566005372054387e-01 2.7060530829894191e+01 1.2321907068767443e+01 1.2980927125187613e+01 0 0 0 +633 2 3.7572529492007356e-01 3.0110266392792226e+01 1.2993961531209360e+01 8.1571098017301349e+00 0 0 0 +2545 1 -7.6549095752588614e-01 2.4501785395416483e+01 1.2539484283209120e+01 1.2322059640204825e+01 0 0 0 +2547 2 3.8334195697522183e-01 2.4458562167604533e+01 1.3459791514414610e+01 1.2019234351476994e+01 0 0 0 +360 2 3.6567013913170665e-01 2.6034319251757939e+01 1.0866260586438253e+01 1.0615698441911004e+01 0 0 0 +2546 2 3.8204766713781108e-01 2.4448820912791941e+01 1.1928747533378550e+01 1.1509976079495136e+01 0 0 0 +1371 2 3.7922816854004460e-01 2.8892033986313628e+01 1.3296748843700371e+01 1.3139676194859646e+01 0 0 0 +324 2 3.7804058289877623e-01 2.8045388837938837e+01 1.0362956781269546e+01 1.0966335639341752e+01 0 0 0 +1513 1 -7.2430023342488414e-01 2.8881320118970088e+01 9.1041277390575210e+00 1.1994439370381899e+01 -1 0 0 +1209 2 3.6441290231988888e-01 2.4074791303539190e+01 8.2571344459664209e-01 1.1862709696153372e+01 0 1 0 +2867 2 3.3367087750989155e-01 2.1933261226144282e+01 1.4430897465590604e+00 1.5337873311969894e+01 0 1 0 +726 2 3.6686138816262709e-01 2.6720980896046598e+01 1.4626232759462358e+01 9.2802711162368201e+00 0 0 0 +2842 1 -7.8624468131457681e-01 2.7232480962626724e+01 1.0845559515884709e+01 1.5373328913467384e+01 0 0 0 +696 2 3.6054808539297123e-01 2.7793969361930291e+01 7.6259855775402254e+00 1.4944171960632884e+01 0 0 0 +1369 1 -7.4256077125336828e-01 2.9803870731787580e+01 1.3305936847377534e+01 1.3411588260019409e+01 0 0 0 +694 1 -7.1706463366983519e-01 2.7156586492888376e+01 7.9883996773441774e+00 1.4295256096137743e+01 0 0 0 +323 2 3.7195855152570956e-01 2.7748777322164095e+01 1.1830503224226787e+01 1.1382950676740167e+01 0 0 0 +695 2 3.7124602497091064e-01 2.7719706022336297e+01 8.4919202452640921e+00 1.3681935636205370e+01 0 0 0 +1514 2 3.3933637568221964e-01 2.9244700970521720e+01 8.5963009096932481e+00 1.1263828767558987e+01 -1 0 0 +510 2 3.8828823839584120e-01 2.6075368031705707e+01 1.2310988791367421e+01 1.2640872847247850e+01 0 0 0 +724 1 -7.4511947281101720e-01 2.5808929774370789e+01 1.4484311885958050e+01 9.0710492431024345e+00 0 0 0 +2826 2 3.4887634552912389e-01 5.9193304107028055e-01 1.1066701119073434e+01 1.2820465662405345e+01 1 0 0 +2824 1 -7.5927476105466352e-01 3.1028903563827427e+01 1.0527702429881463e+01 1.3263943547969522e+01 0 0 0 +2820 2 3.7680495638587247e-01 2.7198103327062668e+01 1.0007304625255401e+01 1.5022055025560837e+01 0 0 0 +355 1 -7.4087532910863818e-01 2.5065694721935749e+01 1.0732818529069602e+01 1.0531887179220396e+01 0 0 0 +1370 2 3.4983799635826440e-01 3.0024031504195523e+01 1.2365774545705298e+01 1.3552683999184932e+01 0 0 0 +1772 2 3.6575589708809214e-01 2.4452498441039850e+01 1.2881998712136237e+01 7.7199011432608176e+00 0 0 0 +770 2 3.0514881990206211e-01 2.7043323742653396e+00 1.5385836115352269e+01 3.7684308975494005e+00 0 0 0 +1928 2 3.6744256412349430e-01 1.9015268991040973e+01 1.5328149726063067e+01 1.5092092926297921e+01 0 -1 0 +618 2 3.8371631137463069e-01 1.7283132603655634e+01 1.1639274473160445e+01 1.5411448380872919e+01 0 0 -1 +1398 2 3.6170274436740163e-01 2.8344713847646990e+01 4.6570878052941138e+00 4.1436624389794313e-01 0 1 0 +2077 1 -6.9112585706452034e-01 2.0332731357558455e+01 9.1701180155735926e+00 1.5371016053672376e+01 0 0 0 +2760 2 3.5269778250415618e-01 1.3919531869932301e+01 3.9832781067599221e-01 3.3263240469941745e-02 0 1 1 +2360 2 3.4047980808683631e-01 3.0925661301778430e+01 1.3754547587631775e+01 2.4433814371848030e-02 -1 0 1 +1716 2 3.4898581950663687e-01 2.0414648143923635e+01 6.0070979551118855e+00 2.2458159776908376e-02 0 0 0 +2495 2 3.8380415923813643e-01 1.2140772796270996e+01 1.5044179570579624e+01 1.9111398600325018e+01 0 0 0 +1510 1 -7.5087682457039318e-01 3.0366012304851388e+01 6.1425731923167015e-01 2.2613501028601558e+01 -1 0 0 +1399 1 -7.3768371946575073e-01 1.6036239048419159e+00 4.0672114579694050e+00 1.7352383834671262e+01 1 1 0 +1400 2 3.9908454065479759e-01 2.2469667070937702e+00 3.8278551127389129e+00 1.6637850643092481e+01 1 1 0 +1512 2 3.7789271319007245e-01 1.1188339514775696e+00 3.1944434011273817e+00 1.7370035174685299e+01 0 0 0 +721 1 -7.5018429578768908e-01 1.8031644249929522e+00 1.6133111032942060e-01 2.0247364996942810e+01 1 0 0 +667 1 -7.3286889311415315e-01 5.3080738250166161e-02 5.2318713355838966e+00 1.5585876800557909e+01 1 0 0 +1489 1 -7.3908919336096490e-01 1.9485635399818588e-01 4.3228418464458418e+00 2.0155165992122306e+01 1 1 0 +1491 2 3.4964605628851708e-01 4.6497595408908804e-01 4.0032993099037570e+00 1.9282687909750742e+01 1 1 0 +2182 1 -7.5543509374757967e-01 2.3278267931767402e+00 5.2002967180338544e+00 2.2910361225889229e+01 1 0 0 +1490 2 3.1827242776042053e-01 7.3452297627354446e-01 5.1186662985752998e+00 2.0350056541337807e+01 1 1 0 +1731 2 3.5388933782086229e-01 5.5843392737237787e+00 6.0418140928456792e+00 1.8155919825881185e+01 0 0 0 +1076 2 3.5925501011934230e-01 3.1067739134570624e+00 4.4736987664420358e+00 1.9385540613216282e+01 0 1 0 +1628 2 3.5683532717327937e-01 3.5001120784175699e+00 2.7890180412728469e+00 2.1700652288420351e+01 0 0 0 +1627 1 -7.2273125880781386e-01 3.9835327298466581e+00 2.3352342284873102e+00 2.0971434826072894e+01 0 0 0 +2302 1 -7.0671176857821183e-01 4.5156038197760315e+00 7.2556119695501851e+00 1.7102214893634791e+01 0 0 0 +2304 2 3.5902776632376993e-01 5.2375754720243934e+00 7.8796653845499849e+00 1.7042413429928562e+01 0 0 0 +1730 2 3.9122348771072701e-01 1.6159253099446187e+00 8.9409708084989450e-02 2.1191345524475746e+01 0 0 0 +2123 2 3.3328495684696835e-01 4.5959361664854512e+00 1.7706380801194286e+00 2.1455895706505316e+01 1 0 0 +18 2 3.8131770931075393e-01 5.1566534214106134e+00 5.9981878488765989e+00 2.2151131964849540e+01 0 0 -1 +1576 1 -6.6410084264859059e-01 4.9727258709300983e+00 1.8421900885191604e+00 1.8310105025334661e+01 0 1 0 +834 2 3.7529924274621479e-01 3.1009809600866177e+01 1.0638446673244799e+00 1.7570565363985121e+01 -1 1 0 +1077 2 3.4357885518072762e-01 2.7970410402511705e+00 4.9459460775930140e+00 2.0859845990047440e+01 0 1 0 +2768 2 3.6062790576513026e-01 2.2580455379630944e+01 1.5438392406888545e+01 2.3954633004980806e+01 0 0 0 +1075 1 -6.5499093433895306e-01 3.3425664832525501e+00 5.1337538522957633e+00 2.0064116071962964e+01 0 1 0 +1737 2 3.2572362065507643e-01 1.3956370612838672e+01 1.1413512973612010e+01 1.5719743085265273e+01 0 0 0 +74 2 4.0732383282033274e-01 2.4941039528789433e+00 7.1950484067293354e+00 1.7528595974246507e+01 0 0 0 +723 2 3.4337683920961237e-01 2.5369430889723623e+00 8.0466266280131649e-01 2.0218306108728594e+01 1 0 0 +1557 2 3.8836367816662498e-01 5.9625076694271373e+00 5.5946436522259386e+00 2.0021845571050747e+01 0 0 0 +2012 2 3.9584671272080552e-01 1.8504646269966113e+01 5.5234091503868079e+00 1.5831704470793509e+01 0 0 1 +1548 2 4.0123598128015719e-01 3.0197131138107711e+01 3.4014120288545215e+00 2.1337687711589620e+01 -1 0 0 +1526 2 3.9376431680434920e-01 6.2004220365499518e-01 5.0247897242583619e+00 1.6469455493334944e+01 0 0 0 +1736 2 3.7869480886154222e-01 1.4153874689421853e+01 1.0455895969520149e+01 1.6859976886356076e+01 0 0 0 +199 1 -6.7259345207262222e-01 2.9625432202375613e+01 3.1774571783918465e-01 2.5277794518370417e+01 -1 0 -1 +2183 2 3.6123631159819070e-01 1.6309647867153443e+00 5.4154992990929900e+00 2.3558477513813042e+01 1 0 0 +2184 2 3.8107882408386001e-01 3.0588474354809465e+00 5.8777943718182781e+00 2.2862340992754000e+01 1 0 0 +2119 1 -7.4899778242209114e-01 4.7974041303109329e+00 6.4643051584335076e+00 2.2932352779587710e+01 1 0 0 +1029 2 3.6357343930949232e-01 1.0078126475917001e+01 8.7976628401234347e+00 1.5612421301471080e+01 0 1 0 +1578 2 3.8019150424600251e-01 4.5729134334226602e+00 1.9775568967392523e+00 1.9183033038538440e+01 0 1 0 +922 1 -7.6797331029097093e-01 1.0613199336801812e-01 1.8392220094765086e+00 1.6955856193145575e+01 0 1 0 +350 2 3.9969535736414824e-01 4.2232535021455782e+00 9.6529713555406857e+00 3.0589992691307742e+01 0 0 -1 +1642 1 -7.7104691105573120e-01 7.1216189276687381e+00 8.5579228135051810e+00 1.6037020459541761e+01 0 0 0 +1729 1 -6.6244722620080421e-01 6.1710446796733072e+00 5.2596730581611482e+00 1.8140015691845608e+01 0 0 0 +2126 2 3.5311034071653336e-01 7.0485537923870947e+00 5.6017835615675446e+00 1.7967951239720950e+01 1 0 0 +1577 2 3.9541432552641215e-01 5.9262676715720231e+00 1.5610599273080601e+00 1.8455505913264496e+01 0 1 0 +1555 1 -7.3418059770973620e-01 6.4224173297836087e+00 6.0320937360710563e+00 2.0795048533013787e+01 0 0 0 +2314 1 -7.9322023620712423e-01 1.0212451950467653e+01 5.8943355257454169e+00 1.6846163435672906e+01 0 1 0 +2316 2 3.8255374431915579e-01 1.0435619686776985e+01 6.7699402674077769e+00 1.6634658656641051e+01 0 1 0 +2339 2 3.1113846851151389e-01 2.6091183348311787e+01 4.9385471341871062e-01 2.9379533922411643e+01 -1 1 0 +1717 1 -7.1024551195204777e-01 9.2922541148218230e+00 3.8731526996218681e+00 1.8644298699628731e+01 0 0 0 +1718 2 3.5988581904060296e-01 9.7409871077917689e+00 4.6725087736830675e+00 1.8356994294703249e+01 0 0 0 +2535 2 3.5412795516933754e-01 1.2501075646043335e+01 1.2303266899416381e+00 2.1214372309792267e+01 0 1 0 +2533 1 -7.4481726688147765e-01 1.2729300494112945e+01 8.7889801182680549e-01 2.0342171106077370e+01 0 1 0 +1719 2 4.1339726876671729e-01 9.1805256363796293e+00 3.3409469153405462e+00 1.7842810847455642e+01 0 0 0 +461 2 3.7726726364868329e-01 8.3678538140723067e+00 7.2070804720138582e-01 1.9084968957537004e+01 0 1 0 +880 1 -7.0455425675989003e-01 9.0706567727846608e+00 7.5666569765700542e-01 2.1495416000911337e+01 0 1 0 +837 2 3.7100411902490354e-01 7.3307541717727309e+00 5.7493044868988967e+00 2.0771777886484315e+01 0 1 0 +1858 1 -7.1356101893345791e-01 1.8882085367805807e+01 1.9447505818290339e-01 2.9729080610363102e+01 0 0 0 +1846 1 -7.6289544618688920e-01 9.1645125578645530e+00 5.0563505558921547e+00 2.0942052309907574e+01 0 0 0 +1847 2 3.5549954169923575e-01 9.7280416466814685e+00 5.8085850743355287e+00 2.0675028731634548e+01 0 0 0 +1848 2 4.0206265312287748e-01 9.3577279611524169e+00 4.3049481912625627e+00 2.0324157244908037e+01 0 0 0 +2291 2 3.3105650807375864e-01 7.5104327653658300e+00 4.7204814139978444e+00 2.2338331590732952e+01 0 1 0 +257 2 3.9862677946627079e-01 9.6857126567886525e+00 2.2661911053678696e+00 2.2317133889285383e+01 0 0 -1 +1600 1 -7.7841198332143224e-01 1.0978388164408370e+01 7.2062613921027374e+00 2.0334591348240288e+01 0 0 0 +1408 1 -7.8153555295219479e-01 2.7185838954793191e+01 4.7608085410496626e-01 1.6110115042871087e+01 0 1 0 +2667 2 3.4731250093441185e-01 1.1969979438032301e+01 3.2406400264920188e+00 2.2709076063911297e+01 0 1 0 +1643 2 3.4577566703734625e-01 7.6991171113266104e+00 8.5537351952302174e+00 1.6767266852350037e+01 0 0 0 +112 1 -7.3610922477869090e-01 8.4272358017205349e+00 7.1874247759227625e+00 1.8618264431273410e+01 0 0 0 +113 2 3.4931817850272084e-01 8.7785893529198038e+00 6.9264238927739203e+00 1.7788660050224067e+01 0 0 0 +114 2 3.5828579006050776e-01 9.2406203148625465e+00 7.3636187921657461e+00 1.9081630997881891e+01 0 0 0 +460 1 -7.3306959425209728e-01 7.6627785111790834e+00 9.2440600318877042e-01 1.8509786915145462e+01 0 1 0 +258 2 3.6302959621720760e-01 9.3931026087409464e+00 3.6926457562881869e+00 2.2942698180548238e+01 0 0 -1 +256 1 -7.5529004157831792e-01 9.9800909169102798e+00 2.8944128097040145e+00 2.2977757183128457e+01 0 0 -1 +1602 2 3.5748374023611279e-01 1.1280991547179148e+01 7.1947121243517644e+00 2.1216792306881498e+01 0 0 0 +2274 2 4.0329908767829520e-01 1.0109249958114512e+01 1.3266344584526082e+00 1.6492584063196652e+01 0 1 0 +2273 2 3.6199572830753601e-01 8.6868378772880988e+00 1.3846988131221662e+00 1.7122059713194172e+01 0 1 0 +2534 2 3.7698533762185865e-01 1.3096741541861098e+01 1.5668244608297690e+00 1.9858419662881357e+01 0 1 0 +2723 2 3.2966014241342950e-01 1.2865507327929111e+01 5.7657970636332880e+00 2.0284696859934535e+01 0 0 0 +2429 2 3.9890142939534395e-01 1.3235520029327782e+01 3.2610660365757540e+00 1.7720558094505961e+01 0 1 0 +2722 1 -7.5583929838210839e-01 1.3495328152854746e+01 5.0761740639646380e+00 2.0358024376679783e+01 0 0 0 +2428 1 -7.6321343601412650e-01 1.3533255260984459e+01 3.0064324184348932e+00 1.8594329457124999e+01 0 1 0 +2430 2 3.8238974683830995e-01 1.3348108069065720e+01 3.7717196700134994e+00 1.9169076795662715e+01 0 1 0 +2724 2 3.7014591264750768e-01 1.4334658657550106e+01 5.5309074417988855e+00 2.0165644432206360e+01 0 0 0 +212 2 3.7507533078296590e-01 1.0233641220443133e+01 3.1196638769055820e+00 3.0299391052978574e+01 0 0 -1 +2666 2 3.3253925871032169e-01 1.2922329552277349e+01 3.3585087518611449e+00 2.1577677162873119e+01 0 1 0 +311 2 3.9680860625847059e-01 1.5196069416190609e+01 2.4210270875749567e+00 1.8369710823338629e+01 0 0 0 +310 1 -7.4297434057977974e-01 1.6061178007015329e+01 1.9236080127837125e+00 1.8463774077714241e+01 0 0 0 +312 2 3.6296563152846356e-01 1.6698036888593922e+01 2.0918846528450246e+00 1.7695322844206643e+01 0 0 0 +2512 1 -7.1447877135425020e-01 1.5524816726500596e+01 5.5154840880220801e+00 1.6820872483234677e+01 0 1 0 +1726 1 -7.2647410965505543e-01 1.7930496079099601e+01 1.1801658182298256e+00 2.2675462098797091e+01 0 0 0 +2807 2 3.9615037625287181e-01 1.5827065749399567e+01 5.9932610940907418e+00 1.8317301659279494e+01 0 1 0 +2806 1 -7.8077159178042066e-01 1.5937665797146234e+01 6.4601060475095720e+00 1.9216312302800269e+01 0 1 0 +2808 2 3.8432282399363588e-01 1.6407095299361821e+01 7.3023239614847881e+00 1.9138853514357827e+01 0 1 0 +1450 1 -7.4552673337158848e-01 1.8015211860067204e+01 2.5793663608097672e+00 1.6536654630651896e+01 0 1 0 +2522 2 3.7573333389898150e-01 1.7008007562356166e+01 8.3125790408370193e-01 2.2682063203603214e+01 0 1 0 +1728 2 3.5557836099406387e-01 1.7873561001581070e+01 1.8783684370156675e+00 2.1924094861675691e+01 0 0 0 +2514 2 3.5704297687646563e-01 1.4538382969196579e+01 5.6581887698343438e+00 1.6731770621130298e+01 0 1 0 +597 2 3.6838808546295970e-01 1.6892303638410976e+01 2.4377488271971202e+00 1.9823131554774847e+01 0 0 0 +596 2 4.0008098263286890e-01 1.7742449623088444e+01 3.7497354081613237e+00 2.0074349183211687e+01 0 0 0 +2531 2 3.4504061612994036e-01 1.4704173681135734e+01 1.5898811908156958e+00 2.2475550075454489e+01 0 1 0 +2665 1 -7.6326543782505774e-01 1.2865065253930233e+01 2.8924017149285000e+00 2.2427091762386485e+01 0 1 0 +1452 2 3.7139220650702942e-01 1.8355035776373093e+01 2.0120135709890774e+00 1.7232858667620217e+01 0 1 0 +595 1 -7.5682276478538346e-01 1.7713875025393552e+01 2.8242178713402324e+00 2.0273752811152491e+01 0 0 0 +1906 1 -7.6790724115151865e-01 1.8341767584286075e+01 5.3612836502727008e+00 2.0360793250683866e+01 0 0 0 +1907 2 3.3404104676695939e-01 1.8861098063299817e+01 5.7846346208771955e+00 1.9777399107098045e+01 0 0 0 +1908 2 3.4389498527733947e-01 1.7405974075624133e+01 5.7316539539647691e+00 2.0086768232486353e+01 0 0 0 +2568 2 3.4334428892311453e-01 1.4215814597672862e+01 3.6419862833665153e+00 2.3353777878700900e+01 0 0 0 +2696 2 3.5191086878952516e-01 1.8628729439088247e+01 1.6129994331342259e+00 1.9167948805470086e+01 0 1 0 +1870 1 -7.4807001377895854e-01 1.2794565283042013e+01 4.5672901877578393e+00 1.6439936121378878e+01 0 0 0 +1451 2 3.7505732443904505e-01 1.8483153648502871e+01 3.4552827083940656e+00 1.6699691043118662e+01 0 1 0 +1807 1 -7.1708389979514675e-01 1.1987311595652530e+01 7.8876023479661930e+00 2.2974062537851768e+01 0 0 0 +1809 2 3.7001576738569475e-01 1.2779299470376676e+01 8.3474837865414813e+00 2.2651068126240350e+01 0 0 0 +1872 2 3.6143177469791959e-01 1.1913393176631594e+01 4.9047426120171140e+00 1.6548088241326184e+01 0 0 0 +2513 2 3.3544440426149241e-01 1.5874352219267594e+01 6.1609623454137710e+00 1.6158974870228228e+01 0 1 0 +2750 2 3.4844332937132061e-01 1.8939834789518464e+01 5.3548506879791899e+00 2.2370157376858458e+01 0 0 0 +2751 2 3.9710958952960085e-01 1.8684430037259045e+01 4.6166519135821122e+00 2.3720840532831094e+01 0 0 0 +2548 1 -7.2500975173994919e-01 2.4398141217717630e+01 1.5066201235548282e+00 2.0648397575609916e+01 0 0 0 +2549 2 3.5942198542886616e-01 2.4686865774467350e+01 5.4185048008071712e-01 2.0416649887435781e+01 0 0 0 +704 2 3.4397990125970002e-01 2.3961476301029190e+01 4.6775175986420106e+00 1.6620366843348158e+01 0 0 0 +703 1 -7.3657177238484384e-01 2.3387012202217360e+01 5.5971433300209910e+00 1.6307873022207598e+01 0 0 0 +2104 1 -7.2165781836774701e-01 2.1070590376772099e+01 4.1265734082450702e+00 2.0151961866413032e+01 0 0 0 +2106 2 3.8891137084512883e-01 2.1047646402560087e+01 3.3271412204592914e+00 2.0651031825938972e+01 0 0 0 +1933 1 -7.5489489567222001e-01 2.1875744765757279e+01 2.1549335059777008e+00 2.1804583009605864e+01 0 0 0 +1935 2 3.6546947997464563e-01 2.2641662767210502e+01 1.9008251074049098e+00 2.1285876124251484e+01 0 0 0 +1934 2 3.5167752337170388e-01 2.1399382466953121e+01 1.3372657622763970e+00 2.1935226252481069e+01 0 0 0 +2105 2 3.4956828454256972e-01 2.0169494826853967e+01 4.5086360521536966e+00 2.0164080891958633e+01 0 0 0 +2703 2 3.6169134714827844e-01 2.0208159180265085e+01 4.6500351603551247e+00 1.6949289521344458e+01 0 1 0 +1977 2 3.6227389483556977e-01 2.2183570585073195e+01 6.1160173341246171e+00 2.2732505571545655e+01 0 0 0 +2897 2 3.9101094604738995e-01 2.2569417337313467e+01 5.1153011905446846e+00 2.0674231920968779e+01 0 1 0 +1214 2 3.5605487665142194e-01 2.2972347386857596e+01 1.9764508001142294e+00 1.9183797150727944e+01 0 1 0 +2701 1 -7.5285041152992094e-01 1.9355181725869073e+01 5.0502109475701635e+00 1.7318465661457108e+01 0 1 0 +2898 2 3.5698439783817099e-01 2.4078240794210586e+01 5.4371706745556576e+00 2.0403872106911571e+01 0 1 0 +1215 2 3.6300774567522309e-01 2.2846492228884660e+01 1.1444733804903375e+00 1.7838640945562048e+01 0 1 0 +1213 1 -7.4232847802753166e-01 2.2801287712195730e+01 2.0652893763025508e+00 1.8239584983223260e+01 0 1 0 +1539 2 3.8153948636053286e-01 2.4246725550188323e+01 2.9062001202492209e+00 1.7819079045324681e+01 -1 0 0 +2212 1 -6.8484229727562052e-01 2.6950220419873258e+01 1.5337925523512927e+01 3.0036170495158427e+01 0 -1 0 +2695 1 -7.3148367832924932e-01 1.9017859654628392e+01 9.3497112919308378e-01 1.8553987369009768e+01 0 1 0 +1806 2 3.4073944927022032e-01 2.1967495412854674e+01 4.2722321976073747e+00 1.5870916188327204e+01 0 0 0 +1805 2 3.7311057201484432e-01 2.1692745419053487e+01 3.3331048050995826e+00 1.6978789820814846e+01 0 0 0 +2697 2 3.8948678557809024e-01 1.9737028295240538e+01 5.2044300784260122e-01 1.9013732817730865e+01 0 1 0 +2896 1 -7.4113625020590856e-01 2.3264285650263719e+01 5.7579241525589371e+00 2.0744568373963073e+01 0 1 0 +1804 1 -7.3710896232291279e-01 2.1341741017368161e+01 3.5531996306732743e+00 1.6157283372022793e+01 0 0 0 +2749 1 -7.3934220363961434e-01 1.9180677327347432e+01 5.3621157473836289e+00 2.3337307400779466e+01 0 0 0 +2702 2 3.6865003712290911e-01 1.9644798397915739e+01 5.8729888340691696e+00 1.7698178978855907e+01 0 1 0 +1976 2 3.5068974077975706e-01 2.1047799730702469e+01 5.8336483315295267e+00 2.3633413249403770e+01 0 0 0 +1752 2 3.8216632993801475e-01 2.3509631005766302e+01 6.6028333833886999e+00 1.7646409570393065e+01 0 0 0 +1750 1 -7.6521898331383797e-01 2.3204144681456928e+01 7.2658169328883657e+00 1.8338490258449397e+01 0 0 0 +2110 1 -7.2712249954507657e-01 2.0446505703884430e+01 7.6793514021836842e+00 1.7914955076678705e+01 0 0 0 +2844 2 3.7070022365367028e-01 2.1392755482132475e+01 7.6314899521161124e+00 1.7776830958570969e+01 0 0 0 +1751 2 3.6520478085553282e-01 2.3363740043900894e+01 6.8549653838828606e+00 1.9198634912467842e+01 0 0 0 +1511 2 3.9674404770742960e-01 2.9848200302601587e+01 3.1208543954542306e-01 2.3360153157430634e+01 -1 0 0 +883 1 -7.7564575432904614e-01 2.4804116676098811e+01 3.6079442952052045e+00 1.7333517725433307e+01 -1 1 0 +2231 2 3.9317639957322165e-01 3.1022236881941787e+01 5.1339060816356730e+00 3.0358312375049980e+01 0 0 0 +2294 2 4.0147134126849410e-01 2.9655604965329509e+01 2.1048628903381141e+00 2.2044797311289138e+01 -1 1 0 +2550 2 3.9377724350660276e-01 2.5251613938761700e+01 1.9507494572765729e+00 2.0507750845162786e+01 0 0 0 +1404 2 3.6701323517805917e-01 2.6548106773200796e+01 3.2730252276319405e+00 2.2331832672943985e+01 0 1 0 +840 2 3.8477945967648181e-01 2.8179795711856599e+01 3.8997593520209257e+00 1.6598188317460181e+01 -1 1 0 +2532 2 3.4193596019526312e-01 1.4647043611781461e+01 1.7112687857158618e-01 2.2996742722587530e+01 0 1 0 +1546 1 -7.3697581911800814e-01 2.9407543317472097e+01 3.0108394092492485e+00 2.1648362692686568e+01 -1 0 0 +1921 1 -7.0795569268367298e-01 2.8564919201177538e+01 2.5314864439847811e+00 1.7537579598910398e+01 0 0 0 +555 2 3.3248409601433471e-01 2.6744569832249603e+01 5.4427023589553167e+00 1.8716092392999588e+01 0 0 0 +2913 2 3.7305112269939156e-01 2.8117182390276444e+01 1.1023792109791506e+01 1.5678664589960315e+01 0 1 0 +919 1 -7.5312632732781148e-01 2.7435504978866611e+01 6.9693469538572668e+00 1.7082550528432016e+01 -1 1 0 +2317 1 -7.7753729142573613e-01 2.6755851186055377e+01 3.1192083142036604e+00 2.0751177018989626e+01 -1 1 0 +650 2 3.8278606702436219e-01 2.6594103028328075e+01 1.5235512573629876e+01 1.6332700020294890e+01 0 0 0 +2103 2 3.7175421364097755e-01 2.7442110799564006e+01 7.4066067766033852e+00 2.0304558513852822e+01 0 0 0 +735 2 3.4788674624738092e-01 2.9801781278393399e+01 6.6569554526966952e+00 2.0872480829592039e+01 0 0 0 +553 1 -7.4782725985236120e-01 2.5956786594272085e+01 5.2975849808341522e+00 1.9293645257456657e+01 0 0 0 +2319 2 3.9489058500456531e-01 2.6554217595761138e+01 3.9746118866937090e+00 2.0361220289471241e+01 -1 1 0 +2318 2 4.2090532594699959e-01 2.7663195235437865e+01 3.0520259558939564e+00 2.0950808479327208e+01 -1 1 0 +2069 2 3.8520960585906278e-01 2.9492776324890073e+01 2.3249704609938795e+00 1.7309738064352466e+01 0 0 0 +2419 1 -7.3422594626442594e-01 2.9166648949061670e+01 6.3295584508809082e+00 2.0326894663149726e+01 -1 1 0 +2234 2 3.6200217424902098e-01 2.9620827851563043e+01 5.6241594721068067e+00 1.9889138605458310e+01 0 0 0 +1910 2 3.7325564203044420e-01 2.8029843119160535e+01 1.8398773393439074e+00 1.7109689773618754e+01 0 0 0 +554 2 3.6177414155192317e-01 2.5403050813272564e+01 4.8638310169205461e+00 1.8661833567443907e+01 0 0 0 +2101 1 -7.4354647583889499e-01 2.7049435147623811e+01 8.2649551915291948e+00 2.0456272993052767e+01 0 0 0 +3000 2 3.4785770740465199e-01 2.6210375496757404e+01 6.7848535079359031e+00 2.1685381552879406e+01 0 1 0 +2998 1 -7.3773180866674382e-01 2.6145236639145288e+01 6.3639748409843007e+00 2.2595101808948755e+01 0 1 0 +2799 2 3.7811775266067665e-01 2.4541392918600117e+01 8.5129640455712625e+00 1.8461787021149501e+01 0 1 0 +1920 2 3.5570745040804447e-01 2.5378429261221580e+01 1.5300887016718237e+01 1.9431652897793192e+01 0 0 0 +2338 1 -7.1501232389933123e-01 2.6256861330951718e+01 3.2990508597986612e-01 3.0302262984548694e+01 -1 1 0 +2196 2 3.8258434810517011e-01 2.6064007265534816e+01 8.4756018837624509e+00 1.9017440862832462e+01 0 0 0 +2562 2 4.0191351957169247e-01 1.6809195589802684e+01 1.4839059328887014e+01 3.1029300751958736e+01 0 0 0 +2086 1 -7.0559567942719459e-01 2.7198142309122478e+01 8.9600562750331358e-01 2.3297509165240378e+01 0 0 0 +920 2 3.7154519453671969e-01 2.6561931439292728e+01 7.2884432772868220e+00 1.7452219151581595e+01 -1 1 0 +2102 2 3.7410167064637262e-01 2.7839258537780733e+01 8.8715341427024317e+00 2.0475072649422199e+01 0 0 0 +2088 2 3.7972293168842208e-01 2.6840489778526059e+01 1.7359779465611900e+00 2.3492552448470118e+01 0 0 0 +2375 2 3.5605642667339016e-01 4.7553421563886396e+00 1.4945748775937680e+01 1.7959394986209002e+01 0 0 0 +30 2 3.7313644596893036e-01 4.2771687146128468e+00 1.4050519690115335e+01 2.1557218113291022e+01 0 0 0 +131 2 3.7244563299825334e-01 3.8402269884191518e+00 1.4014381408215009e+01 1.6545257947265270e+01 0 0 0 +722 2 3.8550484114095246e-01 1.0438902264090224e+00 7.2769105915557564e+00 1.9538693570107075e+01 1 0 0 +2071 1 -7.4691105578504957e-01 9.9468678528572518e-01 7.7473030574023767e+00 2.0386510264149848e+01 1 0 0 +1566 2 3.7786243872903308e-01 3.0685101118112281e+00 1.0480663574424261e+01 1.8908756792250706e+01 0 0 0 +164 2 3.7792787876025169e-01 3.5406694169400783e+00 1.0520195357463011e+01 2.1264898369459136e+01 0 0 0 +165 2 3.7301593364406482e-01 2.1602686002361025e+00 1.0949361589932771e+01 2.1607132517587605e+01 0 0 0 +163 1 -7.4278167096018366e-01 2.6183894521599580e+00 1.0226351915179732e+01 2.1119894608589568e+01 0 0 0 +2073 2 3.9523756184886205e-01 1.5856240291663786e+00 8.4210206141675084e+00 2.0534899210785877e+01 1 0 0 +1564 1 -6.8777965339655978e-01 3.7286159460637016e+00 1.0573973436499173e+01 1.8271110370858004e+01 0 0 0 +1565 2 3.6122715307603448e-01 3.6653418311743171e+00 1.1534373972218873e+01 1.8050695846568338e+01 0 0 0 +28 1 -6.5552817048155709e-01 4.8640724442328418e+00 1.3599606162402642e+01 2.0901920218534155e+01 0 0 0 +843 2 3.7183929016315392e-01 2.0932244124097892e+00 1.0722102311402404e+01 1.5613065539209638e+01 0 1 0 +841 1 -7.4100986848281925e-01 1.4860346424824933e+00 1.0124927516662728e+01 1.6161875387129459e+01 0 1 0 +136 1 -7.1055350980855814e-01 1.6305260131994366e+00 7.5049545131389452e+00 1.7704559019254795e+01 0 0 0 +29 2 3.8035511303910141e-01 4.9500953483716792e+00 1.2710906172512630e+01 2.1331309043466288e+01 0 0 0 +138 2 3.7747680868513417e-01 1.5667395929956487e+00 8.3358720892168101e+00 1.7221829972434470e+01 0 0 0 +161 2 3.7199682962507802e-01 6.8264417361419110e+00 9.5788332517440296e+00 1.9064913935596906e+01 0 0 0 +1543 1 -7.6039189059221568e-01 6.6284958159658460e+00 1.0356187588597551e+01 1.8422421673149088e+01 0 0 0 +1544 2 3.7261321575622547e-01 5.7041060006714996e+00 1.0202409702968264e+01 1.8185324009578295e+01 0 0 0 +2989 1 -7.3744979863482263e-01 5.2002482597871955e+00 1.1050179517214810e+01 2.1900544583151135e+01 1 1 0 +132 2 3.3749949997674528e-01 2.4392963953691109e+00 1.3600652152954888e+01 1.7022357287869010e+01 0 0 0 +130 1 -7.0935056090895865e-01 3.3857884751847749e+00 1.3631600125067159e+01 1.7332633598652475e+01 0 0 0 +2460 2 3.5030606816395526e-01 5.2120122006547154e-01 1.2096326668225956e+01 2.2373234552819920e+01 0 0 0 +2458 1 -6.9003921263218182e-01 1.2088702059821916e+00 1.2377476885679373e+01 2.1676674104669765e+01 0 0 0 +2261 2 3.4529986508138705e-01 1.8628227882398931e+00 1.2725199218329593e+01 2.2315669124116550e+01 0 0 0 +2990 2 3.7725943655815275e-01 5.9585430320242487e+00 1.0425576974017529e+01 2.1758287172653681e+01 1 1 0 +2836 1 -7.2338594604304973e-01 3.0881772568642623e+00 1.4036975629414393e+01 2.3162135742500073e+01 1 0 0 +2991 2 3.0982451582420384e-01 5.2280013586330387e+00 1.1203024874281757e+01 2.2920463007595512e+01 1 1 0 +1785 2 3.8281471486206287e-01 6.6167742260554228e+00 1.3612536459776695e+01 1.9313609737248520e+01 0 0 0 +2121 2 3.8585698851848321e-01 4.4807308426661656e+00 7.3066901447446870e+00 2.2606766608759379e+01 1 0 0 +2837 2 3.7013465404632945e-01 3.5954162742032376e+00 1.3873516136223056e+01 2.3965882799467401e+01 1 0 0 +937 1 -7.3314223531008127e-01 2.9009549042530489e+00 8.4066590110596824e+00 2.3065122293270981e+01 0 1 0 +938 2 3.7193465068244991e-01 2.5191766273619289e+00 8.9434038738914126e+00 2.2299129294937106e+01 0 1 0 +2900 2 3.7818319167858133e-01 2.7415196699207897e+01 8.5499633253260967e+00 2.7845323239798631e+01 0 1 0 +405 2 4.0057701173858695e-01 1.2084678057047451e+01 8.9585126757363334e+00 1.6877323855921205e+01 0 0 0 +2794 1 -7.1956077419890807e-01 2.6712684139134382e+01 5.2906405574568689e+00 3.0610308369025347e+01 0 1 0 +2407 1 -7.2798611750345976e-01 7.3061596056138445e+00 9.1177404986389856e+00 2.0833418652341557e+01 0 1 0 +2408 2 3.6041671248831952e-01 7.3585132166454654e+00 8.2126653276617905e+00 2.0557345700254629e+01 0 1 0 +2409 2 3.6349064748110360e-01 8.2029129887498033e+00 9.3373021614919374e+00 2.1047308869552040e+01 0 1 0 +1640 2 3.5413656085315520e-01 6.7125397866169587e+00 1.1556501214790561e+01 1.6890357199937188e+01 0 0 0 +207 2 3.5322247205880647e-01 1.0524607756799654e+01 9.3693843752394290e+00 2.0792799719310164e+01 0 0 -1 +551 2 3.1596334670470599e-01 2.3139540645992245e+01 9.1643025932865942e+00 1.6085846237278776e+01 0 0 0 +1028 2 3.6283021390048514e-01 9.9820280890318642e+00 9.4050140382677920e+00 1.6941434255403038e+01 0 1 0 +1573 1 -7.2522851749844286e-01 9.3058726890929240e+00 1.1238508275232054e+01 1.7770799164061348e+01 0 0 0 +129 2 3.5259057163977803e-01 8.3037113370707765e+00 1.1287229704106414e+01 1.7808208870495932e+01 0 0 -1 +1575 2 3.6052169880570617e-01 9.4943013114788730e+00 1.1281399552467397e+01 1.8757265704033799e+01 0 0 0 +2423 2 4.1237379394554557e-01 1.0186267108735564e+01 1.2482543054700727e+01 1.6924064738290593e+01 0 1 0 +2422 1 -7.5528864189308997e-01 1.0617722992488041e+01 1.3201662366329364e+01 1.6503243095375066e+01 0 1 0 +1233 2 3.8200896233481607e-01 2.9020145946440103e+01 9.4345824693544422e+00 3.0586678472936867e+01 0 0 -1 +1533 2 3.9295894415255977e-01 1.0589356890099278e+01 1.1009283924992937e+01 2.0983954036008033e+01 0 0 0 +1531 1 -7.0374484297774720e-01 1.0106263090408950e+01 1.0226083225003583e+01 2.0595863319388489e+01 0 0 0 +2357 2 3.8210603736161919e-01 9.3430479690853403e+00 1.4443269291071177e+01 1.6225834414127757e+01 0 0 0 +2567 2 3.8669808384358728e-01 1.1333563966860329e+01 1.3333851376525297e+01 1.7201856579169146e+01 0 0 0 +1784 2 3.6121546867068344e-01 6.6624094012602990e+00 1.2176837629813919e+01 1.8723857648926369e+01 0 0 0 +2923 1 -7.3571394649167221e-01 1.1882439002847120e+01 1.2312812451221372e+01 2.1406602358155876e+01 1 0 0 +2561 2 3.9705462740753311e-01 9.4233693390889908e+00 1.4297828641073684e+01 2.1471400197495001e+01 0 0 0 +2560 1 -7.1032641792680462e-01 8.6943397986103594e+00 1.3755425443541210e+01 2.1178575676550675e+01 0 0 0 +1869 2 4.0682694563708804e-01 8.3710478606434258e+00 1.4164576937614921e+01 2.0375780486508098e+01 0 0 0 +206 2 3.3829609616742795e-01 8.7602454773378078e+00 5.9344065142883000e+00 2.2942854230873522e+01 0 0 -1 +2181 2 3.6130387415390852e-01 8.0414942997850325e+00 1.3458170888224247e+01 2.2923758503112353e+01 1 0 0 +2924 2 3.3776533563465239e-01 1.1654790831468008e+01 1.3105746318028583e+01 2.1920772281945446e+01 1 0 0 +2053 1 -7.3766684215097889e-01 2.5145602703224867e+01 8.6541961282170412e+00 2.3799760133041396e+01 0 0 0 +1644 2 3.5429954575230982e-01 7.3141820210076478e+00 9.3631445469736505e+00 1.5554808430099202e+01 0 0 0 +1027 1 -7.7401990553758282e-01 1.0388384085254383e+01 8.6584800868084262e+00 1.6539136615228763e+01 0 1 0 +278 2 4.0489742409491369e-01 6.9938898484793306e+00 1.5173297331096748e+01 2.4008993477712167e+01 0 0 0 +1783 1 -6.7335777806983732e-01 7.0430888152495594e+00 1.3106370436589541e+01 1.8618614099721668e+01 0 0 0 +2230 1 -7.5263543177058245e-01 8.5774186803729857e-01 5.1195093617962808e+00 3.0600357686081662e+01 1 0 0 +2018 2 3.6679909686347079e-01 1.6956245911637073e+01 8.9418921168532250e+00 1.7658439969659675e+01 0 0 0 +403 1 -7.4516078083489978e-01 1.2992692192882428e+01 9.0005766882634362e+00 1.7173322065859242e+01 0 0 0 +1401 2 3.8626833829586898e-01 4.4637530188548071e+00 2.7502724249676175e-01 1.5697870538564095e+01 1 1 0 +1754 2 3.8391964633410047e-01 1.1764550375668628e+01 1.3032705248164630e+01 1.9772788204968641e+01 0 0 0 +1665 2 3.4798518694100483e-01 1.1773395057063254e+01 7.0581714244376617e+00 1.9806056777995511e+01 0 0 0 +2925 2 3.7387206093991754e-01 1.2787584030668560e+01 1.2116691670547677e+01 2.1790460177572896e+01 1 0 0 +1753 1 -7.5022387562627957e-01 1.2039905378946813e+01 1.3351891586988085e+01 1.8873350966911072e+01 0 0 0 +2017 1 -7.3492391394875911e-01 1.6665501964712966e+01 8.9550052987174027e+00 1.8602274889064965e+01 0 0 0 +404 2 3.8301311901100599e-01 1.3055490172705039e+01 8.6872601889770351e+00 1.8165908713344329e+01 0 0 0 +1755 2 3.8871816627699718e-01 1.3049313906018305e+01 1.3321481532767583e+01 1.8928877974205388e+01 0 0 0 +2019 2 4.1561876716004592e-01 1.7365685743876266e+01 9.3759140561039285e+00 1.9039778589444754e+01 0 0 0 +1739 2 3.8801784154160446e-01 1.3642089513094440e+01 8.3609359204199958e+00 2.0178747887490413e+01 0 0 0 +1738 1 -7.8914970851668176e-01 1.3572069606153219e+01 7.7633324407689921e+00 1.9475132354984773e+01 0 0 0 +2730 2 4.0251827972944865e-01 1.7263138369980986e+01 1.3637637118825557e+01 2.0534207733959761e+01 0 0 0 +1740 2 3.8191172211745650e-01 1.4495710456273171e+01 7.4828978210185149e+00 1.9191910649208896e+01 0 0 0 +1210 1 -7.3635400562140607e-01 1.4286356936194165e+01 9.2377315162547564e+00 2.1969271672374305e+01 0 1 0 +2519 2 3.9450616331243338e-01 1.5532727974393639e+01 1.2716095898468238e+01 1.9005980741709461e+01 0 1 0 +2518 1 -7.0020767951093255e-01 1.4748998304438500e+01 1.2980336604099989e+01 1.8479994559915177e+01 0 1 0 +2520 2 3.8806503026240069e-01 1.4704854582895956e+01 1.2369733460036672e+01 1.7698543367203715e+01 0 1 0 +2728 1 -6.9651091995638481e-01 1.7074355541895120e+01 1.2813235371684920e+01 2.0142623733808158e+01 0 0 0 +2672 2 3.7300178188927147e-01 1.7804755750171203e+01 1.2681357261096485e+01 1.9532548952210597e+01 0 0 0 +616 1 -6.9174492598625059e-01 1.7435581503971978e+01 1.1433822824662480e+01 1.6367465338872680e+01 0 0 -1 +1212 2 3.8335884669842629e-01 1.4147485685425524e+01 1.0050674626063481e+01 2.2532174256149407e+01 0 1 0 +1211 2 4.0778944741854067e-01 1.4969405215963242e+01 8.7025602838862657e+00 2.2381354008202933e+01 0 1 0 +1037 2 3.9083726566379051e-01 1.3766844118198629e+01 1.4210140240142200e+01 2.2786501057899198e+01 0 1 -1 +1836 2 3.9187442257055055e-01 1.8979423247115456e+01 1.2009427785390942e+01 1.7407244710259985e+01 0 0 0 +2940 2 3.4632860432638313e-01 1.8451600439801506e+01 1.4839552720185747e+01 1.7368561537060227e+01 0 0 0 +842 2 3.4119337800122618e-01 1.3170436151882294e+00 9.4108747050476378e+00 1.5543224130927058e+01 0 1 0 +1516 1 -6.7068126500296144e-01 1.1425229800113051e+01 2.6455517175375637e-01 1.7762034538861357e+01 0 0 0 +1639 1 -7.2373086427851052e-01 6.3764181916873843e+00 1.1759659047129542e+01 1.5981229637569374e+01 0 0 0 +1038 2 3.7926588337572753e-01 1.5156959038847516e+01 1.3698403096322609e+01 2.2897074520829197e+01 0 1 -1 +388 1 -7.5510394342290132e-01 1.4111550559310265e+01 1.1560434211278997e+01 2.3443295473973926e+01 0 0 -1 +390 2 4.0655347049402102e-01 1.5039516853489459e+01 1.1720980918698904e+01 2.3307150086746127e+01 0 0 -1 +2595 2 4.1713439738631469e-01 1.7555658074944745e+01 1.2046788493534205e+01 2.3228099335612924e+01 0 0 0 +1036 1 -6.7551293206049901e-01 1.4561103067342792e+01 1.4032165389974502e+01 2.2296849078877067e+01 0 1 -1 +617 2 3.7623215020866863e-01 1.6543106285011845e+01 1.1407863625327440e+01 1.6695487415549007e+01 0 0 -1 +1735 1 -7.5113409137827258e-01 1.4590044443041155e+01 1.1218354811374031e+01 1.6427683357216281e+01 0 0 0 +1991 2 3.8459332332863760e-01 1.9497277727423661e+01 1.0578887237316250e-02 2.2458156727385099e+01 0 0 0 +899 2 3.8127010516342885e-01 5.3391559075200679e+00 9.9804570387332223e+00 1.5720359735406319e+01 0 0 0 +398 2 3.2004491336324487e-01 2.1495986442264993e+01 7.6050513166391003e+00 2.2363098294672028e+01 0 0 -1 +2680 1 -7.3202861077267689e-01 2.2066768893607218e+01 1.5375730708080813e+01 1.9415608440359819e+01 0 0 0 +2170 1 -7.6349686183636911e-01 1.8865824155187205e+01 9.4916039563870118e+00 1.9805581370270467e+01 0 0 0 +716 2 3.5632299047840366e-01 1.9357449724098466e+01 9.0020272700128974e+00 1.9135097158884438e+01 0 0 0 +2678 2 3.4951967851345100e-01 1.9495817439363719e+01 1.0952223438296004e+01 2.2143519070705047e+01 0 0 0 +354 2 3.5916029308246983e-01 2.0956698347810864e+01 1.1783208277501810e+01 1.9587783079463009e+01 0 0 0 +352 1 -6.8878961535675709e-01 2.0550706516505961e+01 1.1663387875887267e+01 2.0534690899852240e+01 0 0 0 +353 2 3.5776060615036392e-01 1.9734667085056032e+01 1.1066395062612594e+01 2.0358463217175814e+01 0 0 0 +2172 2 3.2563405921591260e-01 1.8971789304714186e+01 8.9767862096464004e+00 2.0605374764272497e+01 0 0 0 +506 2 3.7336604353172415e-01 2.1243934859328998e+01 1.3067633517947597e+01 2.1722114689046712e+01 0 0 0 +397 1 -7.0203789006736461e-01 2.1272215741460059e+01 8.4190413649576481e+00 2.1923024798635119e+01 0 0 -1 +2112 2 3.5749643675307025e-01 2.3277342972110947e+01 1.0273506654345852e+01 1.9746190274072337e+01 0 0 0 +399 2 3.8529248043220982e-01 2.2095981443530921e+01 8.9608436992017477e+00 2.1882225118690091e+01 0 0 -1 +669 2 3.5241719615984168e-01 2.3835092940756191e+01 1.1028890441661733e+01 2.1590790738013276e+01 0 0 0 +1939 1 -7.2135771505377078e-01 2.2966671549940813e+01 1.0008086922405964e+01 1.8897908893064958e+01 0 0 0 +715 1 -7.2997705047380057e-01 2.3653015785898301e+01 1.0098747871485116e+01 2.1824770265916694e+01 0 0 0 +1940 2 3.5160598280934757e-01 2.2669112888586351e+01 9.0908235054689985e+00 1.9073113742305335e+01 0 0 0 +717 2 3.8320793146871557e-01 2.4311519990824511e+01 9.7755906645591999e+00 2.2462924941857636e+01 0 0 0 +459 2 3.8416886073134027e-01 2.3070896264022778e+01 1.2452390151392521e+01 1.9315406632261965e+01 0 0 0 +1834 1 -7.2161997489727125e-01 1.9381599658981891e+01 1.2659658978319085e+01 1.8015457035261701e+01 0 0 0 +505 1 -6.9860310377840651e-01 2.1642858799412103e+01 1.3937964923486071e+01 2.1816452323103469e+01 0 0 0 +1835 2 3.7207914288685157e-01 2.0278979344207215e+01 1.2638224531969829e+01 1.7854801478038407e+01 0 0 0 +458 2 3.8212115507743072e-01 2.2372624989832556e+01 1.2229091079374045e+01 1.7903894019546094e+01 0 0 0 +457 1 -7.6499416451080382e-01 2.2343098067345160e+01 1.2805355870533806e+01 1.8699219400743679e+01 0 0 0 +1956 2 3.4339814167844712e-01 2.4186106360868280e+01 1.2969190144837924e+01 2.2301851785400849e+01 0 0 0 +2729 2 3.7703957361105783e-01 2.2081585098562567e+01 1.4464589638277989e+01 1.8968631374295192e+01 0 0 0 +1941 2 3.8549314621537878e-01 2.1944326659494948e+01 1.4125339370548296e+01 2.0896046712774201e+01 0 0 0 +2111 2 3.5065550630186537e-01 2.0214586295971163e+01 8.2482085452366718e+00 1.7099343233387046e+01 0 0 0 +2303 2 3.3566251428324961e-01 4.7982086445837524e+00 6.5562331072971682e+00 1.6506782621679776e+01 0 0 0 +882 2 3.5386422755678792e-01 9.7165959201112670e+00 1.5169399558564750e-01 2.1823152404527185e+01 0 1 0 +185 2 3.4046379682562783e-01 4.3305035655275319e-02 1.2912647970572984e+01 1.7031286717738347e+01 0 0 0 +2384 2 3.7660846054579272e-01 2.9465405847905281e+01 9.2655430068648865e+00 2.2725072426645035e+01 -1 1 0 +1068 2 3.8476208951181273e-01 1.3329215191795530e+01 1.1354157060663415e+01 3.1042205074704174e+01 0 0 -1 +2987 2 3.6560553509206023e-01 2.7464957672870540e+01 1.1248565497139367e+01 2.3809506566471352e+01 0 1 0 +346 1 -7.3391986676753573e-01 1.7056858454851412e+01 8.2180755585903089e+00 1.5626796727305591e+01 0 0 0 +184 1 -7.2609578154427024e-01 4.9464161798220929e-01 1.3770931023181264e+01 1.6871790013461275e+01 0 0 0 +2469 2 3.9352264166164758e-01 1.4823853627918639e+00 1.5415517317916478e+01 1.7290114940775041e+01 0 0 0 +921 2 3.9567342613304785e-01 2.7976820586123839e+01 7.6241864611821573e+00 1.6669910450292988e+01 -1 1 0 +730 1 -7.5440831141625975e-01 2.9940507767907427e+01 1.1024414260594568e+01 1.6465650387139668e+01 0 0 0 +732 2 3.6608217473124127e-01 3.0900323309008844e+01 1.0756077083335166e+01 1.6365877614743567e+01 0 0 0 +2132 2 4.0049444066124251e-01 2.4976244607438534e+01 1.3260747334438147e+01 2.0221675044683380e+01 0 0 0 +2131 1 -7.7945494920877012e-01 2.4472214704824960e+01 1.2409196296592279e+01 2.0203897211372077e+01 0 0 0 +2133 2 3.8570991198323573e-01 2.4943570048139250e+01 1.1853053597824776e+01 1.9524475894365100e+01 0 0 0 +640 1 -7.4773484071651031e-01 2.5532342776021249e+01 8.6043278685170712e+00 1.8213454212182754e+01 0 0 0 +2225 2 3.7750922652840646e-01 2.6069108746220927e+01 1.0262117383019357e+01 1.8267611041747067e+01 0 0 0 +2226 2 3.4778060237024450e-01 2.6239382865318579e+01 1.1685965248509371e+01 1.7749768533991165e+01 0 0 0 +2246 2 3.7627811404600109e-01 3.0297260992956371e+01 8.6714161509651131e+00 2.0389554356097957e+01 0 0 0 +160 1 -7.3033074976895529e-01 2.9624109555854151e+01 9.2807951844092678e+00 2.0695257535476276e+01 -1 0 0 +162 2 3.6796053651740235e-01 2.9490886980093705e+01 1.0053299858495222e+01 1.9995802359191931e+01 -1 0 0 +731 2 3.6711482998338107e-01 2.9715292499906422e+01 1.1173930209302149e+01 1.7425157563527797e+01 0 0 0 +2136 2 3.7353312060824306e-01 3.0456462227425714e+01 1.3397929850443866e+01 2.0727463330593576e+01 0 0 0 +2135 2 3.7707725039739515e-01 2.9083332776355398e+01 1.3250228537723050e+01 2.1409642910163022e+01 0 0 0 +2134 1 -7.2738501400538580e-01 2.9500436262165433e+01 1.3543525387246625e+01 2.0629409301244063e+01 0 0 0 +2072 2 3.8891740371251265e-01 2.8010580003273464e+01 1.1290754689919872e+01 1.8919865387757891e+01 0 0 0 +2122 1 -7.6644048790081043e-01 2.8976243521620926e+01 1.1401425816808537e+01 1.9049523031513747e+01 0 0 0 +2224 1 -7.6287182875028514e-01 2.6302186259578878e+01 1.1200627055575357e+01 1.8558007066340860e+01 0 0 0 +2124 2 3.8177232409347289e-01 2.9162220178382157e+01 1.2281700072770796e+01 1.9590310578059650e+01 0 0 0 +2247 2 3.7278880601710385e-01 2.6732418424088859e+01 1.3375916691502859e+01 2.2948704244468736e+01 0 0 0 +2912 2 3.5654891863482036e-01 2.8478781872414316e+01 1.4628254342701968e+01 1.8070471132846095e+01 0 1 0 +2911 1 -7.3296770724997251e-01 2.7562138940867662e+01 1.4686028519329875e+01 1.7771090994399270e+01 0 1 0 +2245 1 -7.3198965470550681e-01 2.7613387979096714e+01 1.3034627827881975e+01 2.3073332631836262e+01 0 0 0 +2732 2 3.6399052841284724e-01 2.8474495064115239e+01 1.0035090529339035e+01 2.4089533533768773e+01 0 0 0 +1405 1 -7.1712130024312082e-01 2.4909497949203029e+01 1.2417893636624896e+01 1.6247143313584463e+01 0 1 0 +1919 2 3.8535487605174684e-01 2.7056171148481642e+01 1.4437251107957492e+01 1.8535957281679362e+01 0 0 0 +137 2 3.6010823860519475e-01 2.8070308191720184e+01 1.3668673401282824e+01 2.3632800567763915e+01 -1 0 0 +2797 1 -7.4053306465865087e-01 2.7531406994413494e+01 1.0337524702304648e+01 2.4187314942978201e+01 0 1 0 +1407 2 3.3584572053128925e-01 2.4134739719232172e+01 1.1828768930389478e+01 1.6211473199796917e+01 0 1 0 +2887 1 -6.6686361361738655e-01 1.7366594829490911e+00 3.8184872265588798e-01 3.0534326547643687e+01 1 1 0 +2356 1 -7.3218856391362297e-01 8.7508872956418760e+00 1.5223406319860592e+01 1.5987431167238142e+01 0 0 0 +1135 1 -7.1096791971419460e-01 2.6483728833226294e+01 1.5402925392905622e+01 2.7411168513907231e+01 0 0 -1 +45 2 3.6392287941140833e-01 1.4006717062920890e+01 7.9881129827318178e+00 1.5817203648188739e+01 0 0 0 +652 1 -7.1326045703175078e-01 1.7940745850141756e+01 1.5517649835166518e+01 2.0664114896539090e+01 0 0 0 +1605 2 3.5111781404263770e-01 2.6299486851682459e+00 1.9084394243801095e+00 2.6702910352040490e+01 0 0 0 +156 2 3.7815022812234889e-01 2.8944617535136126e+00 3.7000780234493660e+00 2.3375635489162701e+01 0 0 0 +2576 2 3.6944053787329784e-01 4.5306460799063819e+00 6.8045844706988023e-01 2.3882858342485843e+01 0 1 0 +1603 1 -7.2352326684273671e-01 2.0925608534674192e+00 1.4994002789243699e+00 2.6053898871459438e+01 0 0 0 +1604 2 3.5784239543508978e-01 2.6558924493573683e+00 1.6491644984747833e+00 2.5285569030322147e+01 0 0 0 +768 2 3.5889503483555663e-01 2.6155775692569061e+00 6.2952737954860494e+00 3.0069361965627756e+01 0 0 -1 +959 2 3.4847682532600549e-01 3.3896562876093910e+00 5.3534311883952777e+00 2.8301965994702510e+01 0 0 -1 +154 1 -7.1845298746042896e-01 3.0060271800735214e+00 2.6906180589790232e+00 2.3485835681460074e+01 0 0 0 +155 2 3.6310940125395524e-01 3.9564133801821355e+00 2.4997700481529299e+00 2.3608032808913929e+01 0 0 0 +746 2 3.3452565110090060e-01 4.6091031750912199e+00 2.0564926734150242e+00 2.8598566794230077e+01 1 0 -1 +745 1 -7.4957206719184666e-01 4.6446472830542271e+00 2.0601499171929896e+00 2.7656284147156228e+01 1 0 -1 +747 2 3.3876187850410905e-01 5.5986980737654228e+00 2.2173410774498237e+00 2.7463488941283973e+01 1 0 -1 +2140 1 -7.5910771445322278e-01 4.6072371158375891e-01 5.6894736955241223e+00 2.7002676169462639e+01 1 0 0 +760 1 -7.2383900700149562e-01 3.0124918542978749e+00 4.9031052564718873e+00 2.7509888261364623e+01 0 0 -1 +761 2 3.3007493639865093e-01 3.3127594365808206e+00 4.0046170422366432e+00 2.7669968488879821e+01 0 0 -1 +766 1 -7.8191702293143428e-01 3.4450228601390331e+00 6.6501573073070226e+00 2.9746624243370210e+01 0 0 -1 +2142 2 3.8289699939760330e-01 1.3174004643759945e+00 5.1965945452085469e+00 2.7210580526167202e+01 1 0 0 +104 2 3.5380180318457871e-01 5.5198701162709645e+00 6.8752345186909745e+00 2.6249799741025491e+01 0 0 -1 +55 1 -6.9427182695468448e-01 5.9577817224673000e+00 6.4368574169994650e+00 2.5509779416469595e+01 0 0 -1 +2243 2 3.7410388442771397e-01 1.2034232408547305e+00 7.1972306827937826e+00 2.7274449960386374e+01 1 0 0 +57 2 3.7136024885638275e-01 5.2676968644264459e+00 6.2372575723454098e+00 2.4839309811753004e+01 0 0 -1 +1610 2 3.7631132379252363e-01 4.0437390210148987e+00 3.2407764692770552e-01 2.8154713224445732e+01 0 0 0 +231 2 3.7991147877901293e-01 6.1647893646658352e+00 5.0583850605738689e+00 3.0835566349958654e+01 0 0 -1 +2575 1 -7.3924682246274653e-01 5.6104836585269391e+00 2.2948051186240721e+00 2.4068361492403909e+01 0 1 0 +229 1 -7.3142249570417361e-01 5.6897214367236337e+00 5.0771683978045949e+00 2.9988809681094182e+01 0 0 -1 +2242 1 -7.5275488968526127e-01 1.6121977001859173e+00 8.0621852338332864e+00 2.6927327677845390e+01 1 0 0 +1709 2 3.7759477195007612e-01 2.3009551945892234e-01 2.9054335778181983e-01 2.2910480586009719e+01 0 0 0 +230 2 3.7105478337597031e-01 4.9008827539773936e+00 5.7163105546997963e+00 3.0041707584755315e+01 0 0 -1 +1437 2 3.4991221351340213e-01 2.9437131111781120e+01 9.2616161897067162e+00 1.6312167778586037e+01 0 0 0 +2257 1 -7.3155476328684443e-01 2.7783557954778793e+01 1.5400060019718380e+01 2.4781951177859217e+01 -1 0 0 +2141 2 3.4741712872681252e-01 3.8863220752417565e-01 5.7522035734289352e+00 2.6005208355033556e+01 1 0 0 +1506 2 3.7428710536178583e-01 3.4616250200203041e-01 2.2811146231229431e+00 2.5588369112161367e+01 0 0 0 +2341 1 -7.6276413519313246e-01 8.7773055780748210e-01 7.1913810433029584e+00 2.4444154580846838e+01 0 1 0 +604 1 -7.3234327216229211e-01 9.7533281522530437e+00 8.0503141526497166e-02 2.8715255588762510e+01 0 0 -1 +1668 2 3.8204713336037099e-01 7.0998155724257650e+00 7.6432442203046289e+00 3.0448364884145068e+01 0 0 0 +2470 1 -7.1006127391757046e-01 5.8392836050614196e+00 1.9472392741888216e+00 3.0045369550134733e+01 0 1 0 +1698 2 3.7835501800116833e-01 1.0620223823987079e+01 2.0039196363086931e+00 2.4380001590043584e+01 0 0 0 +2505 2 3.9505263210629882e-01 7.7472986644074577e+00 1.6450692330334811e+00 2.7092945216945559e+01 0 1 0 +1790 2 3.9959303180025546e-01 8.6149533170788413e+00 1.3639145340245475e+00 2.8480885121536478e+01 0 0 0 +1667 2 3.4316804129203538e-01 6.7094284903958750e+00 6.4608432582388646e+00 2.9436238510216565e+01 0 0 0 +2471 2 3.8693552030295769e-01 6.6157992859761992e+00 1.8301818197673485e+00 2.9397771245472452e+01 0 1 0 +828 2 3.6959373561806791e-01 7.9730749989243206e+00 5.3762975343585486e+00 2.6510240742923454e+01 0 1 -1 +827 2 3.8533812346834262e-01 9.1098967293564321e+00 5.7867348203768900e+00 2.5415050302772961e+01 0 1 -1 +2290 1 -7.2311861325806781e-01 7.1990819250561247e+00 4.4161739407096965e+00 2.3214107095139333e+01 0 1 0 +2292 2 3.5282785373504333e-01 6.6043512343042048e+00 5.1504590610166359e+00 2.3369187485954960e+01 0 1 0 +826 1 -7.7327279910532365e-01 8.8852591236397522e+00 5.3907166658805066e+00 2.6321780757862346e+01 0 1 -1 +2462 2 3.8127918981240727e-01 1.1106926559939263e+01 3.2142510335419128e+00 2.6313151503225818e+01 0 0 0 +2577 2 3.9111127420726477e-01 6.1737599263758964e+00 3.0920245359822180e+00 2.3754152255765142e+01 0 1 0 +1676 2 3.4671941264342054e-01 9.3309146799038558e+00 6.0605507641258232e+00 2.7918826665849195e+01 0 0 0 +2463 2 3.5797165668398834e-01 1.0529963878015691e+01 4.6798321049604681e+00 2.6604494471453545e+01 0 0 0 +2461 1 -7.6672260309278528e-01 1.1330983766945398e+01 4.1107424917779500e+00 2.6588347801866334e+01 0 0 0 +1675 1 -7.5495380454948657e-01 9.6517566920452396e+00 6.6463425202929249e+00 2.8643151899383643e+01 0 0 0 +1677 2 3.7929200748761688e-01 8.7702547003611944e+00 6.8687629380470234e+00 2.9126412959566544e+01 0 0 0 +1612 1 -7.3815051531118636e-01 1.1246395560967327e+01 4.4466625634810439e+00 2.9348903503134387e+01 0 0 0 +1695 2 3.5770006483896866e-01 8.2820740425731127e+00 1.5367669740626146e+00 2.5115092014407637e+01 0 0 0 +1613 2 3.6211581024232170e-01 1.0586182661907189e+01 5.1683886359094950e+00 2.9192950691679115e+01 0 0 0 +1614 2 3.6663082131535712e-01 1.1360675801485524e+01 4.1186753637637681e+00 2.8426967799714145e+01 0 0 0 +2504 2 3.9006410078894199e-01 6.1686030868556090e+00 1.8484193377472726e+00 2.4856211741934199e+01 0 1 0 +1666 1 -7.4804678719134265e-01 7.2295609345927812e+00 7.3725389976496345e+00 2.9498489434899135e+01 0 0 0 +1789 1 -7.0789100849723052e-01 7.8347032250510464e+00 1.8745090856575120e+00 2.8150593435894123e+01 0 0 0 +1102 1 -7.2484897577735463e-01 7.4954160196154804e+00 1.3475667352039538e+00 2.5622737359185873e+01 0 1 0 +1950 2 3.8211414353034612e-01 2.6318576396838196e+01 6.2005906232047820e+00 3.0926365845374470e+01 0 0 0 +201 2 3.8505026476286963e-01 2.8875311946310578e+01 1.0486113117526268e-01 2.5903813880384430e+01 -1 0 -1 +213 2 3.5331547354572462e-01 1.0094350323601551e+01 1.6355217338086478e+00 2.9902040913462724e+01 0 0 -1 +1697 2 3.5665869442543852e-01 1.1812417085794502e+01 1.4179132341840108e+00 2.5349575673031623e+01 0 0 0 +1696 1 -6.9906214495727226e-01 1.0816648011309034e+01 1.5732587734711427e+00 2.5266034404801520e+01 0 0 0 +2784 2 3.8284675805091112e-01 1.1800505099415970e+01 5.3980783829212857e+00 2.5506553022148633e+01 0 1 0 +200 2 3.5498199675316910e-01 2.9860072104936709e+01 1.2613231033752976e+00 2.5515978975457060e+01 -1 0 -1 +2087 2 3.8132925818039848e-01 2.7079357627333255e+01 3.9538809364147370e-01 2.4125426836104438e+01 0 0 0 +2055 2 3.9062362437675457e-01 2.6027125624982066e+01 9.0056621598958237e+00 2.3815178340636532e+01 0 0 0 +2715 2 3.8679293265460046e-01 1.7672954384457459e+01 2.4689610820071568e+00 2.3791118220408435e+01 0 1 0 +2530 1 -7.4476748089193567e-01 1.5164226625356950e+01 9.7577773171138671e-01 2.3001443303076130e+01 0 1 0 +2713 1 -7.7496637692445991e-01 1.7483805518372101e+01 3.3746191935728023e+00 2.4103637805231486e+01 0 1 0 +1879 1 -7.2581626411596223e-01 1.6079187392870164e+01 7.7491964483766420e+00 2.3322678776045596e+01 0 0 0 +198 2 4.0416597710417085e-01 1.2339982134060692e+01 5.2958185199224834e+00 3.0553713530058854e+01 0 0 -1 +383 2 3.6816002057937336e-01 1.3718608800421432e+01 2.2539414034241911e+00 2.4632719231922977e+01 0 0 -1 +2189 2 3.7184577153859505e-01 1.3697004879830212e+01 7.4745839213884258e-01 2.5202791018715246e+01 0 0 0 +1808 2 3.5707964716517671e-01 1.2164030559487436e+01 7.3814702824088050e+00 2.3810382629409432e+01 0 0 0 +412 1 -7.2247844298604080e-01 1.4280465766839763e+01 2.0154595068977179e+00 2.9596266300365343e+01 0 0 -1 +2188 1 -7.4594174866031282e-01 1.3533969980129937e+01 1.6527397343918953e+00 2.5395849873291269e+01 0 0 0 +1794 2 3.8659034471889031e-01 1.4463252385309664e+01 5.6746620476312488e+00 2.8245119598851449e+01 0 0 0 +1691 2 3.9863451050656573e-01 1.4288471439622102e+01 7.7356083129237740e+00 2.9938865219573312e+01 0 0 0 +2782 1 -7.4311594708760220e-01 1.2401050650869941e+01 5.7841873787684888e+00 2.4847262494224694e+01 0 1 0 +2714 2 3.8020034689892418e-01 1.6508369862393078e+01 3.4988704682037368e+00 2.4208899519999502e+01 0 1 0 +1867 1 -7.2703398778301620e-01 1.4320172044433900e+01 6.6061317379975737e+00 2.8590330500386656e+01 0 0 0 +1860 2 3.6259354613133710e-01 1.3682191928063379e+01 7.0944660188658855e+00 2.7989646814815874e+01 0 0 0 +1801 1 -7.4395001518338510e-01 1.4524362524969639e+01 3.9127560792567242e+00 2.7574044750927154e+01 0 0 0 +24 2 3.1572007617749354e-01 1.5629619413419856e+01 5.6405255910187329e+00 2.5727182980490600e+01 0 0 -1 +23 2 3.3802191421555616e-01 1.5125566437350948e+01 6.7160073750058054e+00 2.6620021779098007e+01 0 0 -1 +22 1 -7.3055579090838396e-01 1.5891352345289096e+01 6.5418138309028828e+00 2.6029168877611063e+01 0 0 -1 +2424 2 3.5056989389545112e-01 1.4175089634680990e+01 4.8223776090127233e+00 2.4370479728181770e+01 0 1 0 +1802 2 3.4706211476779852e-01 1.5261195821634548e+01 3.4496911264633634e+00 2.7077869109044276e+01 0 0 0 +1822 1 -7.3869738211977010e-01 1.6945727137725200e+01 2.3665741269187799e+00 2.6754995542136687e+01 0 0 0 +2566 1 -7.2238086286676650e-01 1.4732018505396947e+01 4.0616910904253132e+00 2.4184656701567210e+01 0 0 0 +1824 2 4.0099874000931812e-01 1.6361263160538176e+01 1.5433515087414060e+00 2.6681694995932268e+01 0 0 0 +1823 2 3.5259860836217050e-01 1.7004232190130114e+01 2.7659484071560354e+00 2.5864238730984031e+01 0 0 0 +413 2 3.8194871278859543e-01 1.4493083830094669e+01 2.6915599088621218e+00 2.8964653139671135e+01 0 0 -1 +1132 1 -7.8684514788307447e-01 1.8113618383064782e+01 6.6564105624918390e+00 2.7825846085913078e+01 0 0 -1 +1023 2 3.9654087966533347e-01 1.7443075465581735e+01 5.7488500582853614e+00 2.9150612393490185e+01 0 1 -1 +1803 2 3.5226628335139892e-01 1.3736252433620466e+01 3.4577806895413277e+00 2.7297176176563575e+01 0 0 0 +1881 2 3.7309282547796940e-01 1.5960450825911897e+01 7.1685773230358913e+00 2.4089572576216767e+01 0 0 0 +2783 2 3.4352357034503550e-01 1.2988656095323929e+01 6.3854497952466618e+00 2.5318059663795211e+01 0 1 0 +1021 1 -7.5456799263442131e-01 1.7525918910477358e+01 4.9951615398262001e+00 2.9759290956075663e+01 0 1 -1 +1134 2 3.6239482331144030e-01 1.7462744899850858e+01 6.5074837269233123e+00 2.7077778836775249e+01 0 0 -1 +1793 2 4.1572512658299882e-01 1.8073425223065041e+01 3.3575067534915588e+00 2.9207373212601954e+01 0 0 0 +2796 2 4.2213039093411159e-01 1.8179336613522949e+01 2.4919400463894288e+00 2.7864552441067762e+01 0 1 0 +1792 1 -7.3738376359606139e-01 1.8620994317729217e+01 2.7171006406247078e+00 2.8759393908495117e+01 0 0 0 +1880 2 3.6330696047818717e-01 1.6995808128896741e+01 8.1279433991093537e+00 2.3311703301759788e+01 0 0 0 +2061 2 3.2537907809503785e-01 2.2440273268792474e+01 1.0964887291422052e+01 1.6297516466307698e+01 0 0 0 +839 2 3.8027724849319211e-01 2.7759267097755888e+01 5.4301314090060684e+00 1.6279486475935325e+01 -1 1 0 +1308 2 3.4652344809115321e-01 2.7376399502770262e+01 1.2686836450099335e+01 3.0847557279745700e+01 0 1 -1 +414 2 3.5026080502107043e-01 1.3610820703506388e+01 1.3989815362903599e+00 2.9152424176363148e+01 0 0 -1 +838 1 -7.4661124037097937e-01 2.8336958586340820e+01 4.6545977211036629e+00 1.5985798359172170e+01 -1 1 0 +2040 2 3.4841893979641375e-01 2.3116508880722311e+01 2.2742405108769868e+00 2.3248279285215204e+01 0 0 0 +408 2 3.3615325000522034e-01 2.1886245219915821e+01 1.4620116047737040e+00 3.0305882116767531e+01 0 0 -1 +1319 2 3.6377511606203944e-01 2.2679173557773613e+01 3.8312650465522329e+00 3.0337714197555496e+01 0 0 -1 +1725 2 3.5999155580158826e-01 1.9396800376357625e+01 2.8517078784890120e+00 2.4770633049667293e+01 0 0 0 +1723 1 -7.0291368591368775e-01 2.0031609566505022e+01 2.3100487504592011e+00 2.5236743027128966e+01 0 0 0 +2039 2 3.8601830871155030e-01 2.4689986385242818e+01 2.7333703199245574e+00 2.3533497119533202e+01 0 0 0 +1975 1 -7.7479016530442568e-01 2.2035449930098789e+01 5.9817972726034707e+00 2.3596815989300730e+01 0 0 0 +1133 2 4.0552689273242359e-01 1.8982058003137158e+01 6.2605938973427699e+00 2.7616583004620413e+01 0 0 -1 +251 2 3.7998342573887978e-01 2.0934339493891319e+01 1.3052873225415755e+00 2.6503990225166806e+01 0 0 -1 +2013 2 3.9423272690181710e-01 1.8631629587743380e+01 1.1303446468208378e+00 2.9505706772310898e+01 0 0 0 +2221 1 -7.5996622342131370e-01 2.4433660816953392e+01 3.1920332351693292e-01 2.7233526334968218e+01 0 0 0 +2038 1 -7.2477816625334268e-01 2.3890510211906154e+01 2.1946548833974879e+00 2.3908604479720488e+01 0 0 0 +1918 1 -7.4155527600601256e-01 2.5926359835059351e+01 1.4698996019020885e+01 2.0016330192932870e+01 0 0 0 +2015 2 3.6363809299288735e-01 2.2778312640167730e+01 3.1461983364573145e+00 2.5033216009192092e+01 0 0 0 +2016 2 3.7478891531000047e-01 2.2657166473054961e+01 4.6844022674643870e+00 2.4869835982086411e+01 0 0 0 +2014 1 -7.1214110885986637e-01 2.2571366834895294e+01 3.9748534047102417e+00 2.5540547659930525e+01 0 0 0 +1724 2 3.4134589759837836e-01 2.0842203093187724e+01 2.8239487034057364e+00 2.5299412584682365e+01 0 0 0 +2615 2 3.8528317315514266e-01 2.1777207634367581e+01 2.5957189027018090e+00 2.8075641756680287e+01 0 1 0 +2616 2 3.5940547383941868e-01 2.0785643999831347e+01 3.1781194810922901e+00 2.9152301692711102e+01 0 1 0 +2614 1 -7.6820777209436375e-01 2.1692978096403248e+01 3.1748162583595714e+00 2.8848176403157424e+01 0 1 0 +250 1 -7.3931312868170040e-01 2.1673960370643645e+01 9.5121953101989898e-01 2.7056977704243231e+01 0 0 -1 +2223 2 3.7247416059367261e-01 2.3541408786793877e+01 6.6017054320870006e-01 2.7434862837779910e+01 0 0 0 +1938 2 3.6279674091145114e-01 2.1096445250826850e+01 4.8628377591166805e+00 2.8083029348299146e+01 0 0 0 +2975 2 3.8381030301725305e-01 2.3805159178106493e+01 5.0293373259224659e+00 2.6723716857786389e+01 0 1 0 +2974 1 -7.2344779356769162e-01 2.4633119241402110e+01 5.4403491464787317e+00 2.6950581463737869e+01 0 1 0 +1936 1 -7.0856542248055776e-01 2.0701215126028124e+01 5.7697851570504719e+00 2.7901223821110477e+01 0 0 0 +2208 2 3.9722107295347597e-01 2.1984122819343177e+01 6.9208006527616437e+00 2.5149997722782850e+01 0 0 0 +1944 2 3.7009164707375797e-01 2.1452746854380685e+01 6.4137866829722237e+00 2.7642214835097100e+01 0 0 0 +2222 2 3.7668046195695482e-01 2.5040740162029486e+01 1.0461749322270053e+00 2.6946065048380657e+01 0 0 0 +2767 1 -7.4337786974117792e-01 2.1742307820327344e+01 1.5134418643722100e+01 2.4366126454495504e+01 0 0 0 +371 2 3.6116972247229417e-01 2.0271230995454754e+01 7.1271787017209522e+00 2.9462320916362494e+01 0 0 -1 +2268 2 3.8457219349314065e-01 2.5980819952702472e+01 1.3714583291187926e+01 2.7282890283323162e+01 -1 0 0 +1232 2 3.4413758709031472e-01 2.9137567040215881e+01 1.0949202512858209e+01 3.0188781454335743e+01 0 0 -1 +1505 2 3.3551538791325869e-01 3.0317430235107839e+01 2.9847883207742885e+00 2.6452510489649907e+01 -1 0 0 +2272 1 -7.1071342598118648e-01 9.3835958734398410e+00 1.9561492285590161e+00 1.6622592390969427e+01 0 1 0 +1402 1 -6.9090595601270877e-01 2.6153445107788702e+01 3.6986035008505143e+00 2.3233331582584253e+01 0 1 0 +642 2 3.9542601294035035e-01 2.5957914270746148e+01 4.6662342532055536e+00 2.3026093473662279e+01 0 0 0 +406 1 -7.2490031864237825e-01 2.1528688902268865e+01 7.9429199794798822e-01 3.0885245286492957e+01 0 0 -1 +2258 2 3.9486945463227829e-01 2.7359054985104358e+01 1.5436089924173725e+01 2.5637251930300373e+01 -1 0 0 +1431 2 3.9006331304254127e-01 8.2659253456867976e+00 1.1522236767241642e+01 3.0860983968750393e+01 1 0 -1 +2976 2 3.9887145224155784e-01 2.4517444990185002e+01 6.3712412588653491e+00 2.6740258769931579e+01 0 1 0 +2100 2 3.6322920647257073e-01 2.9629275158220981e+01 4.5700023648180492e+00 2.2808902444718804e+01 0 0 0 +2999 2 3.5082069769033863e-01 2.7040992222736573e+01 6.3552519615497500e+00 2.2920612554283686e+01 0 1 0 +1220 2 3.4087260111907031e-01 2.9682593014266931e+01 6.7623466501355862e+00 2.7401651354898359e+01 0 1 -1 +881 2 3.7611075813075673e-01 8.2941119941425061e+00 2.4507050696816179e-01 2.1775686689633140e+01 0 1 0 +2120 2 3.5975526793042684e-01 2.9234149746931653e+01 8.3374100951964962e+00 2.3985806198816153e+01 0 0 0 +2098 1 -7.1624302267277173e-01 2.9462080781502500e+01 4.7667433676649136e+00 2.3739855004374014e+01 0 0 0 +1943 2 3.2804604961872091e-01 2.6167227951336340e+01 2.7451899980758090e+00 2.7322560420098402e+01 0 0 0 +2910 2 3.7101859261354220e-01 2.8735247220914726e+01 6.3319590384294813e+00 2.4458525183914798e+01 0 1 0 +2908 1 -7.2716197609036148e-01 2.8378839276950643e+01 7.2498675408571609e+00 2.4719567635135576e+01 0 1 0 +1942 1 -6.8838152630748339e-01 2.6379132025647991e+01 2.0205581695014101e+00 2.6642795589277483e+01 0 0 0 +2420 2 3.3319989750073198e-01 2.7128680562758586e+01 1.5534418813685780e+00 2.7085445017186270e+01 -1 1 0 +1504 1 -7.3813947165875382e-01 3.0614709508732197e+01 2.8938895549518966e+00 2.5526870002667810e+01 -1 0 0 +2168 2 3.7507212316829724e-01 2.9040012568709660e+01 4.0195686600996305e+00 2.8053508071473072e+01 0 0 0 +1306 1 -7.3274483043115135e-01 2.8188220391426622e+01 1.2863624903147597e+01 3.0372057121312960e+01 0 1 -1 +2868 2 3.3936535350076769e-01 2.2235497459102703e+01 1.2320692327513624e-01 1.5742347904127183e+01 0 1 0 +2798 2 3.3851635523595636e-01 3.0527506010436827e+01 4.0585061296507003e+00 2.8051268696236018e+01 0 1 0 +2167 1 -7.4174741026786273e-01 2.9775876264620848e+01 3.5160377555752933e+00 2.8311356739956437e+01 0 0 0 +2909 2 3.7305397904399157e-01 2.8652845000281829e+01 7.5003064417264893e+00 2.5670730788252705e+01 0 1 0 +2889 2 3.9806029509204588e-01 2.9654465761888165e+01 3.9558254468869434e+00 2.4258640376803672e+01 0 1 0 +2733 2 3.7517338274961209e-01 2.7028842914118083e+01 4.6824780691510828e+00 2.8824592225694200e+01 0 0 0 +2731 1 -7.1900772137801938e-01 2.7122895792893566e+01 4.7338574122783506e+00 2.7849286889968994e+01 0 0 0 +671 2 3.8169834079412152e-01 2.9864196120943340e+01 1.7126153484504640e+00 2.9226896633769105e+01 0 0 -1 +1403 2 4.0132675187727163e-01 2.6224451088274588e+01 5.1348426597395056e+00 2.7597014274458878e+01 0 1 0 +670 1 -7.4002040050912421e-01 2.9874692231980340e+01 1.0162881596271729e+00 2.9897001642592940e+01 0 0 -1 +1221 2 3.7142453933153258e-01 2.8279180522399930e+01 6.3082051403849597e+00 2.7253072575456311e+01 0 1 -1 +1219 1 -7.4636223009135871e-01 2.8758138158755816e+01 7.1096213158585195e+00 2.7330644076947245e+01 0 1 -1 +672 2 3.6210127057263714e-01 3.0760197576931898e+01 1.0466490121463978e+00 3.0247980756380638e+01 0 0 -1 +1435 1 -7.2190580097339840e-01 2.9452542875187081e+01 8.3672546868835571e+00 1.5906688128526630e+01 0 0 0 +2059 1 -7.3637836147899527e-01 2.1998281203684527e+01 1.1770994523966618e+01 1.6128556252963122e+01 0 0 0 +1542 2 3.5572588517955095e-01 4.9678608395711095e+00 1.4496217192802565e+01 2.7229720314445228e+01 0 0 0 +1540 1 -6.9617458328670623e-01 5.6494376971442675e+00 1.4712315230056680e+01 2.7937831813085410e+01 0 0 0 +39 2 3.5861234707695044e-01 4.2242415429574915e+00 7.1689718685924051e+00 2.7971694427089329e+01 0 0 -1 +37 1 -6.8293218877967798e-01 4.2243836444752185e+00 7.8731720250773298e+00 2.7244136020901131e+01 0 0 -1 +38 2 4.0408897137400679e-01 3.2693517614548901e+00 8.0355786580291166e+00 2.6892708490084008e+01 0 0 -1 +2169 2 3.7283530489617012e-01 1.4461182609017900e+00 7.9806912796887701e+00 2.5962933797040051e+01 1 0 0 +2267 2 2.9668086831985852e-01 2.5218640424788600e+01 1.5265070169491409e+01 1.5671407808032143e+01 -1 0 0 +72 2 3.7026895866173609e-01 1.3867832616450693e+01 1.4159720159449840e+01 3.0646427607190635e+01 0 0 -1 +2864 2 3.2700706478367164e-01 2.2260451793554332e+00 1.4487314715567837e+01 2.3536880541097752e+01 1 0 0 +2359 1 -6.8370245709145028e-01 3.0582305117577373e+01 1.4674977867580935e+01 3.0856409602959928e+01 -1 0 0 +462 2 3.4300757633537127e-01 7.4140687869223365e+00 2.7094644349793407e-02 1.8276899988028021e+01 0 1 0 +2362 1 -7.2627827420049385e-01 5.1300680550884314e-01 1.4918816875037386e+01 2.5135838730051187e+01 0 0 0 +1592 2 3.7139105979830456e-01 2.9400588249469295e+00 1.4517999193433587e+01 2.9001036244968251e+01 0 0 0 +2941 1 -7.4462083103699006e-01 9.3610162932407676e-02 1.0181900578098317e+01 2.7565106823884161e+01 1 0 0 +1591 1 -7.2882083130276931e-01 2.5307453373854911e+00 1.4151414661377173e+01 2.8248997847423023e+01 0 0 0 +2396 2 3.6784498076161737e-01 3.0646037543374511e+01 1.0246317877433162e+01 2.8449760965429725e+01 -1 0 0 +2298 2 3.6457852508912042e-01 2.9919726624970487e+01 1.0961711742085427e+01 2.3895181447391430e+01 -1 0 0 +2284 1 -7.4986487750855080e-01 4.2221351932768503e+00 1.4512571687982078e+01 2.5577301509529715e+01 0 0 0 +906 2 3.5494463352187366e-01 5.0623581615972464e+00 1.4834750370470212e+01 2.5110075858927122e+01 0 0 0 +1593 2 3.6294671123359029e-01 2.6911123838420017e+00 1.4729274599255127e+01 2.7500072314648300e+01 0 0 0 +2286 2 3.4001321138576840e-01 3.6077027164224593e+00 1.5354396474631793e+01 2.5659230906477365e+01 0 0 0 +1588 1 -7.0224825924218082e-01 3.9396362933366968e+00 1.1180257810114183e+01 2.9672092199664018e+01 0 0 0 +1541 2 3.6634528701174501e-01 6.4232917626113029e+00 1.4045427369791419e+01 2.7798968297227240e+01 0 0 0 +1590 2 3.9299471288102078e-01 3.8439067244240359e+00 1.1182704270701278e+01 2.8725760042884541e+01 0 0 0 +939 2 3.7889554677963672e-01 3.1308990689371603e+00 9.0706579105645471e+00 2.3825276035668782e+01 0 1 0 +590 2 3.4099858381779224e-01 3.9079268612007989e+00 1.1023233719783413e+01 2.4416295019901721e+01 1 0 -1 +589 1 -7.3055710272660168e-01 3.1588868788990050e+00 1.0521774667455457e+01 2.4794251812079033e+01 1 0 -1 +591 2 3.9640569180812241e-01 3.0069035000148943e+00 1.0819166199861776e+01 2.5720713444941524e+01 1 0 -1 +2209 1 -7.4058726174786715e-01 2.4651844894301518e+00 1.1450756359328805e+01 2.7442975570571651e+01 1 0 0 +2210 2 3.9054443342471989e-01 2.4574421765046113e+00 1.2399789697648865e+01 2.7692287455894533e+01 1 0 0 +2342 2 3.8362119674916201e-01 1.5551610000962601e+00 7.4983921792818649e+00 2.3810325756597745e+01 0 1 0 +2211 2 3.9427357191716933e-01 1.5470960743010029e+00 1.1073827292825166e+01 2.7570238020110391e+01 1 0 0 +2943 2 3.9514820652904376e-01 5.5471627542911661e-01 9.3388406833634612e+00 2.7614604490374539e+01 1 0 0 +2296 1 -7.1236628613563036e-01 3.0288038992894748e+01 1.1891617541030371e+01 2.3785810801441983e+01 -1 0 0 +2285 2 3.8843422502513547e-01 3.0504430738562395e+01 1.2277686589018002e+01 2.4639067344550650e+01 -1 0 0 +2936 2 3.7592630022093781e-01 3.0495347353597253e+01 1.1796023505393366e+01 2.6730913591147498e+01 0 0 0 +1589 2 3.5585578732322409e-01 3.0769313060266446e+00 1.1401326177486144e+01 3.0019014162730830e+01 0 0 0 +1715 2 3.6592154707217900e-01 1.9119631631711794e+01 5.0957894691655037e+00 3.0856115566946080e+01 0 0 -1 +2179 1 -7.3576805836275816e-01 7.6428581120790291e+00 1.3649075742178995e+01 2.3868015950000178e+01 1 0 0 +1430 2 3.6962577028369970e-01 9.5114639211613827e+00 1.1146345127838069e+01 2.9896118744479889e+01 1 0 -1 +2099 2 3.5590240159484249e-01 2.5165549541140205e+01 3.2366734523813196e+00 1.6492967667691268e+01 0 0 0 +2400 2 3.6240394614890403e-01 7.8397507555831805e+00 1.0390370612433033e+01 2.8804495886785038e+01 0 0 0 +51 2 3.6426344024945895e-01 6.9484764865737683e+00 1.1903531431972809e+01 2.7865028600320933e+01 0 0 -1 +49 1 -7.3441038539718639e-01 7.4046816950252339e+00 1.2688289530083246e+01 2.7514386835899902e+01 0 0 -1 +50 2 3.7680649087463575e-01 8.0628416188075249e+00 1.2839291690922069e+01 2.8189651996597505e+01 0 0 -1 +1223 2 3.7553084906304313e-01 1.0410741065457357e+01 9.2462147121461822e+00 2.9222646529105592e+01 0 0 -1 +1222 1 -7.5752147116263280e-01 1.0437140477975637e+01 9.5239762304402991e+00 3.0109463093526308e+01 0 0 -1 +2613 2 3.9209503293121073e-01 1.1379096832794138e+01 1.4210732760283307e+01 2.3982189963442210e+01 0 1 0 +2399 2 3.9151086462139789e-01 7.2864631937944306e+00 9.0003713345648766e+00 2.8539637167125836e+01 0 0 0 +2421 2 3.4816273159019728e-01 5.4747690850977886e+00 1.2595299279229106e+01 2.5700338326658262e+01 0 1 0 +2398 1 -7.2570165141514331e-01 7.1952936871103788e+00 9.8829171701046032e+00 2.8215888078479619e+01 0 0 0 +1568 2 3.6834063502975911e-01 6.1560165127909396e+00 8.6181010067783088e+00 2.5506608774633765e+01 0 0 0 +1601 2 3.2358122622373536e-01 1.0116384061065309e+01 6.4982652262942358e+00 2.3451422880453226e+01 0 0 0 +2233 1 -7.6861675710023625e-01 5.6161524871326440e+00 1.1981694313675961e+01 2.4969285341615876e+01 1 0 0 +2235 2 3.9836520947625603e-01 5.9696953497278322e+00 1.1198915402289865e+01 2.5328621473404599e+01 1 0 0 +205 1 -7.3186253672978274e-01 9.1783924588759973e+00 6.4329403599104618e+00 2.3715969238286270e+01 0 0 -1 +807 2 3.5677813942826919e-01 9.9407577011290922e+00 1.4762319948506670e+01 2.7529406079765664e+01 0 0 -1 +1567 1 -7.4318531449877401e-01 6.5885014905525283e+00 9.4150600556692012e+00 2.5476266167280151e+01 0 0 0 +1569 2 3.6287698509635291e-01 6.7669684753976611e+00 9.4857954369291981e+00 2.6478231281362799e+01 0 0 0 +2589 2 3.5864712440984275e-01 1.0246386261049768e+01 7.8905920035178907e+00 2.7693668999369891e+01 0 0 0 +1963 1 -7.2978146437310099e-01 9.6480234711128237e+00 1.4230304675408638e+01 2.9304354275696895e+01 0 0 0 +2588 2 3.6545566104495525e-01 1.0189190853122922e+01 8.8750228438218208e+00 2.6352546802691119e+01 0 0 0 +2587 1 -7.5162454275216706e-01 1.0621484814575963e+01 8.8277177881974023e+00 2.7310532994428019e+01 0 0 0 +1616 2 3.6508060642397017e-01 9.3888884268851331e+00 8.1908006786719412e+00 2.4337339212077602e+01 0 0 0 +2180 2 3.7049505703944913e-01 6.8335782900938487e+00 1.3124442268860719e+01 2.3943252330511189e+01 1 0 0 +1615 1 -7.0195211258738544e-01 9.3235833086111803e+00 9.0148562976188611e+00 2.4907497399279741e+01 0 0 0 +1617 2 3.7299194053441515e-01 8.3115161854827040e+00 9.0772445471886716e+00 2.5030182288118073e+01 0 0 0 +243 2 3.6943960457661101e-01 9.4431053783938257e+00 1.3073690124272256e+01 2.4435309877965214e+01 0 0 -1 +241 1 -7.3550207460185191e-01 1.0290879811508914e+01 1.3246509965238314e+01 2.4894754291299218e+01 0 0 -1 +242 2 3.6986133431240209e-01 1.0029662483541564e+01 1.3570438681856572e+01 2.5776338519097621e+01 0 0 -1 +845 2 3.6759904222954809e-01 1.1049604233757004e+01 1.0679185969056464e+01 2.7182404461721596e+01 0 1 -1 +846 2 3.5444703164848623e-01 1.0943196758053141e+01 1.1821319200125513e+01 2.6187538408398886e+01 0 1 -1 +844 1 -7.4646953513523773e-01 1.1514640541826521e+01 1.1481770936844777e+01 2.6901606791767986e+01 0 1 -1 +2775 2 3.7189529593826987e-01 9.6988915608867696e+00 1.3351926321439610e+01 2.9685155487054431e+01 0 0 0 +1965 2 3.6027082664024102e-01 1.0314724453905713e+01 1.4828627074189509e+01 2.9724633244913335e+01 0 0 0 +1251 2 3.6390514371470745e-01 1.2230601788389780e+01 8.3549891292779392e+00 2.6763176312018071e+01 0 0 -1 +1429 1 -7.3755387147500051e-01 8.6603756157886309e+00 1.1672256841694081e+01 2.9893916338742375e+01 1 0 -1 +1320 2 3.3984712578852078e-01 2.3740494180871607e+01 4.9289179891238080e+00 3.0337682886309828e+01 0 0 -1 +2611 1 -7.5168904395737246e-01 1.2046618954313910e+01 1.4815922679415843e+01 2.3515391494775386e+01 0 1 0 +1031 2 3.5255696149622395e-01 1.7590652400127311e+01 8.6111658574123950e+00 3.0280038245601290e+01 0 1 -1 +1030 1 -7.2090796210714692e-01 1.7485945167936734e+01 9.0101215506177201e+00 2.9374939950931687e+01 0 1 -1 +1032 2 3.6059340406568469e-01 1.7487395933041739e+01 8.2511054003332962e+00 2.8731636288112234e+01 0 1 -1 +70 1 -7.1908880074910375e-01 1.3003035662536277e+01 1.4573046134768324e+01 3.0478907896603410e+01 0 0 -1 +1224 2 3.7002032248760303e-01 1.1387284486344816e+01 9.7508752883121659e+00 3.0176246699077293e+01 0 0 -1 +1584 2 3.7338278298850380e-01 1.3122218925873353e+01 1.2560458414712578e+01 2.7609016300242700e+01 0 0 0 +1690 1 -7.3261588728269289e-01 1.4154750551460582e+01 8.0613976631500730e+00 3.0842115453033625e+01 0 0 0 +254 2 3.5400767882879891e-01 1.2975355583524246e+01 1.4358504881096881e+01 2.9535505531545841e+01 0 0 -1 +1318 1 -7.3829241788275757e-01 2.3440934652973024e+01 4.2173310504361314e+00 3.0884664709329645e+01 0 0 -1 +2067 2 3.7086266746562369e-01 1.6722170400844732e+01 1.0332129788727764e+01 3.0773577145031442e+01 0 0 0 +1249 1 -7.7176614437156921e-01 1.3149845842827069e+01 7.9479961653192213e+00 2.6533201295297772e+01 0 0 -1 +924 2 3.5926130269895179e-01 2.9777519518003594e-02 1.4642647413850332e+00 1.6076274244652478e+01 0 1 0 +1067 2 3.7555348424999740e-01 1.3474248871970975e+01 9.7777321119930694e+00 3.0871291345861994e+01 0 0 -1 +943 1 -7.3885981148809010e-01 1.3863022926984286e+01 1.2933914663542650e+01 2.8029602427302923e+01 0 0 -1 +944 2 3.2645766721847108e-01 1.4443815595593499e+01 1.2100364985372689e+01 2.8041591777057892e+01 0 0 -1 +1066 1 -6.9308342418200730e-01 1.3135376072575207e+01 1.0617038722820512e+01 3.0444555921833498e+01 0 0 -1 +2927 2 3.7231504642579638e-01 1.5948584908909615e+01 1.4366848905157598e+01 2.6497351790989303e+01 0 0 0 +2594 2 4.0942350427212904e-01 1.6866727123626671e+01 1.2447822063546607e+01 2.4504944623641542e+01 0 0 0 +2254 1 -7.5741993894989923e-01 1.7095129243139990e+01 1.3053068219190285e+01 2.6276042650491018e+01 0 0 0 +2256 2 3.5747611263439277e-01 1.6693942847611886e+01 1.2495350543941456e+01 2.6964518466576436e+01 0 0 0 +1250 2 3.9928654224103322e-01 1.3695812340575733e+01 8.7092802031819048e+00 2.6316681143940126e+01 0 0 -1 +2712 2 3.6740706677397278e-01 1.7836994135747865e+01 8.2973909185965731e+00 2.6855371731050841e+01 0 1 0 +389 2 3.8863285554926197e-01 1.4013644500234198e+01 1.1318805993758266e+01 2.4364338635282653e+01 0 0 -1 +2926 1 -6.5518108624343618e-01 1.5139904684103225e+01 1.4944574250370017e+01 2.6750834006912438e+01 0 0 0 +321 2 3.8839805196292321e-01 1.6721185856088599e+01 1.0384302981084428e+01 2.6905157017976478e+01 0 0 -1 +2593 1 -7.5584351346392065e-01 1.6711446642201821e+01 1.2177172868582511e+01 2.3635182926111757e+01 0 0 0 +2540 2 3.4933343827043423e-01 1.4559659276007043e+01 1.0699755814390009e+01 2.6618881822839249e+01 0 0 0 +2539 1 -7.6176399300844888e-01 1.3904482413237840e+01 1.0382490274097279e+01 2.5944402258811312e+01 0 0 0 +2541 2 3.6100473826910701e-01 1.3035262101429341e+01 1.0780955213044482e+01 2.6195143018200525e+01 0 0 0 +1765 1 -7.6838144694002819e-01 1.6196733211797753e+01 1.0792165979655469e+01 2.7606348291129120e+01 0 0 0 +1868 2 3.8260134982473554e-01 1.6638121121890155e+01 1.0537277543388669e+01 2.8449834790504301e+01 0 0 0 +2710 1 -7.4938284365397201e-01 1.7957536039248932e+01 9.0813264746525473e+00 2.6314605390941097e+01 0 1 0 +2711 2 3.7844864974130921e-01 1.7833608760430423e+01 8.8493325068138926e+00 2.5338943437270476e+01 0 1 0 +2255 2 3.6204341783161703e-01 1.7953977765971938e+01 1.3350999568023578e+01 2.6603482321664856e+01 0 0 0 +1831 1 -7.2163466401533338e-01 1.9864072191461105e+01 1.3829159726081066e+01 2.7797560797020392e+01 0 0 0 +2928 2 3.7733032487063167e-01 1.4608448925878156e+01 1.4235562836990999e+01 2.7195367897781161e+01 0 0 0 +1252 1 -6.9337922552946130e-01 2.3505755663332447e+01 1.5479486650063775e+01 3.0861932010713211e+01 0 0 -1 +273 2 3.6615962090347254e-01 2.0184349969732065e+01 1.0907384134317995e+01 3.0720161079963741e+01 0 0 -1 +2677 1 -6.9606850966630252e-01 1.9150644739527728e+01 1.1067304574358163e+01 2.3043684317980041e+01 0 0 0 +1954 1 -7.4644189057264454e-01 2.4607064663740783e+01 1.3434072305963191e+01 2.3021391544329379e+01 0 0 0 +1955 2 3.2345829415543931e-01 2.3977466272082573e+01 1.4196279372107945e+01 2.3030159411875562e+01 0 0 0 +767 2 4.1803269378989694e-01 3.4008874571419883e+00 7.5149829030921094e+00 3.0161455750068082e+01 0 0 -1 +1326 2 3.8458355610183048e-01 2.2657037909937561e+01 7.6952793130615769e+00 2.9808736186645596e+01 0 0 -1 +2769 2 3.6816651155703489e-01 2.1552111681654665e+01 1.4328644005991656e+01 2.3808756107552878e+01 0 0 0 +2050 1 -7.3036464236562093e-01 1.8830612616867469e+01 8.2123081028284890e+00 2.3776564335254232e+01 0 0 0 +26 2 3.7663516946512482e-01 2.4817458855973054e+01 7.3213029642390079e+00 3.0418530560350298e+01 -1 0 -1 +2052 2 3.6415991144659277e-01 1.9219186731828366e+01 8.7662510600245618e+00 2.3129451374004418e+01 0 0 0 +372 2 3.8267756729165803e-01 2.0361196230764332e+01 8.3608907289740912e+00 3.0460856817817696e+01 0 0 -1 +2777 2 3.2745849681104400e-01 1.8908100590978659e+01 1.3938658983239886e+01 3.0327175040705690e+01 0 0 0 +2051 2 3.5322405173020199e-01 1.9063977438781244e+01 7.3429362850749094e+00 2.3399643835257663e+01 0 0 0 +1203 2 3.7315442065106896e-01 2.1086677563589795e+01 9.0475313492608436e+00 2.6567582880722401e+01 0 1 -1 +2717 2 3.4179291281142737e-01 2.4586366501334876e+01 1.2450697874123701e+01 2.5943500249323172e+01 0 1 0 +2716 1 -6.9790408596402775e-01 2.3764414856222807e+01 1.2402371316352536e+01 2.5274239075029751e+01 0 1 0 +1202 2 3.8767203412495160e-01 1.9570007757344687e+01 9.6544295887039659e+00 2.6438772204238230e+01 0 1 -1 +2554 1 -6.8587633698067185e-01 2.0779628128122603e+01 1.1863751647131176e+01 2.5075524504922058e+01 0 0 0 +2555 2 3.5006620922183168e-01 2.1670502603019280e+01 1.2225748680662123e+01 2.5372392535752759e+01 0 0 0 +1459 1 -7.6091546577333902e-01 2.4531265931752326e+01 8.1992126418417346e+00 2.6382772014022091e+01 0 1 -1 +2207 2 3.5787456165345188e-01 2.2789831114430680e+01 7.7197335845105206e+00 2.6196582206987429e+01 0 0 0 +1461 2 3.7987848336558844e-01 2.4270378568134412e+01 8.9804879511398408e+00 2.6871767299035508e+01 0 1 -1 +1460 2 4.1084175724619054e-01 2.4805603355334107e+01 8.4977119717592196e+00 2.5504322743398028e+01 0 1 -1 +1355 2 3.4231126247334248e-01 2.3242726330565116e+01 1.3762550164577764e+01 2.6881000678053365e+01 0 0 -1 +1354 1 -7.4744912752367210e-01 2.2612918195537944e+01 1.4476063968319004e+01 2.6985247795495919e+01 0 0 -1 +1201 1 -7.3438678231092258e-01 2.0526505684678551e+01 9.7863294327368511e+00 2.6871752271518481e+01 0 1 -1 +1833 2 3.5221933723432480e-01 1.9520488894503714e+01 1.4695159899882913e+01 2.8146904442089273e+01 0 0 0 +1832 2 3.5840937381944460e-01 2.0727904841758630e+01 1.4146571997584156e+01 2.7369774764842777e+01 0 0 0 +2556 2 3.7015980766861267e-01 2.0683038594399971e+01 1.1134619056060622e+01 2.5773062888891904e+01 0 0 0 +2718 2 3.7227306718111819e-01 2.4028020235307523e+01 1.2991715491341429e+01 2.4525292676997790e+01 0 1 0 +1937 2 3.9163086699743588e-01 1.9867652757001487e+01 1.1566317364903790e+01 2.3543602668840418e+01 0 0 0 +2206 1 -7.4319344325428016e-01 2.1930675435890773e+01 7.3225352759222107e+00 2.6024055205952003e+01 0 0 0 +2743 1 -7.1454330024061097e-01 2.3732929529155555e+01 1.0421216441480366e+01 2.8057495220151395e+01 0 0 0 +2744 2 3.5522423066547987e-01 2.3002132804534881e+01 1.0738322689970936e+01 2.8655016353926133e+01 0 0 0 +2032 1 -7.1670809265970581e-01 2.1126484323243023e+01 1.1618053907314316e+01 2.9094188912910383e+01 0 0 0 +2033 2 3.7232309926473756e-01 2.0649257627967469e+01 1.2323094889572433e+01 2.8618072444528572e+01 0 0 0 +2034 2 3.6058725589811036e-01 2.0936902186625044e+01 1.0893590056556416e+01 2.8474466449709357e+01 0 0 0 +370 1 -7.7486139711504487e-01 2.0772648527146977e+01 7.5909672370584884e+00 3.0118583147604571e+01 0 0 -1 +1324 1 -7.4575661471423416e-01 2.3502376638532120e+01 7.5262522508895060e+00 2.9415435351328117e+01 0 0 -1 +1325 2 3.5496586285518006e-01 2.3679337842730096e+01 8.2512296835829471e+00 2.8748497387054208e+01 0 0 -1 +668 2 3.9019269915085431e-01 3.0178195645804333e+01 4.8795282230790766e+00 1.5729127343218364e+01 0 0 0 +1356 2 3.4291885561066721e-01 2.2454776700784222e+01 1.4767791491579834e+01 2.6043658073713843e+01 0 0 -1 +1518 2 3.7297762471075507e-01 1.1827838269216288e+01 3.9958652087929397e-01 1.8592675856644892e+01 0 0 0 +805 1 -7.0222538880556751e-01 1.0121294060846285e+01 1.5336738420335568e+01 2.6735778368045619e+01 0 0 -1 +2054 2 3.7990930902103182e-01 2.5187909137143663e+01 7.7732309370045662e+00 2.3255653954477527e+01 0 0 0 +2397 2 3.6284896121242138e-01 2.9287473241487039e+01 1.2656625252638880e+01 2.6335525234599711e+01 -1 0 0 +2383 1 -7.7168804571121441e-01 2.9782473536317386e+01 9.1866963866927751e+00 2.3601641485033145e+01 -1 1 0 +2214 2 3.8436421972059215e-01 2.7476598450427190e+01 1.4493391223539671e+01 2.9896758921674625e+01 0 -1 0 +439 1 -7.3582490133829759e-01 2.7786009948387601e+01 1.1274913579352024e+01 2.6687825761059038e+01 0 0 -1 +2343 2 3.4907141645629958e-01 1.0064014998135919e-01 7.7754273915464154e+00 2.4326714624655818e+01 0 1 0 +440 2 3.7856671999853420e-01 2.7496780585523805e+01 1.0388428574885440e+01 2.7144276799038430e+01 0 0 -1 +211 1 -6.9206319141369588e-01 9.8551753558672086e+00 2.2881315888689069e+00 3.0620859466811371e+01 0 0 -1 +2745 2 3.7111900686371230e-01 2.4140008737882518e+01 1.1195112566037064e+01 2.7685767597761451e+01 0 0 0 +1517 2 3.5027749431956678e-01 1.2241154057467007e+01 5.4251939566346601e-02 1.7194415153076616e+01 0 0 0 +2266 1 -7.4837978412387107e-01 2.5666959854110619e+01 1.2764591897885040e+01 2.7289567559533129e+01 -1 0 0 +1231 1 -7.3512264787799930e-01 2.9224034939070627e+01 1.0032025404300111e+01 2.9819780031551147e+01 0 0 -1 +2364 2 3.7600045855482433e-01 3.8210510880160570e-01 1.4090075630453816e+01 2.5655632621486543e+01 0 0 0 +17 2 3.8404127316507997e-01 2.7814631527943114e+01 9.6136735024217916e+00 2.8908411182917405e+01 -1 0 -1 +441 2 3.6714781700274551e-01 2.7577606415934124e+01 1.1202264812631968e+01 2.5761554179009281e+01 0 0 -1 +1022 2 3.8051071504683176e-01 1.6979920708603281e+01 5.1095945580787729e+00 3.0567559173830919e+01 0 1 -1 +2899 1 -6.9839264007380397e-01 2.7047479511696213e+01 9.2972429530987988e+00 2.8330056852929889e+01 0 1 0 +1859 2 3.7662362325805243e-01 1.9790140790461642e+01 2.1025761371817378e-01 3.0018716010965100e+01 0 0 0 +2262 2 4.0773363764782983e-01 2.6457864585390475e+01 1.2222576178807852e+01 2.7284847068774752e+01 -1 0 0 +2395 1 -7.3262416296173027e-01 3.0281010264566000e+01 1.2678454819065420e+01 2.6308455438532384e+01 -1 0 0 +186 2 3.7105946236647086e-01 8.2641482539367761e-01 1.3813689264504916e+01 1.5989204090997502e+01 0 0 0 +2472 2 3.4740305439733304e-01 5.4596877340897256e+00 2.8511874469288285e+00 2.9914633676876164e+01 0 1 0 +801 2 3.9356148663602925e-01 2.4096965187295133e+01 4.3747877468416174e-01 2.4191366888096685e+01 -1 1 -1 +1406 2 3.5889338972649137e-01 2.5705908434356864e+01 1.1899739971576274e+01 1.5967572235992353e+01 0 1 0 +2776 1 -7.7032252786047339e-01 1.8546809640933855e+01 1.4709725997251729e+01 3.0780839661899606e+01 0 0 0 +984 2 3.7589816383438779e-01 1.5843834465814167e+01 2.1083921347527315e+00 3.0737484844494858e+01 0 1 -1 +549 2 3.8617949742343616e-01 2.6246523659256205e+01 1.5286360803191695e+01 2.0816859470888282e+01 0 0 0 +1409 2 3.5954437351334118e-01 2.6316954826345647e+01 8.3596162239170158e-01 1.6164716406264585e+01 0 1 0 +407 2 3.5737383026556502e-01 2.2283251894607368e+01 1.8988241314283669e-01 3.1037036210495021e+01 0 0 -1 +1436 2 3.8124932259699423e-01 3.0459601482399361e+01 8.1629619523180050e+00 1.5701157569868110e+01 0 0 0 +2315 2 3.7657760419023989e-01 1.0110963694832099e+01 5.5087374717922248e+00 1.5986441777362851e+01 0 1 0 +272 2 3.5697070015610638e-01 1.8870024361143980e+01 1.0270113656671143e+01 3.0934021587873112e+01 0 0 -1 +998 2 3.4041375882109109e-01 2.2529203339448873e+01 1.5424313822779025e+01 3.0948004844537024e+01 0 0 -1 +641 2 3.5967083873655054e-01 2.3950018178880701e+01 6.0083897031014279e+00 1.5646673375867737e+01 0 0 0 +2213 2 3.9905979850899792e-01 2.6919442322391607e+01 1.5391041971116845e+01 3.0992982197532420e+01 0 -1 0 +1307 2 3.4503419400871360e-01 2.8850456277268556e+01 1.2832572500657587e+01 3.1036208171232158e+01 0 1 -1 +1377 2 3.6145268451783769e-01 4.9813657775303808e+00 2.2320550475034722e+01 2.7099934555927128e+00 1 0 0 +853 1 -7.3520649994988041e-01 4.9170073315906828e+00 2.3257867726170538e+01 2.7834196547407686e+00 0 0 0 +855 2 3.3751920999950380e-01 4.0376106836924377e+00 2.3508728971170537e+01 2.3618171480494294e+00 0 0 0 +674 2 3.5579603600565934e-01 1.2556860214013086e+00 2.0526106150741324e+01 5.9429658258120099e+00 1 -1 0 +776 2 3.3687009472154289e-01 1.4706783248068886e+00 2.0558905786742393e+01 2.3812653251518192e+00 0 0 0 +673 1 -7.2362900272915021e-01 3.4837511994522152e-01 2.0906272801285638e+01 5.7322170314623753e+00 1 -1 0 +1372 1 -7.2271758732812852e-01 1.7912847373590091e+00 2.0853123244453275e+01 3.3024899636151592e+00 1 0 0 +1981 1 -6.9609525303561315e-01 4.6362217272477855e+00 2.1543939142993690e+01 5.9298228434220279e+00 1 -1 1 +1982 2 3.5423417005857399e-01 4.8233248494559646e+00 2.2400901876437732e+01 6.2940656316416410e+00 1 -1 1 +1983 2 3.3994529251158107e-01 4.4298911910204977e+00 2.1016966423129574e+01 6.7424697863375327e+00 1 -1 1 +675 2 3.7874381902779058e-01 2.8292422259293143e-01 2.1436800623913488e+01 6.5272433762437796e+00 1 -1 0 +1374 2 3.8437132747653374e-01 1.0324336606725366e+00 2.0806516582044765e+01 3.8319049933011691e+00 1 0 0 +757 1 -7.3616671509959819e-01 4.6874750191101455e+00 2.0354715515942466e+01 3.3835616648380520e+00 0 0 0 +646 1 -7.4144123425876218e-01 8.7025453204935133e-01 1.7154901642415687e+01 1.9943764351177937e+00 1 0 0 +159 2 3.8649674830675296e-01 4.9248439939546982e+00 1.8725331864425588e+01 2.6950179545756363e+00 0 0 0 +1829 2 3.5994180931204850e-01 6.9432792887059236e-01 1.8884142152934398e+01 1.1079080774231416e+00 0 0 1 +1638 2 3.8062230348106058e-01 4.9961027121403463e+00 2.0694425157453175e+01 4.2690737239142189e+00 0 0 1 +758 2 3.8396828309964637e-01 3.7331105958266262e+00 2.0398687796017889e+01 3.5267657453713932e+00 0 0 0 +2323 1 -7.6274852305224550e-01 2.3498026326552583e+00 2.3267361163564136e+01 1.5376879143867994e+00 0 0 1 +2325 2 3.4752431823370106e-01 2.3577192366623696e+00 2.2408261338078788e+01 1.8810826769061988e+00 0 0 1 +1828 1 -7.4848034676727737e-01 7.2509186761944100e-01 1.9820720269909170e+01 6.9635609507510898e-01 0 0 1 +647 2 3.7567515438289367e-01 7.7217212041441396e-01 1.6855307225520843e+01 1.0277670687743758e+00 1 0 0 +1063 1 -7.4972997294180699e-01 2.6155541595857885e+00 1.9652834438342506e+01 7.2351141013598470e+00 0 0 0 +648 2 3.9287251098806886e-01 1.5004423598965582e+00 1.6524111876337756e+01 2.4057361341437544e+00 1 0 0 +284 2 3.5571294393081432e-01 6.4723685388158412e+00 2.4046843767698931e+01 7.2967991662829155e+00 0 0 0 +1469 2 3.9157260047427511e-01 1.8261870932432822e+00 1.8105497356444744e+01 6.9670943039550810e+00 1 0 0 +1161 2 3.7109842714260582e-01 3.0372744217846197e+01 1.7310936015586805e+01 2.9052826757659362e+00 0 0 0 +61 1 -7.1915143019389238e-01 1.3363841992223695e+00 1.7256173542343735e+01 6.9219532237645982e+00 0 0 0 +629 2 3.6430377284430215e-01 2.7666966959922707e+01 1.6191976253238945e+01 1.1247802121718347e+01 0 0 0 +769 1 -7.2123717759963757e-01 3.0109812974123065e+00 1.5711230291228754e+01 2.9040336704797705e+00 0 0 0 +63 2 3.7142418395045473e-01 4.4983797778331253e-01 1.7472544962885404e+01 6.6776918650778168e+00 0 0 0 +1050 2 3.6714562210961105e-01 7.1388233943708697e+00 1.6112352566344853e+01 4.2313041986695437e+00 0 0 0 +771 2 3.7258146496478006e-01 3.7316712625305466e+00 1.6361190068378601e+01 3.0630773900297892e+00 0 0 0 +1563 2 4.1764023920004645e-01 5.6080931932543310e+00 1.7679970861929892e+01 9.2803632980923589e-01 0 0 1 +1376 2 3.6977779659685683e-01 5.7197066795083931e+00 2.3780967597645137e+01 1.2296966461755161e+00 1 0 0 +756 2 3.8410200377464593e-01 4.4558187871718351e+00 3.0902352253980968e+01 7.8893910456925500e+00 0 0 0 +1966 1 -7.0598282933888645e-01 5.3096400138651019e+00 1.6830081332719470e+01 7.3101300579635629e+00 0 0 1 +157 1 -7.1852766204986152e-01 4.9965924192637718e+00 1.7733210415195334e+01 2.5305017691771026e+00 0 0 0 +968 2 3.6864860655895504e-01 7.2260313769063620e+00 1.7160115849981331e+01 7.8612679593019088e+00 0 0 0 +978 2 3.4986502112660256e-01 7.9275384818267343e+00 1.7719364540471958e+01 4.9012074046812275e+00 0 0 0 +1395 2 3.8751010940669467e-01 8.2803290542441648e+00 2.2765814222040678e+01 6.8693729585362027e+00 1 1 0 +1393 1 -7.1667431449545782e-01 8.8268657696462469e+00 2.1900326918391897e+01 7.0214400681588991e+00 1 1 0 +710 2 3.8204186445849492e-01 1.0699059845911856e+01 1.7320806794375553e+01 1.1490876880746872e+00 1 0 0 +709 1 -7.5321336572864950e-01 1.0444807988191570e+01 1.7684165446842222e+01 1.9980504265104064e+00 1 0 0 +711 2 3.9573447825273195e-01 9.7634280482867908e+00 1.7198902060796360e+01 2.4525433116984074e+00 1 0 0 +914 2 3.6570555465416504e-01 9.4192667289396574e+00 2.1390780987711626e+01 4.3185523755436481e+00 0 0 0 +913 1 -7.1670755031685385e-01 8.7160834201292410e+00 2.0870860704238282e+01 3.9473108248769453e+00 0 0 0 +915 2 3.3325441535579370e-01 8.4587211579727430e+00 2.1483250627735611e+01 3.2518553923524829e+00 0 0 0 +1633 1 -7.2967170646070356e-01 8.0249309258073449e+00 1.7710066368264414e+01 8.0415827931283541e+00 0 0 1 +1634 2 3.6922227284171938e-01 8.3880104158869067e+00 1.7952667106814701e+01 7.2003370000277949e+00 0 0 1 +158 2 3.6212477811519911e-01 5.5624038279547827e+00 1.7342266159888847e+01 3.3244638776128386e+00 0 0 0 +255 2 3.9945035103287385e-01 8.3726833799828295e+00 1.9159780066566611e+01 4.6380088784972724e+00 0 0 0 +253 1 -7.3064485694220160e-01 8.4636628127450440e+00 1.8432518368979274e+01 5.2534317602531377e+00 0 0 0 +300 2 3.9278983387251859e-01 1.2211583075443677e+01 1.8308153178609142e+01 2.8481793951727798e+00 0 -1 0 +299 2 3.7112922158200323e-01 1.2390232669788634e+01 1.9683585280398020e+01 3.4887153261137840e+00 0 -1 0 +466 1 -7.1422478660756383e-01 1.1616077541404199e+01 2.1282199185173962e+01 4.4329056239141291e+00 0 0 0 +298 1 -7.2626548321767859e-01 1.2832446032106636e+01 1.9025129120453343e+01 2.9586214158007391e+00 0 -1 0 +467 2 3.6203011900252402e-01 1.1865914035605504e+01 2.0712154076544468e+01 5.1898747520501836e+00 0 0 0 +376 1 -7.1708573736543113e-01 8.6796789707301993e+00 2.3041581569487683e+01 1.5959958738004092e+00 0 -1 0 +468 2 3.7447843004189912e-01 1.1441213216390041e+01 2.2134915574767909e+01 4.7981128824413162e+00 0 0 0 +825 2 3.4630967272985691e-01 2.1197232843194344e-01 2.8713454432196624e+01 1.5483466792302057e+01 0 0 0 +377 2 3.7212022234201986e-01 9.0373040176840576e+00 2.3708963367673398e+01 2.2690007717434857e+00 0 -1 0 +1000 1 -7.3075902181300656e-01 8.8241006118171370e+00 1.5980038269830017e+01 3.5121983696177663e+00 0 0 0 +232 1 -7.1935170015693795e-01 1.1367553560120852e+01 1.7516519173910190e+01 5.6761280474775750e+00 0 0 0 +233 2 3.4226764711242119e-01 1.1898861494789887e+01 1.8274103967755945e+01 5.8575518320184585e+00 0 0 0 +1827 2 3.6739977489158565e-01 9.2695819534435913e+00 1.8947109939364175e+01 1.2313570492272501e+00 0 0 1 +378 2 3.5953680091615808e-01 7.7504438216404017e+00 2.3309109273166122e+01 1.4701159156616048e+00 0 -1 0 +2156 2 3.5288614482338343e-01 1.4195606824246877e+01 1.5748332130239204e+01 1.9522680503923120e+00 0 0 1 +2155 1 -7.2784982031232393e-01 1.3309945026149416e+01 1.5663186859160566e+01 2.2458465690781058e+00 0 0 1 +1070 2 4.0242104758192254e-01 1.0006055434826775e+01 2.2517434463010623e+01 3.1681549946571791e-01 0 0 0 +326 2 3.5832493697816448e-01 1.1127549304803788e+01 1.6543194716164390e+01 7.6372198514959058e+00 0 0 0 +1375 1 -7.4927306637055235e-01 6.3028905287973434e+00 2.3818550343574532e+01 4.8334017342298796e-01 1 0 0 +234 2 3.7825226719218280e-01 1.0479958888869660e+01 1.7831446085302030e+01 5.5878089957823871e+00 0 0 0 +2036 2 3.5369298257878984e-01 1.8681615045565923e+01 2.5975415925228504e+01 1.4251153185668935e+01 0 0 1 +1018 1 -7.2439776916941612e-01 1.5892501420849426e+01 1.7492846658111773e+01 1.7508411496471137e+00 0 1 0 +1001 2 3.3909750762120677e-01 8.5641147014040602e+00 1.5626323085028652e+01 2.5934128640939740e+00 0 0 0 +1734 2 3.9457443469475756e-01 7.5708272703449246e+00 1.6166234064061459e+01 2.1036261985416574e-01 0 0 1 +2654 2 4.0551930439273709e-01 2.1430068337843018e+01 1.5666862495041043e+01 9.1464694810108362e+00 0 0 1 +2108 2 3.9155488189778465e-01 1.2193729622687782e+01 2.1354313648387450e+01 1.3470153925190623e-01 0 0 1 +264 2 3.6564111674887212e-01 1.7673966571112715e+01 1.7627586751788339e+01 2.2440087393477479e+00 0 0 0 +2602 1 -6.8614742265344086e-01 1.4432720337189108e+01 1.7444494884489686e+01 7.1784998360576218e+00 0 0 1 +2603 2 3.5698512136306798e-01 1.4709102782461828e+01 1.7568248262367678e+01 6.2459637273994781e+00 0 0 1 +1779 2 3.3985153746115848e-01 1.5687134238333501e+01 1.9215619068629838e+01 4.7656307265499152e+00 0 0 1 +1777 1 -7.4066667392284058e-01 1.5378966614260536e+01 1.8295687903210123e+01 4.5755077699244522e+00 0 0 1 +1778 2 3.4014268234240580e-01 1.4675150959373795e+01 1.8459946822448480e+01 3.9176536532953761e+00 0 0 1 +287 2 3.5039465808115899e-01 1.8113691747200303e+01 2.0060417150142214e+01 4.0336772632706479e+00 0 0 0 +2699 2 3.5658869902554957e-01 1.7045221706542904e+01 2.1243239634684162e+01 5.6504909865542352e+00 0 0 1 +263 2 3.6438294586849768e-01 1.8758382578204067e+01 1.6931341260971163e+01 3.1798251567598235e+00 0 0 0 +286 1 -7.6165748766751817e-01 1.7222009916791567e+01 2.0396474110331589e+01 4.0313883751197555e+00 0 0 0 +262 1 -7.2823142892947978e-01 1.8663339692989990e+01 1.7318436972944184e+01 2.2481973037115304e+00 0 0 0 +472 1 -7.2246774265653502e-01 1.4859840152567269e+01 2.1703317100897223e+01 2.2646897112240119e+00 0 -1 0 +288 2 3.6969993895661685e-01 1.7096807551701581e+01 2.0612969563678334e+01 3.1348586740129982e+00 0 0 0 +473 2 3.5534630248855253e-01 1.4119522026342489e+01 2.1624548652242922e+01 1.5907673026202556e+00 0 -1 0 +1054 1 -7.1438246754363388e-01 1.8000415380923481e+01 1.6590534036017306e+01 4.7929580919444321e+00 0 0 0 +1047 2 3.6859773747118585e-01 1.9450792925014401e+01 1.8689814418698880e+01 2.9105364289327329e+00 0 0 0 +1056 2 3.7972920279152972e-01 1.8068273313537087e+01 1.6118909737492015e+01 5.6538388426608721e+00 0 0 0 +1055 2 3.5434411621069151e-01 1.7149159665531318e+01 1.7071601037677752e+01 4.8690919800673997e+00 0 0 0 +1045 1 -7.0293424130799842e-01 2.0021137538127160e+01 1.9417567576000515e+01 3.2798849706518540e+00 0 0 0 +2107 1 -7.6803008473882806e-01 1.2894033700069791e+01 2.0780694317680165e+01 4.4461162369517926e-01 0 0 1 +2109 2 3.6841735157903299e-01 1.2660882750074881e+01 2.0419982003297214e+01 1.2868677436593952e+00 0 0 1 +2008 1 -7.1318891054517020e-01 1.9292810974277945e+01 1.9680409529617517e+01 7.3021180621858344e+00 0 0 1 +2010 2 3.5334322178545902e-01 1.9187070899602020e+01 2.0589178624453609e+01 7.4972637017281363e+00 0 0 1 +2009 2 3.5536776640230716e-01 1.9823854152400973e+01 1.9739432156923204e+01 6.5219768413870769e+00 0 0 1 +1020 2 3.3127327304395382e-01 1.5574217964576853e+01 1.8026514498970883e+01 2.5181160795807540e+00 0 1 0 +316 1 -7.4815326075891353e-01 1.9875574708927214e+01 2.2652294952884365e+01 6.9949471767612046e+00 0 -1 0 +2762 2 3.6473029481672714e-01 1.8011403601994317e+01 2.2227818382757981e+01 6.4517076410616871e+00 0 0 1 +2761 1 -7.2161175182531923e-01 1.7108541332627954e+01 2.1814193989420232e+01 6.4863221826620752e+00 0 0 1 +2604 2 3.6235838320129088e-01 1.5199163409273311e+01 1.7793512563824805e+01 7.6803759701187477e+00 0 0 1 +1173 2 3.8368206485428941e-01 1.2943958626291606e+01 1.6369286720717454e+01 5.0782558942964409e+00 0 0 0 +1082 2 3.5725621479485065e-01 9.7386332081614473e+00 2.5847739683697721e+01 3.0199412287553579e-01 0 0 0 +2426 2 3.9014084542948613e-01 2.5495827285938022e+00 1.9879954791275928e+01 9.1683484210780722e-02 0 0 1 +415 1 -7.4273174337580183e-01 1.7984642542152642e+01 1.5662715761200037e+01 7.4796355027689359e+00 0 0 0 +817 1 -7.1145364412181644e-01 4.2354448228157642e+00 3.0848445715791712e+01 3.3839673941147135e+00 0 0 0 +2916 2 3.6399216254522349e-01 2.8527549939068741e+01 2.2982156707672967e+01 1.5125922027046085e+01 0 0 0 +474 2 3.5946108003884264e-01 1.5585386092548063e+01 2.1297359866573657e+01 1.7853527206108262e+00 0 -1 0 +1442 2 3.6679915682077535e-01 2.7221890162594967e+01 3.0853919684972876e+01 6.1243939656359307e+00 0 -1 0 +1254 2 3.7116456490628669e-01 1.9903998895337349e+01 1.6863986572931733e+01 6.9883015347164001e-01 0 0 0 +2698 1 -7.7545314652810560e-01 2.0751473797956866e+01 1.6577546390906658e+01 3.8264404035562399e-01 0 0 1 +1046 2 3.3090073244898099e-01 2.0682372662886369e+01 1.8912763850781221e+01 3.8454542391287196e+00 0 0 0 +1264 1 -7.2501064617946076e-01 2.1225916960923009e+01 1.7535298367536335e+01 5.5677304474970235e+00 0 0 0 +1265 2 3.8861293293972260e-01 2.1581212645253736e+01 1.7378937365868804e+01 4.7279840652965044e+00 0 0 0 +1337 2 3.9398402977175517e-01 2.1618854942506662e+01 1.6992289865591182e+01 1.9134674148175284e+00 0 0 0 +1336 1 -7.4809738809572190e-01 2.2030322781316251e+01 1.7124505222988510e+01 2.7901659756519441e+00 0 0 0 +1338 2 3.5523440927157107e-01 2.2918824229141876e+01 1.6810185363119171e+01 2.8803359625463010e+00 0 0 0 +2973 2 3.5662738462216725e-01 1.9750967425155022e+01 2.2071027511600928e+01 1.3468505637329373e+00 0 0 1 +1181 2 3.8669363153730546e-01 2.0497904262864228e+01 2.0855345671695488e+01 2.0295683681128875e+00 0 0 0 +1444 1 -6.7983985437307159e-01 2.0660403082660956e+01 2.1694479298420354e+01 1.4981017531780987e+00 0 0 0 +1266 2 3.3490672568000618e-01 2.1205180224436369e+01 1.8487007364140478e+01 5.7101158472741185e+00 0 0 0 +1152 2 3.3518450908748509e-01 2.4607771167812295e+01 1.9098215836157074e+01 4.1644282019576258e+00 0 0 0 +2792 2 3.5645632223712637e-01 2.3811596018003996e+01 2.1772904285268641e+01 3.5193565043609900e+00 0 0 1 +1150 1 -7.3448599933983960e-01 2.4174942243319673e+01 1.8472201560677753e+01 4.8064359269327177e+00 0 0 0 +1151 2 3.6173027062307733e-01 2.4631029813175591e+01 1.8777135583269391e+01 5.6171733288673451e+00 0 0 0 +2239 1 -7.2632553814212819e-01 2.3535212426259740e+01 1.9391810674588768e+01 5.6148807017238223e-01 0 0 1 +2815 1 -7.5921315886160734e-01 1.7322369678780067e+01 2.1176214739859290e+01 9.9251420043365424e-01 0 0 1 +2793 2 3.6814816264716388e-01 2.2827068686348145e+01 2.2270420408963805e+01 4.6038852890958992e+00 0 0 1 +2791 1 -7.3411323787394145e-01 2.3661302057971419e+01 2.1797114259170954e+01 4.4620874578380727e+00 0 0 1 +2958 2 3.9869887384734931e-01 2.2037354955409469e+01 2.3029625186168452e+01 1.6343787412115072e+00 0 0 1 +1776 2 3.6598667331034290e-01 2.3796208094450865e+01 1.6731675507024480e+01 5.7878693083929980e+00 0 0 1 +1329 2 3.3682459528125397e-01 2.5163739092720778e+01 2.0039229827629349e+01 1.9971688019433658e+00 0 0 0 +2643 2 3.7039716155372293e-01 2.4005426832710164e+01 1.6883467101414865e+01 7.2585554753636066e+00 0 0 0 +2641 1 -6.9686577930997284e-01 2.3682191509139411e+01 1.6204045066788964e+01 6.5846470466215825e+00 0 0 0 +396 2 4.1276130184906729e-01 2.0710935025950135e+01 1.6315062407657329e+01 6.8768805697910933e+00 0 -1 0 +394 1 -7.4723122441974044e-01 2.0553974271751926e+01 1.5531023924465099e+01 7.4352891013540221e+00 0 -1 0 +1549 1 -7.4392899159898218e-01 2.1672389607847645e+01 2.0809118504881202e+01 6.3541899075774024e+00 -1 0 0 +1550 2 3.5945013029116596e-01 2.2542571367412574e+01 2.1013787675957762e+01 5.9220420381194936e+00 -1 0 0 +1551 2 4.1060863188637420e-01 2.1330489734613465e+01 2.1626659968350339e+01 6.6775362251154462e+00 -1 0 0 +187 1 -7.7813433155291212e-01 3.0629567383459374e+01 2.2349531182527997e+01 1.3106795010648782e+00 -1 0 1 +2956 1 -7.1975927288017838e-01 2.2969793790523482e+01 2.3274776937938221e+01 1.7329227562475202e+00 0 0 1 +2816 2 3.4857152547439851e-01 1.7938857836385989e+01 2.1887289565757339e+01 7.8913321311638884e-01 0 0 1 +1826 2 3.5131187006748366e-01 8.4871140865779715e+00 1.9845720950741924e+01 2.0876645559329297e+00 0 0 1 +1099 1 -6.9245925144271170e-01 9.3002347019241700e+00 2.9470099295486769e+01 9.4771488928205834e+00 0 0 0 +1968 2 3.5002912170804579e-01 5.4424501973759787e+00 1.6419735534746611e+01 6.4468743340494390e+00 0 0 1 +1101 2 3.8034542462663312e-01 8.6966209881750913e+00 2.8780268425854455e+01 9.8509552114970287e+00 0 0 0 +796 1 -7.6356758328059560e-01 3.0215616057761050e+01 1.8391562042156171e+01 5.5932390542907511e+00 -1 0 0 +785 2 3.7719159679540409e-01 3.0050279273838523e+01 1.7871046061179989e+01 4.7605021226753914e+00 -1 0 0 +798 2 3.8060827618580106e-01 3.0576128526967441e+01 1.9235076886677490e+01 5.3247599533504140e+00 -1 0 0 +1585 1 -7.5609350866441949e-01 2.5145848426927081e+01 1.6619583364866354e+01 3.2512741471091666e+00 -1 0 1 +1335 2 3.6406464562030649e-01 2.6924950711764712e+01 2.2237393389778372e+01 1.0603876694350756e-01 0 0 0 +1348 1 -7.0635988222156298e-01 2.5159386132018302e+01 2.0392735171655779e+01 6.6450934451745853e+00 0 0 0 +444 2 3.3828325895694944e-01 2.7152581004088272e+01 1.8070604250208053e+01 6.1986010373904472e+00 0 0 0 +1587 2 3.8717230332882896e-01 2.4667244445900156e+01 1.7358649022974628e+01 3.5902595082440349e+00 -1 0 1 +1958 2 3.4750670392093480e-01 2.5975965102195794e+01 2.1277684110578061e+01 2.4206277869909694e+00 0 0 1 +873 2 3.1868802911634969e-01 2.8633462779342647e+01 2.0517570475789476e+01 3.3335919208908167e+00 -1 0 0 +1159 1 -7.7572408792043468e-01 2.9455854341629912e+01 1.7414096877590630e+01 3.2748314182030911e+00 0 0 0 +1957 1 -7.4849215787623302e-01 2.5755082132922745e+01 2.0397617040553790e+01 2.6539947284113619e+00 0 0 1 +871 1 -7.2491846090039058e-01 2.9303288630042982e+01 2.0273558593566285e+01 2.6924407197774194e+00 -1 0 0 +872 2 3.5136777056847912e-01 2.8909917813692108e+01 2.0494952099178477e+01 1.8973854517534583e+00 -1 0 0 +725 2 3.3914469235875599e-01 2.9159598682642795e+01 1.8214232649007428e+01 2.8065079374735773e+00 0 0 0 +2574 2 3.4201563348160202e-01 1.4032700329541004e+01 2.8549289790869707e+01 2.1474732824375395e-01 0 0 1 +2647 1 -7.2024053252758780e-01 2.8538682072227818e+01 2.1743916327673524e+01 5.8701307170169423e+00 0 0 0 +2649 2 3.4358497053525161e-01 2.8045385974852564e+01 2.0981637591051292e+01 5.4298704226482748e+00 0 0 0 +665 2 3.5305853508755336e-01 2.6979306174346227e+01 1.9352140153524548e+01 3.9292242612989323e+00 0 -1 0 +664 1 -7.8841843197891370e-01 2.7339837485437041e+01 1.9393692225357313e+01 4.8217610350826288e+00 0 -1 0 +666 2 3.1811072911639759e-01 2.8041975216625044e+01 1.8715353160840547e+01 4.7705137308304275e+00 0 -1 0 +2648 2 3.6605147746802935e-01 2.9020127084912680e+01 2.1270468194655194e+01 6.5272024221862948e+00 0 0 0 +2237 2 3.7220065703801902e-01 2.7812236339658551e+01 2.3147771180011524e+01 2.5697292726629897e+00 0 0 1 +443 2 3.4321107080293883e-01 2.7504681470452226e+01 1.6587348560493052e+01 6.4303691298121546e+00 0 0 0 +2236 1 -7.4880377933505970e-01 2.7061391083183960e+01 2.2953538180791025e+01 1.9584560473446697e+00 0 0 1 +2238 2 3.7461551146678662e-01 2.6276593836533486e+01 2.3473135113858529e+01 2.2487234772842988e+00 0 0 1 +804 2 3.3695247389241156e-01 2.9142729113998104e+01 1.8888349146889784e+01 7.4401440261450098e+00 -1 0 0 +1350 2 3.2500553590188297e-01 2.6005415593871284e+01 2.0251910327118924e+01 6.1428755909562414e+00 0 0 0 +763 1 -7.2747918331602002e-01 2.7642890874322660e+01 1.6132854156133028e+01 1.5556380831984231e+00 -1 0 0 +446 2 3.5165162287066154e-01 2.4438707841526330e+01 2.4093521045468258e+01 3.2996980383076164e+00 0 0 0 +2972 2 3.5247552467731330e-01 2.8352596590607352e+01 1.7838706440295422e+01 6.0488676938640140e-01 0 0 1 +442 1 -7.5114971124189256e-01 2.6778107822442283e+01 1.7219671343742117e+01 6.4628477112242662e+00 0 0 0 +1349 2 3.6114445952234586e-01 2.4698492598411597e+01 2.0984318466605792e+01 6.0422378284532252e+00 0 0 0 +765 2 3.6208454850760396e-01 2.8398811893585471e+01 1.6402717004884696e+01 2.1133989973714336e+00 -1 0 0 +2971 1 -7.3196870955371129e-01 2.8231612660602035e+01 1.8735577785299540e+01 1.9526986467594393e-01 0 0 1 +1421 2 3.9576670460776053e-01 2.9843760768094970e+01 2.2642998135001282e+01 2.7809764274651592e+00 0 0 0 +2813 2 3.9045064072069613e-01 1.6818862999193140e+01 3.0636748373919648e+01 7.4078079950149327e+00 0 0 1 +2756 2 3.8522715794908158e-01 2.6726131045149369e+01 1.7606633943005193e+01 8.0233800141051237e+00 0 0 1 +2493 2 3.9213588031692331e-01 1.0169793168637511e+01 2.9342042721051328e+01 9.8527422093009402e+00 0 0 0 +879 2 3.2785034107277450e-01 2.3348181239792245e+00 2.3904096531269140e+01 2.3367199282102691e+00 0 0 0 +2840 2 3.4798658194914389e-01 4.9818343995013414e+00 2.3980847604744433e+01 8.8539376179718499e+00 1 0 0 +2839 1 -7.2406655632900985e-01 4.7987895158893972e+00 2.4245798731400420e+01 7.9210270429145648e+00 1 0 0 +2270 2 3.5180632221951880e-01 1.2487564152629931e+01 1.6776588591782190e+01 1.4364622660177345e+01 0 0 0 +588 2 3.6382858618720820e-01 1.2481492240218066e-01 2.5567804657932296e+01 5.8748362921325308e+00 1 -1 0 +586 1 -6.8760572962081024e-01 4.6575643504128111e-01 2.4676195316062618e+01 5.7331297077847241e+00 1 -1 0 +587 2 3.2122886990444466e-01 3.0791763299208480e+01 2.4128552393353107e+01 5.3121763358150123e+00 0 -1 0 +2601 2 3.5315584237641190e-01 4.1827610340272390e+00 2.7260559638215234e+01 1.8526553638829770e+00 0 0 1 +692 2 3.7362055851118586e-01 4.4139458218055143e+00 2.5083851016904752e+01 8.1330493377444135e+00 1 -1 0 +1508 2 3.9599296208801193e-01 9.8041773896469875e-01 3.0734807974689989e+01 6.1378302216299980e+00 0 -1 0 +644 2 3.6427481137337370e-01 3.9749017453391904e+00 2.7561951457261120e+01 5.5955676542483062e+00 1 0 0 +643 1 -7.3790222776002778e-01 3.0097151535489699e+00 2.7451438691890679e+01 5.6724899440070162e+00 1 0 0 +645 2 3.6022422275627614e-01 2.7461488108542951e+00 2.7356497435064306e+01 6.6245942559451088e+00 1 0 0 +2790 2 3.6811668594800584e-01 1.6692992236350936e+00 2.4930875235632854e+01 4.5043410701156485e+00 1 0 1 +755 2 3.8339690242043317e-01 3.2639043585156537e+00 2.9996356350344904e+01 7.4858828427149966e+00 0 0 0 +754 1 -6.4682773214593459e-01 3.8305525219460512e+00 3.0293721502029669e+01 8.2417777190370050e+00 0 0 0 +2416 1 -7.5357092565344552e-01 2.5812219145837716e+00 3.0205564775295734e+01 5.8572418349209361e+00 0 0 1 +2417 2 3.8341513321457343e-01 2.7699560100156813e+00 2.9233052460452900e+01 5.7902141164142336e+00 0 0 1 +2418 2 3.4445164203891443e-01 2.8562295425717061e+00 3.0679757101358874e+01 5.0015581499621131e+00 0 0 1 +2788 1 -7.0321027099045230e-01 2.3442477061084475e+00 2.5317247752129028e+01 3.8363861884046484e+00 1 0 1 +2789 2 3.7914725817921408e-01 2.7763855350319124e+00 2.6075294597664179e+01 4.3788785634425063e+00 1 0 1 +680 2 4.0283841723983022e-01 5.8203615544809295e-01 2.6764007370292994e+01 7.8694081214223246e+00 1 -1 0 +1509 2 3.8770948720614790e-01 2.0034500066489502e-02 3.0034440585611247e+01 7.1254400770143738e+00 0 -1 0 +1507 1 -7.5437694527071142e-01 3.7022571074369785e-02 3.0666165280521902e+01 6.3857002569780912e+00 0 -1 0 +1653 2 3.5883296888623417e-01 2.8474263742866501e+00 2.9495322724824696e+01 2.4680526617736120e+00 0 -1 1 +16 1 -7.2949093288191802e-01 2.5958855517257855e+00 2.8592930499102319e+01 2.2199622917335491e+00 0 -1 0 +108 2 3.6168532880153298e-01 2.4820354224226322e+00 2.4655039907155640e+01 4.3932622392821898e-03 0 -1 0 +2596 1 -7.3884773905394074e-01 5.6845506450879366e+00 2.8179861155318306e+01 5.6133334243432298e+00 0 0 1 +2598 2 3.6510608759941843e-01 6.2632055888284510e+00 2.8826680396986436e+01 5.1770222846244129e+00 0 0 1 +2917 1 -7.3092209538063713e-01 2.9999889001514347e+01 2.6751046624975530e+01 7.1138141231407346e+00 0 0 1 +2619 2 3.4575735632172039e-01 2.3651954241411102e+00 2.8667144260223125e+01 1.2163286206696953e+00 0 0 1 +2599 1 -7.5488422254164322e-01 4.8841104236752351e+00 2.6925542396030586e+01 1.2838580867329015e+00 0 0 1 +2979 2 3.4397986483063014e-01 8.1965699631026423e-01 2.5376454781663146e+01 2.5295589716767419e+00 1 0 1 +2977 1 -7.4518508058038901e-01 3.1035985845318130e+01 2.5570830792796205e+01 2.0267725385352917e+00 0 0 1 +2240 2 3.5078401128980990e-01 2.4308205531827095e+01 1.8898609856773312e+01 1.4167813111160538e-01 0 0 1 +1537 1 -7.3777883422486357e-01 2.8183611068164300e+01 2.8021526755735568e+01 1.4909216079243803e+01 -1 -1 0 +1078 1 -7.1161377304581475e-01 1.0603164880436095e+01 3.0287962315273230e+01 1.2742050479495079e+01 0 0 0 +2381 2 3.5399757106050078e-01 6.1067728487761750e+00 2.4781064959124869e+01 3.6336376148565597e+00 0 0 1 +283 1 -7.5672796575542789e-01 7.3340276396581530e+00 2.4120587328236045e+01 6.7334638335770185e+00 0 0 0 +2382 2 3.4011467000542039e-01 5.6781126010134022e+00 2.6154821192660336e+01 3.3820129454259331e+00 0 0 1 +285 2 3.4574003908113682e-01 6.9889042977657487e+00 2.4462488098381062e+01 5.8661198873599929e+00 0 0 0 +2380 1 -7.0966788174009432e-01 6.1891249826381323e+00 2.5677801265080234e+01 4.0114929462837150e+00 0 0 1 +866 2 3.7974762058817363e-01 1.1437161451323156e+01 2.3935483643544291e+01 6.4844741141495179e+00 0 0 0 +865 1 -7.5045270964496991e-01 1.1684542206206830e+01 2.4034220174916079e+01 5.6087450809481565e+00 0 0 0 +713 2 3.8100618498572247e-01 2.2784688436261732e+01 2.8067384693091206e+01 1.5168157765466054e+01 0 -1 0 +2651 2 3.7134754646185764e-01 1.0564932711540903e+01 2.4417224439023801e+01 3.9821442280327397e+00 0 0 0 +2497 1 -7.8008249791842177e-01 1.0146781899866344e+01 2.4716450193775763e+01 3.1827349450385665e+00 0 0 0 +2499 2 3.9519385266339480e-01 9.8251259176630352e+00 2.5593636191229397e+01 3.3708764163336000e+00 0 0 0 +947 2 3.9253924940428797e-01 1.0263825030224725e+01 2.7852683659544994e+01 4.0455615741418205e+00 0 0 0 +948 2 3.9725362218035121e-01 9.1515364235489809e+00 2.8305362413977200e+01 3.1159321237190047e+00 0 0 0 +946 1 -7.0669887383965291e-01 9.6698379933881409e+00 2.7491147131501222e+01 3.3837868622275784e+00 0 0 0 +2415 2 3.9085663853667518e-01 7.8214692137169388e+00 3.0262367492327279e+01 3.6417069179902399e+00 0 0 1 +2413 1 -7.3042635851030735e-01 7.8611977585993138e+00 2.9503130536524999e+01 3.0631082528549514e+00 0 0 1 +2414 2 3.6257527513306098e-01 7.5130039510401589e+00 2.9877260365777943e+01 2.2557876138095705e+00 0 0 1 +2597 2 3.4847208100918808e-01 5.9287756755990690e+00 2.7333902335473979e+01 5.1899307770680885e+00 0 0 1 +1595 2 3.6244592889370902e-01 1.2433936904412802e+01 2.1934965053416544e+01 1.4992406370894184e+01 0 0 0 +2271 2 4.0909570526419575e-01 1.3522451860086692e+01 1.6951634432715593e+01 1.5508375253755103e+01 0 0 0 +327 2 3.8759023730211123e-01 1.2050978705537872e+01 1.5573452653055504e+01 8.2784716132267206e+00 0 0 0 +35 2 3.4845842899276164e-01 1.1812588280128036e+01 2.9385188020711290e+01 2.5041572044769072e+00 0 -1 0 +46 1 -7.1593692545468413e-01 1.1232403277271668e+01 3.0168149651200153e+01 2.3303314562343735e+00 0 -1 0 +1059 2 3.6824864110585426e-01 1.1638504469448538e+01 2.5099123254431568e+01 2.0648781431552830e+00 0 0 0 +48 2 3.1878107605473444e-01 1.0347514158940282e+01 2.9690768110446829e+01 2.1037573159972309e+00 0 -1 0 +2306 2 3.6730774642582426e-01 1.1677638270183767e+01 2.7832135131347837e+01 5.4673888184085717e+00 0 0 0 +867 2 3.1370858253756073e-01 1.2192252410484890e+01 2.4874949039818269e+01 5.6579771234908787e+00 0 0 0 +1240 1 -7.5180796299280950e-01 1.2327087450360994e+01 2.6722712144246813e+01 7.0555309702582889e+00 0 0 0 +970 1 -7.3146600161462005e-01 1.1248152038688696e+01 2.8611069856538506e+01 5.1499323635329528e+00 0 0 0 +797 2 4.0297523845729272e-01 4.7530543081548977e+00 1.5871585490732055e+01 2.8057350832087859e-02 0 0 0 +2907 2 3.3000121827207451e-01 1.4254911479743537e+01 2.5045975715533139e+01 2.5261004334418780e-01 0 0 1 +1310 2 3.6912627891884631e-01 1.1435715601608260e+01 3.0051416679416132e+01 6.5685756635319086e+00 0 0 0 +194 2 3.4139849350075085e-01 7.1415094141566895e+00 3.0604232298233732e+01 1.2211017372962626e+01 0 -1 0 +2404 1 -7.2918970427923557e-01 7.7443173631668092e+00 2.6595939568484972e+01 3.4140147144317651e-01 0 0 1 +2241 2 3.9659912662053765e-01 2.2799435060564139e+01 1.9066923564805702e+01 6.9285759649524839e-02 0 0 1 +2024 2 3.2328026818693090e-01 1.2934503583841352e+01 3.0969340188993392e+01 1.0085149821386086e+00 0 -1 1 +2600 2 3.7262301809038745e-01 7.8437230034604051e+00 2.8625302519356289e+01 3.6919372515878351e-01 0 0 1 +2503 1 -7.2267250532881955e-01 8.1079081356276106e+00 2.9515055246603296e+01 2.2072243477987505e-01 0 0 1 +892 1 -7.5148672502679792e-01 2.0888208841338542e+01 3.0715669616108823e+01 5.4691140517319417e+00 -1 0 0 +2914 1 -7.6421926990744804e-01 2.9510703840073099e+01 2.3060877292649728e+01 1.5053406826873461e+01 0 0 0 +422 2 3.9557308470781993e-01 1.4958599980011073e+01 2.3266598884233236e+01 2.7100072576749090e+00 0 -1 0 +1440 2 3.3666172492882906e-01 1.5566427432003387e+01 2.3299397669057697e+01 5.7236708951045312e+00 0 0 0 +971 2 3.2567165474977544e-01 1.1929566312924079e+01 2.8923647751821658e+01 4.4487948302918046e+00 0 0 0 +1438 1 -7.6400355645773477e-01 1.4805332823009291e+01 2.3937420344020648e+01 5.6136468707181102e+00 0 0 0 +1439 2 3.3814215799380470e-01 1.3976209769692970e+01 2.3456528366304326e+01 5.7527473356036429e+00 0 0 0 +1165 1 -7.7180149244132290e-01 1.6892018185723501e+01 2.5179950685440588e+01 1.9553738940112357e+00 0 0 0 +2758 1 -7.2968332908530154e-01 1.3875326099665889e+01 3.0808333193614605e+01 7.2626576973725365e-01 0 0 1 +1057 1 -7.3718390505409592e-01 1.2453032324606104e+01 2.5482972853962679e+01 1.6979261521525946e+00 0 0 0 +1058 2 3.7170747392897024e-01 1.3154453168675921e+01 2.4886115881196488e+01 2.1278488278569094e+00 0 0 0 +361 1 -7.2020473249304684e-01 1.5111938052273384e+01 2.6545935198238293e+01 6.5288380534713806e+00 0 0 0 +363 2 3.7710795587665641e-01 1.4130307401196781e+01 2.6895766235910095e+01 6.7011746282590110e+00 0 0 0 +1787 2 3.6506550621193440e-01 1.6437016935767591e+01 2.8270823428873410e+01 7.1889962650727446e-01 0 0 0 +500 2 3.9563439978420145e-01 1.3139570395859357e+01 2.7125366038007243e+01 2.4405650434562336e+00 0 -1 0 +499 1 -7.4192491401160543e-01 1.3246382458096035e+01 2.7884269656775327e+01 2.9621932171635712e+00 0 -1 0 +1786 1 -7.2694685533705328e-01 1.6124079983728649e+01 2.7701169952745143e+01 1.4707548318084380e+00 0 0 0 +501 2 3.4901563025656368e-01 1.4186706205235831e+01 2.8044701640144048e+01 2.9716726018831583e+00 0 -1 0 +1788 2 3.7300324528589590e-01 1.6565487798225700e+01 2.6743546285094954e+01 1.4172319899393557e+00 0 0 0 +485 2 3.8917163444130082e-01 1.7133153268846343e+01 2.8432448855102731e+01 2.5828995953958405e+00 0 -1 0 +484 1 -7.2478139607319303e-01 1.7771011581849773e+01 2.9090312988370790e+01 3.0195170845673602e+00 0 -1 0 +719 2 3.5973544565603732e-01 1.3210824358055650e+01 2.9980253058615219e+01 6.8901163302489712e+00 0 -1 0 +1131 2 3.7398792739649861e-01 1.4972565243952641e+01 2.5615051745422370e+01 6.2364669835306543e+00 0 0 0 +1120 1 -7.6437393633003570e-01 1.7188136437858049e+01 2.7620586692659064e+01 5.2313564427111094e+00 0 0 0 +478 1 -7.7153794208645088e-01 1.4556112571796843e+01 2.4170731992946010e+01 2.8571853183454174e+00 0 -1 0 +480 2 3.7039279087856108e-01 1.4659375689306321e+01 2.4377802333564819e+01 3.8306330776186162e+00 0 -1 0 +1166 2 3.6818913917165530e-01 1.5988849046281164e+01 2.4719250714218951e+01 2.0730647480009945e+00 0 0 0 +718 1 -7.0007226663817013e-01 1.4033321826486652e+01 2.9451312566205477e+01 7.1128216935617550e+00 0 -1 0 +1167 2 3.7923338543484714e-01 1.7372547670804369e+01 2.5141492059876267e+01 2.8388481697703978e+00 0 0 0 +486 2 3.4851896327417431e-01 1.7840015927983163e+01 2.8729788861126512e+01 3.9900023789032013e+00 0 -1 0 +1122 2 3.9950948061246394e-01 1.6283452598076114e+01 2.7493752546370004e+01 5.6820739550444701e+00 0 0 0 +1004 2 3.6922321685265796e-01 1.8067819858332463e+01 2.6103514753011648e+01 4.7800600944944955e+00 0 0 0 +1241 2 3.8317209833142313e-01 1.2631762626548294e+01 2.6617459281135197e+01 7.9366488579655634e+00 0 0 0 +720 2 3.8883256719159187e-01 1.4886218006873349e+01 3.0052887370892567e+01 7.0252477601468382e+00 0 -1 0 +317 2 3.7660963558257304e-01 2.0474708064777836e+01 2.3357459428841722e+01 7.2036772262635322e+00 0 -1 0 +569 2 3.8783285696535674e-01 2.2455722248379106e+00 2.2066220204576794e+01 1.5370151484013425e+01 1 -1 0 +2269 1 -7.1752401459424253e-01 1.2711347438041340e+01 1.7352224147378934e+01 1.5155041314866999e+01 0 0 0 +1825 1 -6.9402006245137993e-01 8.4972674772146011e+00 1.9497033734637270e+01 1.1809872771074947e+00 0 0 1 +430 1 -6.5456537019421690e-01 2.0996612135100165e+01 2.3575278454644387e+01 4.4848104634520487e+00 0 -1 0 +479 2 3.5143149704121679e-01 2.0090941043366730e+01 2.3794803455930094e+01 4.1063801965498241e+00 0 -1 0 +452 2 3.7511039745343261e-01 1.8242038568261091e+01 2.4312676814993754e+01 1.2408014532412548e+00 0 0 0 +2335 1 -7.0663871699902170e-01 2.7803249955786349e+01 3.0841525302039685e+01 1.1576639981750375e+01 -1 0 1 +2215 1 -7.5759516482600286e-01 2.4044598058876268e+01 3.0499261364788985e+01 7.5098444224430383e-01 0 -1 1 +432 2 3.5321799230547979e-01 2.1099341991831480e+01 2.3978205976758272e+01 5.3721841612848751e+00 0 -1 0 +1121 2 3.6602716921762257e-01 1.7788562511675782e+01 2.7500115242099934e+01 5.9408997621475974e+00 0 0 0 +451 1 -7.7479114258616244e-01 1.8956195284318440e+01 2.3779380845961956e+01 8.1650275600510236e-01 0 0 0 +1005 2 3.7425010479579085e-01 1.9019115995034273e+01 2.5937547750436089e+01 3.5420941138403799e+00 0 0 0 +391 1 -7.1903343169706346e-01 2.0633741021534266e+01 2.9437036759946299e+01 2.7178639091630310e+00 0 -1 0 +393 2 3.5197438791556285e-01 2.1042308894894298e+01 2.9938298988577603e+01 3.4500547962865422e+00 0 -1 0 +1 1 -7.5275174968800906e-01 2.2274546567364681e+01 2.3971593227612047e+01 7.0297719550043682e+00 -1 -1 0 +593 2 3.6821692456138522e-01 2.2630094997345115e+01 2.7119253615506256e+01 5.8004682052621579e+00 0 -1 0 +594 2 3.4130618206757080e-01 2.1599167406847030e+01 2.6222489465669813e+01 4.9644171821037251e+00 0 -1 0 +592 1 -7.4558336044021079e-01 2.1854184757612302e+01 2.6584592873719430e+01 5.8904946484285450e+00 0 -1 0 +392 2 3.4369613413918820e-01 1.9697038968448663e+01 2.9724448606225398e+01 2.8358995172859380e+00 0 -1 0 +126 2 3.7422219785173821e-01 2.0285381681406673e+01 2.7775135400249162e+01 3.0427494983516028e+00 -1 -1 0 +124 1 -7.2809449525284942e-01 2.0423346277474227e+01 2.6777363351430647e+01 3.1271560553692686e+00 -1 -1 0 +1857 2 3.4776498394299105e-01 2.0266250559281630e+01 2.8889562568593252e+01 5.3890956197132767e-01 0 -1 1 +125 2 3.7886289804488649e-01 2.0661450519657514e+01 2.6403793270474445e+01 2.1939402385286337e+00 -1 -1 0 +1003 1 -7.3374260266434299e-01 1.8394082976062357e+01 2.5426417334217984e+01 4.1281055653717926e+00 0 0 0 +1358 2 3.5320920959414304e-01 2.0181884329293933e+01 2.7535391615396801e+01 6.0836395423973135e+00 0 0 0 +453 2 3.8464374378974286e-01 1.9753646988402490e+01 2.4321280695410977e+01 7.1526528408521084e-01 0 0 0 +2217 2 3.7007639929684993e-01 2.4513342179557473e+01 2.9827918774373099e+01 1.2963472561364868e+00 0 -1 1 +1170 2 3.7203639517515485e-01 2.4316477511954879e+01 2.6019812701370970e+01 2.5424985484790432e+00 0 0 0 +1190 2 3.6648816131771772e-01 2.3530990378337936e+01 2.5373947402039541e+01 1.4763190384323588e+00 0 0 0 +1168 1 -7.1726548443494753e-01 2.3669431004163265e+01 2.6222569850352421e+01 1.8849284222704075e+00 0 0 0 +774 2 3.5870976329075838e-01 2.4611646906770677e+01 2.8008246261675229e+01 2.2690190621100172e+00 -1 0 0 +772 1 -7.6998498468766385e-01 2.5231146016647635e+01 2.8697308125595963e+01 2.6048632096997633e+00 -1 0 0 +1357 1 -7.2474852232336362e-01 1.9542919602024099e+01 2.7539633386633540e+01 6.8697274120249769e+00 0 0 0 +574 1 -7.3565241237755274e-01 2.0874195857857323e+01 2.5872258837729937e+01 6.5644486888479714e-01 0 -1 0 +576 2 3.2214123564982566e-01 2.1856440541000719e+01 2.6118436770139766e+01 5.2721422664059880e-01 0 -1 0 +1561 1 -7.2442043641608134e-01 6.1478558005357398e+00 1.7351146160950446e+01 2.1199996540750790e-01 0 0 1 +2707 1 -7.4908870477242695e-01 2.3572987187960493e+01 3.0247951655633539e+01 4.2770187072569259e+00 0 0 1 +2709 2 3.7701416401847976e-01 2.4018228287972992e+01 3.0016839751672130e+01 3.4541154315762790e+00 0 0 1 +121 1 -7.2051113576138714e-01 2.4191625099975827e+01 3.0650915047544217e+01 7.4574712232716918e+00 -1 -1 0 +3 2 4.1577633930000224e-01 2.3105901992940503e+01 2.3975506485778499e+01 7.5010060338255879e+00 -1 -1 0 +571 1 -7.1341890243255535e-01 2.4930557565015704e+01 2.4176879224243887e+01 7.6865627972039157e+00 0 -1 0 +123 2 3.3569826248679580e-01 2.4039494944321241e+01 2.9712947151475923e+01 7.2580477181558241e+00 -1 -1 0 +2451 2 3.7901607775320451e-01 1.7260992719357549e+01 1.7280321903502422e+01 1.5507075495442072e+01 0 0 0 +36 2 3.2211910731470411e-01 2.8596288805862930e+01 2.8755568105638790e+01 1.2611351594675826e+00 -1 -1 0 +1420 1 -7.6839855138204449e-01 2.9369288731394516e+01 2.3152743013854376e+01 3.5229814268119322e+00 0 0 0 +1418 2 3.3332506312944232e-01 2.7799031631687289e+01 2.4206610139617137e+01 4.8937517743836914e+00 0 0 0 +1079 2 4.1202959723708116e-01 1.1017085812565135e+01 3.0958157562986710e+01 1.3435728670024270e+01 0 0 0 +77 2 4.1061427900959452e-01 1.0175736789658936e+00 2.8182432170832623e+01 2.6693340884161372e+00 0 0 0 +103 1 -7.5456901333818416e-01 2.9649161718599714e+01 2.7187899327989076e+01 1.7311454374726398e-01 -1 -1 0 +1422 2 3.7138709430363176e-01 2.9407740548480952e+01 2.2677894956409339e+01 4.3436692679758417e+00 0 0 0 +573 2 3.7154365941629924e-01 2.5535670144797308e+01 2.4038380722464264e+01 6.9828917470572112e+00 0 -1 0 +2439 2 3.6826283620290740e-01 2.4691029633893312e+01 2.7767950007339177e+01 7.2722458966768038e+00 -1 0 1 +2437 1 -7.3154265702444210e-01 2.4484744310442654e+01 2.7802548689359515e+01 6.3432053449949279e+00 -1 0 1 +2981 2 3.6511473696165159e-01 2.9588960281624633e+01 2.7115320512173195e+01 6.3101417465397853e+00 0 0 1 +76 1 -7.4446262168796229e-01 4.4347907502734367e-02 2.8083582667516676e+01 2.8106831640334979e+00 0 0 0 +1417 1 -7.0444574478905619e-01 2.7176785934000979e+01 2.4342046570308533e+01 5.6224049670235079e+00 0 0 0 +2955 2 3.7873227585346980e-01 2.5593963277319812e+01 2.4460708836016174e+01 4.2460155714017382e+00 0 0 1 +78 2 3.6862115269425916e-01 3.0742708187176721e+01 2.7191840167992034e+01 2.5352936045524888e+00 -1 0 0 +1419 2 3.5501644844363678e-01 2.7621550811901798e+01 2.3813714936953865e+01 6.3081552703764885e+00 0 0 0 +2332 1 -7.3611234651260138e-01 2.9578056580891140e+01 2.8697427284645038e+01 5.0539779490147163e+00 -1 0 1 +2334 2 4.0171294821696840e-01 3.0129444416058540e+01 2.9357390069091423e+01 5.3552591046352775e+00 -1 0 1 +2953 1 -7.7697637895686589e-01 2.5324831336060210e+01 2.4487390586951999e+01 3.3571062370488240e+00 0 0 1 +907 1 -7.2251028040591492e-01 2.7100203938797701e+01 2.6593106258267170e+01 2.4440379882400376e+00 -1 0 0 +909 2 3.3500662682571025e-01 2.7427278216403398e+01 2.6522956737287711e+01 1.5033342341908511e+00 -1 0 0 +908 2 3.7961236192047176e-01 2.6956469552165704e+01 2.5744703492226272e+01 2.6400960394064432e+00 -1 0 0 +2412 2 3.4623101210603358e-01 2.6029577309995265e+01 2.9171189633077898e+01 4.3079987642570918e+00 -1 0 1 +2411 2 3.5218645700129853e-01 2.7336288672869212e+01 2.8783519190678735e+01 5.0785014135684090e+00 -1 0 1 +2410 1 -7.6011493149154941e-01 2.6477880327746849e+01 2.9184653431160037e+01 5.2067375322384324e+00 -1 0 1 +2708 2 3.3181334848678523e-01 2.4164266597886574e+01 2.9822345617660844e+01 4.9099631442280707e+00 0 0 1 +773 2 3.7012580699728387e-01 2.6102804889668402e+01 2.8294793487265327e+01 2.4404325203689918e+00 -1 0 0 +60 2 3.6438661909224723e-01 2.9672415367119456e+01 2.8687242549486129e+01 4.0691075695933865e+00 -1 -1 0 +2438 2 3.6905390739666244e-01 2.5397596245482042e+01 2.8086722995784147e+01 5.9351200968678022e+00 -1 0 1 +1913 2 3.9777170499484688e-01 1.2445734247165840e+01 1.5994290894358539e+01 1.1900694900542913e+01 0 0 0 +105 2 3.8022186632645188e-01 3.0441932538363968e+01 2.6795585923877784e+01 5.8196599449822606e-01 -1 -1 0 +34 1 -6.9103165850333870e-01 2.9102913931594440e+01 2.9592407312246191e+01 1.5211275179373571e+00 -1 -1 0 +2918 2 3.6744823694418821e-01 2.9460198883696403e+01 2.7028527124131571e+01 7.8749192047765266e+00 0 0 1 +1655 2 3.7093515606989202e-01 2.9881610170356275e+01 2.9150987659245054e+01 1.8389359555123999e+00 -1 -1 1 +1064 2 3.3879951321891011e-01 2.5483525215636931e+00 2.0024626791342854e+01 8.1380248165505513e+00 0 0 0 +1065 2 3.6124126446920163e-01 3.4938963528843967e+00 1.9346220672408222e+01 7.2481726367541306e+00 0 0 0 +818 2 3.8826292627461073e-01 4.9533731605449649e+00 3.1001128832846643e+01 2.7089246988955824e+00 0 0 0 +781 1 -7.1053193243808477e-01 3.0918245522048736e+01 2.2210287096960165e+01 8.4999784213451690e+00 -1 0 0 +783 2 3.3829689662728679e-01 1.9347358200781137e-02 2.1413498559152941e+01 9.0284816532350796e+00 0 0 0 +897 2 3.9667986531971500e-01 3.0590078971226010e+01 1.6721897173546587e+01 1.1712801130585841e+01 -1 0 0 +896 2 3.9060271093257459e-01 7.1430249162270276e-01 1.7354038616218705e+01 1.0935784766862362e+01 0 0 0 +2978 2 3.3328822053012341e-01 3.0403075834293748e+01 2.5154780732356976e+01 2.5831932127906847e+00 0 0 1 +782 2 3.8068974490929453e-01 3.6850592315502234e-01 2.2868794731213487e+01 8.9895074290264496e+00 0 0 0 +2479 1 -7.4283161069088044e-01 4.9449624192179638e+00 2.0053044930582871e+01 8.7838756901349413e+00 0 0 0 +2480 2 3.8904952102009055e-01 4.6308351414032618e+00 2.0801035198761209e+01 9.3320441559769840e+00 0 0 0 +2481 2 3.9032107431036239e-01 5.0447721051635677e+00 1.9232398023379780e+01 9.3816456769200052e+00 0 0 0 +902 2 3.7392508857859746e-01 2.8598438701388549e+00 1.6635609298857183e+01 1.1753616607594813e+01 0 0 0 +903 2 3.8081156908654729e-01 2.3674417963906715e+00 1.8052996094063570e+01 1.2287970858182797e+01 0 0 0 +1570 1 -7.5893671651103367e-01 3.0218300902229167e+00 1.9308785499479292e+01 1.3536737357231672e+01 0 0 0 +1571 2 3.8388295512999776e-01 3.8972856227907071e+00 1.9678335988182738e+01 1.3330824242472874e+01 0 0 0 +1572 2 4.0340330515784095e-01 2.9148444381818490e+00 1.9257058322215780e+01 1.4503628319612218e+01 0 0 0 +170 2 3.8882921609954363e-01 2.9427592381579668e+00 2.1619466459223013e+01 1.1027876270810093e+01 0 0 0 +169 1 -7.7463134278409251e-01 3.8529636758273407e+00 2.1699173051760646e+01 1.0628485272851613e+01 0 0 0 +1484 2 4.0383560934081486e-01 4.2071330215285281e+00 2.2606910771010458e+01 1.0772474498839145e+01 1 0 0 +2308 1 -7.3569171940956501e-01 1.5017620852195062e+00 2.0831890139540402e+01 1.1782616700171493e+01 0 0 0 +2309 2 3.8366802113539478e-01 1.9342199150744828e+00 2.0244472854130983e+01 1.2485520341268021e+01 0 0 0 +2310 2 3.9498363709379281e-01 1.2958100040264249e+00 2.0300058783725483e+01 1.0983524237686135e+01 0 0 0 +917 2 3.7008761071742147e-01 4.8220292832352154e+00 2.0914860722736151e+01 1.1825020786045929e+01 0 0 0 +901 1 -7.1954901362842083e-01 2.4476472653585248e+00 1.7539212404128129e+01 1.1476237039039427e+01 0 0 0 +2653 1 -7.1407794147296166e-01 2.2223217817991088e+01 1.5600288137492777e+01 9.7129661428534746e+00 0 0 1 +1661 2 3.5806502752998431e-01 2.8723309707562222e-01 1.8518812070504179e+01 9.5105582699629085e+00 0 0 1 +2681 2 3.7408838542420436e-01 2.5692127879270789e+01 2.4050868588982262e+01 1.5209429065012028e+01 0 0 0 +895 1 -7.7254256646473796e-01 3.0916044323341680e+01 1.6865507987979797e+01 1.0832587972324836e+01 -1 0 0 +972 2 3.8958678083689607e-01 5.2845295544754913e+00 2.2041888025454103e+01 1.4164436092325849e+01 0 0 0 +916 1 -7.1849250243876217e-01 5.2917958307580353e+00 2.0765686248163561e+01 1.2715811801842168e+01 0 0 0 +41 2 3.4597041917537447e-01 4.5404653034810440e+00 1.7441943296259307e+01 1.0763676472309626e+01 0 0 0 +42 2 3.4625268632405820e-01 5.4911163946317982e+00 1.6955800727265036e+01 9.6416415245918454e+00 0 0 0 +40 1 -6.9298718920580493e-01 5.3586832037896297e+00 1.7668787968159918e+01 1.0272929656102887e+01 0 0 0 +918 2 3.7241349642923333e-01 6.2774434684204188e+00 2.0597766446606272e+01 1.2439943861592742e+01 0 0 0 +2817 2 3.6362109850572560e-01 1.7072551470060397e+01 2.0791821797317706e+01 1.9730653547291296e-01 0 0 1 +2473 1 -7.8376303661055080e-01 5.2329675428867226e+00 2.2926869569941765e+01 1.4508261223785039e+01 0 0 0 +1394 2 3.7561675712294307e-01 1.0066961393282048e+01 2.2137513267239317e+01 7.9241561763396282e+00 1 1 0 +182 2 3.7036336294443822e-01 2.9772454062655132e+01 2.7398338040325360e+01 1.2452158687330796e+01 -1 0 0 +1929 2 3.7304411352453759e-01 2.0571506036799700e+01 1.5843275251657795e+01 1.4902031573720491e+01 0 -1 0 +2735 2 4.0466389476064457e-01 1.3663928778675162e+01 1.7700859662394102e+01 1.1273600014757855e+01 0 0 0 +693 2 3.7355905365668080e-01 8.2924051047883438e+00 2.1211611421873101e+01 7.5605276769303620e+00 1 -1 0 +81 2 3.4643788751501525e-01 1.3437500808154157e+01 2.0858005523084625e+01 7.0855832710738369e+00 0 0 0 +79 1 -7.0472834330902390e-01 1.2891631836566249e+01 2.0075875296449333e+01 6.7214342140418841e+00 0 0 0 +1094 2 3.8663965999858252e-01 1.1538959925197428e+01 1.8805378150876944e+01 1.4242985681441615e+01 0 0 0 +2154 2 3.6420188231188699e-01 1.0521146231131416e+01 2.2524680111552552e+01 9.4763834191858258e+00 1 0 1 +1362 2 3.5824690391237357e-01 6.5921348900644317e+00 2.0394826958198973e+01 8.1492985187104168e+00 1 0 0 +1635 2 3.6460421980976943e-01 7.8791961372700694e+00 1.9437307217523852e+01 8.4551633696940574e+00 0 0 1 +691 1 -7.1634038175820036e-01 7.4457620197018342e+00 2.0340597100576886e+01 8.7188804807012357e+00 1 -1 0 +1091 2 3.5348108080554042e-01 9.2352024301846232e+00 2.3062119115273926e+01 1.0688071281129636e+01 0 0 0 +1093 1 -7.5610592836972312e-01 1.1176049494231272e+01 1.9369925143825022e+01 1.3526617279730933e+01 0 0 0 +1092 2 3.5698678780043508e-01 1.0428095081578661e+01 2.2355387862443486e+01 1.1390639381003277e+01 0 0 0 +1090 1 -7.4170775116856325e-01 9.7310897953903712e+00 2.2196116250200184e+01 1.0732220278777797e+01 0 0 0 +2297 2 3.7934871719845747e-01 1.0794042060809771e+01 2.1020294208138296e+01 1.3887529507469980e+01 0 0 0 +2488 1 -7.3192761463762990e-01 7.5729790375084214e+00 1.9966054609970051e+01 1.1495176640393668e+01 0 0 0 +2489 2 3.9010762880406841e-01 7.2457720749580972e+00 2.0103302581885902e+01 1.0563387900827802e+01 0 0 0 +2490 2 3.5552434097681462e-01 8.2903037248428042e+00 2.0628250272285275e+01 1.1486238901911690e+01 0 0 0 +177 2 3.8421024410092713e-01 7.6534694143330260e+00 1.7274206383348062e+01 1.3765775587804821e+01 0 0 0 +2355 2 3.5028584914948896e-01 1.1086995691185416e+01 2.2359508348038510e+01 1.3131526882750579e+01 0 0 0 +2344 1 -7.2028535602954824e-01 8.3422327917342951e+00 1.7749713127973955e+01 1.3166647643860570e+01 0 1 0 +2346 2 4.0082094308859451e-01 7.8805465917902895e+00 1.8433376952478259e+01 1.2752454210832761e+01 0 1 0 +1095 2 3.5064756010964881e-01 1.0277271754319097e+01 1.9081853876585306e+01 1.3359986510885417e+01 0 0 0 +2353 1 -7.7169283784575082e-01 1.0892211058050357e+01 2.2012390989266652e+01 1.3985946095630926e+01 0 0 0 +329 2 3.8245793311242204e-01 9.4294825512239715e+00 1.8375170009595195e+01 9.3862643340546743e+00 0 0 0 +328 1 -6.8284934097088801e-01 1.0364693584158644e+01 1.8694073610397169e+01 9.3369426823978721e+00 0 0 0 +266 2 3.3998906893874364e-01 1.0835107512327555e+01 1.7886338480507185e+01 9.0448861727927401e+00 0 0 0 +180 2 3.6629437370309237e-01 8.9191909014610218e+00 1.6278123394845156e+01 1.2171630277942121e+01 0 0 0 +1230 2 3.4897159507022230e-01 1.2651522049522319e+01 2.2828698079773773e+01 1.1426060156834017e+01 0 0 0 +1248 2 3.7127122779483096e-01 1.2019755864652671e+01 1.9177004225515454e+01 1.0239280429073586e+01 0 0 0 +1246 1 -7.5123810229363408e-01 1.2612701047009665e+01 1.9269563800417110e+01 1.1007569385750237e+01 0 0 0 +1247 2 3.8478602703622933e-01 1.2022865885117511e+01 1.9363862621856210e+01 1.1794799083569512e+01 0 0 0 +325 1 -7.2032755691587191e-01 1.1154565249619596e+01 1.5905196799573638e+01 8.3293449943930895e+00 0 0 0 +628 1 -7.5200533637137024e-01 2.8083405600877811e+01 1.5856571411951402e+01 1.0421546054314188e+01 0 0 0 +1228 1 -7.2454729889141289e-01 1.1852767672858807e+01 2.3488213193315296e+01 1.1719209222607425e+01 0 0 0 +80 2 3.2829440486445405e-01 1.3397101627017882e+01 1.9252574526373138e+01 6.9684973749010570e+00 0 0 0 +1763 2 3.5492558261878643e-01 1.5831304590054888e+01 2.0671522283692784e+01 1.4260462216041889e+01 0 0 0 +1762 1 -7.4836374636434422e-01 1.5674285106779241e+01 2.1536284625293433e+01 1.4858417154632580e+01 0 0 0 +365 2 3.5847440711504786e-01 1.5936511086240854e+01 1.8619360678049826e+01 1.4222218270812556e+01 0 0 0 +364 1 -7.0291574883952124e-01 1.5402952506808310e+01 1.9153946361765730e+01 1.3562568591795484e+01 0 0 0 +483 2 3.0717727600877298e-01 1.5558502772744433e+01 2.3032799019011815e+01 1.3268370468094734e+01 0 -1 0 +2774 2 3.5465290195660870e-01 1.8661662836362428e+01 1.6595386784445584e+01 1.1730397209133352e+01 0 0 0 +1865 2 3.7846677915290078e-01 1.3991602498196146e+01 2.2008668217447539e+01 9.6822988125197078e+00 0 0 0 +1864 1 -7.5619108736371377e-01 1.3832629170277741e+01 2.1805191047844094e+01 1.0672757659842960e+01 0 0 0 +366 2 3.3662957893240802e-01 1.5892497289862192e+01 1.9052851851296623e+01 1.2798893411830880e+01 0 0 0 +2045 2 3.6843327272201931e-01 1.7383148487775625e+01 1.6242664951766255e+01 1.2430622317259399e+01 0 0 0 +1866 2 3.6888569615343975e-01 1.3449574509359403e+01 2.0853571389735475e+01 1.0770810432268060e+01 0 0 0 +1048 1 -7.7850812089130550e-01 6.2519657267750040e+00 1.6287851365657861e+01 4.4681118342316779e+00 0 0 0 +2773 1 -7.0289866530104472e-01 1.7720694473769644e+01 1.6392192292685635e+01 1.1554923167460693e+01 0 0 0 +1293 2 3.5874739847185821e-01 1.7573841405063501e+01 1.8998560915984307e+01 7.8418420310689143e+00 0 0 0 +1775 2 3.7930886030505406e-01 1.7628951233281235e+01 2.1651091800331972e+01 9.6374044199956437e+00 0 0 1 +1291 1 -7.1733704230154260e-01 1.6939076932549632e+01 1.8312466969617159e+01 8.2419840513479539e+00 0 0 0 +1292 2 3.8068886773413796e-01 1.7323067967853635e+01 1.7484472713562187e+01 7.8964692417287292e+00 0 0 0 +2627 2 3.2744916934268492e-01 1.5961330693165227e+01 2.0714668578823805e+01 1.0632985837133541e+01 0 0 0 +2626 1 -7.2597635668302984e-01 1.6852985064361519e+01 2.0338225510179768e+01 1.0533847084845975e+01 0 0 0 +482 2 3.7732523695064918e-01 1.4789997302559515e+01 2.2756784640945057e+01 1.1880158544694746e+01 0 -1 0 +2064 2 3.4982189958829368e-01 1.5398745546105964e+01 2.1573632558705661e+01 7.4042228792037763e+00 0 0 1 +2636 2 3.6801504006444241e-01 1.9287424658031981e+01 1.8884583749552444e+01 1.2304592146246019e+01 0 0 0 +2635 1 -7.1930182243662977e-01 1.8721799978166800e+01 1.9031954580377946e+01 1.3056327433617250e+01 0 0 0 +2834 2 3.3904231354261710e-01 1.8011825502857707e+01 1.9571668908372096e+01 1.2729719668732258e+01 0 0 0 +2062 1 -7.5233856886005890e-01 1.4720889017106710e+01 2.2083751114041338e+01 7.9319879318777540e+00 0 0 1 +2628 2 3.6013062061877316e-01 1.6793504274382368e+01 1.9667082287731365e+01 9.8196129202630988e+00 0 0 0 +246 2 3.8223723397471004e-01 1.9677629648349928e+01 2.2659560861524234e+01 1.3470837764260315e+01 0 -1 0 +318 2 3.6460510894379844e-01 1.9391691935460369e+01 2.2632410876852376e+01 7.8743501717128872e+00 0 -1 0 +1774 1 -7.3808776636459816e-01 1.8388365856387527e+01 2.2257583029510826e+01 9.4106770166346898e+00 0 0 1 +481 1 -7.3686566666960396e-01 1.5392754018076330e+01 2.3401506948523021e+01 1.2326685474492542e+01 0 -1 0 +2690 2 3.8077933113803375e-01 1.7118700699729459e+01 2.3755057829849676e+01 1.2108509925928093e+01 0 0 0 +2571 2 3.4705504739017007e-01 1.6659729929720985e+01 2.3120707191088925e+01 1.4711938719177578e+01 0 0 0 +2345 2 3.3408049698686781e-01 1.7951003949121066e+01 1.8490666724892229e+01 1.4971765217918959e+01 0 1 0 +1458 2 3.3546848630018994e-01 2.0688532644434744e+01 1.9796632568193832e+01 1.4429771487945500e+01 0 0 0 +274 1 -7.3567961464394083e-01 2.5123966332927758e+01 2.0330798567902363e+01 1.4445848293135958e+01 0 0 0 +2930 2 3.5568366779223870e-01 3.4285721790098439e-01 2.2938730406175065e+01 1.4631219344744295e+00 1 0 1 +1456 1 -6.9123898505827908e-01 2.1672533974329593e+01 1.9919714078324510e+01 1.4400695086354490e+01 0 0 0 +528 2 3.7194736345747315e-01 1.7530553520903077e+01 3.0545144868361422e+01 3.9729845031758839e+00 0 -1 0 +1244 2 3.7478692617993181e-01 2.0273458814267748e+01 1.7990155238290292e+01 1.1160300170329492e+01 0 0 0 +181 1 -7.4730568145306686e-01 2.9430578371317857e+01 2.6588779748915744e+01 1.1961461469247768e+01 -1 0 0 +1243 1 -7.3174734640122197e-01 2.0737337468379774e+01 1.7170816955908140e+01 1.1396599161137804e+01 0 0 0 +282 2 3.8360281622256703e-01 2.1021092367318527e+01 1.9731840779446717e+01 1.0351425630162543e+01 0 0 0 +1245 2 3.9155171097875230e-01 2.1419365418185183e+01 1.7423445127614535e+01 1.2048261554259843e+01 0 0 0 +280 1 -7.6743092679418234e-01 2.0178810112504355e+01 1.9743231124767004e+01 1.0680718568691095e+01 0 0 0 +281 2 3.5842289632887275e-01 1.9688873997523658e+01 2.0308117129783962e+01 1.0090800136651925e+01 0 0 0 +2957 2 3.4592950163766484e-01 2.3289160873739561e+01 2.2883794480643740e+01 9.3265178419923145e-01 0 0 1 +2655 2 3.7064092809625354e-01 2.2037209951736987e+01 1.6169541421012749e+01 1.0582799613228202e+01 0 0 1 +1276 1 -7.5469087222565279e-01 2.3008391762653400e+01 1.7326918310159513e+01 1.2818953611288835e+01 0 0 0 +1278 2 3.3681277895958806e-01 2.2801442616324763e+01 1.7137023953533227e+01 1.3770873088966352e+01 0 0 0 +1277 2 3.6340304975251581e-01 2.3505779351600385e+01 1.8086758659667957e+01 1.2957714615811325e+01 0 0 0 +1289 2 3.6533091991039757e-01 2.2848764884322208e+01 1.9894275044266344e+01 1.2794661809258885e+01 0 0 0 +1288 1 -7.1011042439796679e-01 2.3688861487805319e+01 2.0061435833718654e+01 1.2304173525710651e+01 0 0 0 +1290 2 3.8098515036334835e-01 2.4092879824807778e+01 2.0702079761935977e+01 1.2991360251216689e+01 0 0 0 +764 2 3.7022355281977826e-01 2.6872310051988801e+01 1.6115154023736682e+01 2.1725137676795652e+00 -1 0 0 +512 2 3.8412380436018584e-01 2.4267644800078443e+01 1.5986899549558521e+01 1.2225108267747364e+01 0 0 0 +1914 2 3.8847786056277950e-01 1.0897688610698163e+01 1.5810805535212650e+01 1.2033235321975353e+01 0 0 0 +244 1 -6.9521786709554856e-01 1.9544052489598037e+01 2.2348710749988040e+01 1.4370548852622965e+01 0 -1 0 +2742 2 3.6084303049161259e-01 2.0251362377557456e+01 2.1852148622208741e+01 1.1439894558044323e+01 0 0 1 +2633 2 3.9933252227664767e-01 2.3440361873456663e+01 1.6723943395913373e+01 9.3598720620014166e+00 0 0 0 +2632 1 -7.3915576872259658e-01 2.4038034342201431e+01 1.7447894673381377e+01 9.0492303629412252e+00 0 0 0 +1179 2 3.9660368888882308e-01 2.1852866160514409e+01 1.9522164809799822e+01 7.7530687749261791e+00 0 0 0 +2781 2 4.1030647399571779e-01 2.2890591164047450e+01 1.8612554158838794e+01 8.5930560897962547e+00 0 0 1 +2779 1 -7.2727859115035309e-01 2.2073751557777175e+01 1.9198543875935329e+01 8.6298631073995491e+00 0 0 1 +1434 2 3.9851599447773650e-01 2.3506887394850455e+01 2.1020272739838518e+01 1.0948284240640614e+01 0 0 0 +2741 2 3.3678527741236330e-01 2.0181249639319986e+01 2.3318724259645538e+01 1.1561525817332308e+01 0 0 1 +2740 1 -7.4866476455259201e-01 2.0600744267511196e+01 2.2554120619800575e+01 1.1914395065903795e+01 0 0 1 +1433 2 3.8322665744508810e-01 2.2869176642482675e+01 2.0539493450712051e+01 9.5226028653044441e+00 0 0 0 +1432 1 -6.6847296558310765e-01 2.3298033615914775e+01 2.1312867632419710e+01 9.9907725484808871e+00 0 0 0 +1205 2 3.8377984232055873e-01 2.3499690111339021e+01 2.3320835146967340e+01 1.0111167479857757e+01 0 0 0 +1137 2 3.6770268558152153e-01 1.8353088651016321e+01 2.2953721785978278e+01 1.0058670775751686e+01 0 0 0 +1453 1 -7.5145082130426499e-01 2.6789096505217518e+01 2.2430587692014818e+01 1.5442910304471745e+01 0 0 0 +2637 2 3.9311219977788153e-01 2.4741204898595598e+01 1.9647113231003271e+01 1.5113791566614278e+01 0 0 0 +1468 1 -7.2068342123639539e-01 2.8966434349854417e+01 1.9154201968148524e+01 1.4979358376186727e+01 0 0 0 +861 2 4.0651075317900559e-01 2.5806411494840208e-02 2.1270450064237135e+01 1.2783883048745254e+01 0 0 0 +608 2 3.6675238729668996e-01 2.7850178787626216e+01 1.9136371441949084e+01 1.3803217393134240e+01 0 0 0 +630 2 3.6309080307885683e-01 2.9028125951237563e+01 1.6058989394956633e+01 1.0415260748932875e+01 0 0 0 +1660 1 -7.5442722379400595e-01 4.0135881704838167e-01 1.9431027012911230e+01 9.7173969865152667e+00 0 0 1 +1662 2 3.5618623031647290e-01 3.0574287542183043e+01 1.9722017819454177e+01 9.4855283779133952e+00 -1 0 1 +859 1 -7.5023654268626561e-01 3.0254978323648722e+01 2.1079628652697938e+01 1.3298100381778786e+01 -1 0 0 +275 2 3.8390079721216863e-01 2.5787637441177402e+01 1.9840094727727273e+01 1.3938347969523656e+01 0 0 0 +786 2 3.6027909744608505e-01 2.8148054126738025e+01 1.8753102315176864e+01 8.6193906780994549e+00 -1 0 0 +784 1 -7.2302511553283211e-01 2.8903658671929485e+01 1.9389477793691043e+01 8.2089807192514126e+00 -1 0 0 +195 2 3.8191353315325044e-01 8.7113363255162319e+00 3.0846212294261775e+01 1.2596785873973463e+01 0 -1 0 +953 2 3.6027044517098017e-01 1.5817598124148383e+01 1.5714005722017710e+01 5.6174108869596939e-01 0 0 0 +1189 1 -7.1544367291068811e-01 2.6921682084028351e+01 1.7789488102408793e+01 8.9711005428389168e+00 0 0 0 +1733 2 3.6895704063676416e-01 9.1963439014940320e+00 1.5831193077288665e+01 2.3916686679337407e-01 0 0 1 +2847 2 3.9835923189317363e-01 2.7640457545297767e+01 2.0910592306274317e+01 8.6418918519677383e+00 0 0 1 +547 1 -7.2312140353185683e-01 2.7105741343730866e+01 1.9177755757790784e+01 1.3031043664579730e+01 0 0 0 +548 2 3.9742500055695790e-01 2.7304498342915164e+01 2.0033877462850207e+01 1.2530677573972113e+01 0 0 0 +1191 2 3.4840538967143153e-01 2.7451330835753257e+01 1.6933755771103396e+01 9.3414820357359876e+00 0 0 0 +708 2 3.6488594194418511e-01 2.7070039735781386e+01 1.7310121484343870e+01 1.3122638800061480e+01 0 0 0 +2719 1 -7.2966322172293274e-01 2.7107813178606079e+01 1.6311703555282133e+01 1.3207549150690276e+01 0 1 0 +449 2 3.5261750338568154e-01 2.5724691297489919e+01 1.5563016208233936e+01 1.2037111339031529e+01 0 0 0 +2845 1 -6.8769288041857168e-01 2.7025491040190250e+01 2.1592881727130667e+01 8.4990628473396512e+00 0 0 1 +2846 2 3.8038735579488880e-01 2.6433602461348386e+01 2.1354419784401358e+01 7.7688668323159575e+00 0 0 1 +1743 2 3.7765073139456967e-01 7.2356872641078835e+00 1.6060498379255343e+01 1.5391384239203663e+01 0 0 0 +535 1 -6.9351140030448077e-01 3.0284127290741271e+01 1.6230269670986370e+01 1.3573916799934615e+01 0 0 0 +536 2 3.7314818964639873e-01 2.9901479008657134e+01 1.6352230165212294e+01 1.4441972570683136e+01 0 0 0 +660 2 3.7179064244987614e-01 2.8865788050204245e+01 2.1362944491574712e+01 1.2154042996054416e+01 0 0 0 +659 2 4.0432105193771761e-01 2.7791523949705152e+01 2.2456870164268040e+01 1.1704153621669375e+01 0 0 0 +658 1 -6.9223023092681224e-01 2.8012348343654654e+01 2.1448870618608790e+01 1.1715364926751253e+01 0 0 0 +2721 2 3.6108356320386598e-01 2.6732987384118097e+01 1.6118864937044048e+01 1.4054984522232740e+01 0 1 0 +2406 2 3.5759213084386299e-01 6.9917753744641971e+00 2.6618904346310060e+01 9.1981759563612431e-01 0 0 1 +2634 2 3.7251254928066418e-01 2.4933829306015355e+01 1.7281373873388898e+01 9.4288325992868725e+00 0 0 0 +852 2 3.6451835468165611e-01 2.7934010582606248e+01 2.3453446618877454e+01 9.1836728485920904e+00 -1 0 0 +851 2 3.6612875001996253e-01 2.9385911656431233e+01 2.3579932011057522e+01 8.9765043757203298e+00 -1 0 0 +850 1 -6.8714835947063957e-01 2.8609390307377367e+01 2.4166971249212075e+01 9.0063218834278285e+00 -1 0 0 +1465 1 -7.0697422021671075e-01 2.6814958960255879e+01 2.3821799842204708e+01 1.1510981608322417e+01 0 0 0 +1470 2 3.9396544034778719e-01 2.9607576814578849e+01 1.9739531833934805e+01 1.4554791256008762e+01 0 0 0 +860 2 3.9738405253143166e-01 3.0049415937613894e+01 2.1845685412330898e+01 1.3854917881241008e+01 -1 0 0 +1970 2 3.6631544657957621e-01 4.4801048982882392e+00 3.0384862741634578e+01 1.2457271286002571e+01 1 0 0 +679 1 -7.3884430294729031e-01 1.3884601581128519e+00 2.7307601184088483e+01 8.0433511615065196e+00 1 -1 0 +2138 2 3.6574522442457519e-01 6.9649678246169577e-01 2.4684228485841167e+01 1.3184934328737844e+01 1 0 0 +2137 1 -7.0704388954002095e-01 9.3231783484885575e-02 2.4368009481772123e+01 1.2452573721020419e+01 1 0 0 +741 2 3.7434885247858879e-01 2.7727092391315016e+00 2.6691716599280845e+01 8.7988528462250741e+00 1 0 0 +1445 2 3.8548131930074031e-01 2.2005697343618769e+00 2.4900957451708251e+01 1.0087717825901684e+01 1 0 0 +739 1 -7.5354058077878527e-01 3.3607101838340738e+00 2.6226518828141142e+01 9.4456856881618663e+00 1 0 0 +1689 2 3.5366450763106971e-01 4.6756331867403400e+00 2.7096660767504279e+01 8.6034060848582605e+00 0 0 1 +2664 2 3.6248914724789583e-01 3.6253351295021203e+00 2.3415664233892677e+01 1.4668228614684358e+01 0 0 0 +740 2 3.7813238114201547e-01 3.2460095888464986e+00 2.6699903299190165e+01 1.0368050223914613e+01 1 0 0 +1586 2 3.7914039895457374e-01 2.5740308199525472e+01 1.6185108114413278e+01 3.9510960135165032e+00 -1 0 1 +681 2 3.6443997307201897e-01 1.0555671798228803e+00 2.8004445704230264e+01 8.7094294737145947e+00 1 -1 0 +1360 1 -6.7480008408751069e-01 1.4882493780982777e+00 2.4269534685597151e+01 1.0097032697747219e+01 1 0 0 +2491 1 -7.4313586911541984e-01 3.7274056157859561e+00 2.7308610645775840e+01 1.1901978495234834e+01 0 0 0 +1010 2 3.5848162394431332e-01 4.3408557086198805e+00 2.8087849175057361e+01 1.1869491949944251e+01 0 0 0 +1969 1 -7.1861000860944768e-01 3.7762539101629833e+00 3.0949819758938002e+01 1.2762526107510293e+01 1 0 0 +1361 2 3.7604403072138470e-01 9.6890215047289319e-01 2.4434767575930834e+01 1.0987557222386553e+01 1 0 0 +2663 2 3.7514753484908803e-01 2.5655514490488831e+00 2.4484266788593096e+01 1.4091030504039944e+01 0 0 0 +2281 1 -7.2337854692324965e-01 8.3296510298333487e-02 2.9523357072742080e+01 9.0212914448415393e+00 0 0 0 +111 2 3.4865849155406547e-01 2.5712482674108879e+00 2.6740270841671524e+01 1.3652703216261845e+01 0 -1 0 +337 1 -7.3277063770123152e-01 5.2120488092907511e+00 2.3985492898151392e+01 1.0959719444651245e+01 0 -1 0 +338 2 3.4553558971079390e-01 6.2101215163811032e+00 2.4246202947588152e+01 1.0943827835801443e+01 0 -1 0 +339 2 3.3212807815336182e-01 4.9598037038503726e+00 2.4396189596964280e+01 1.1791023608398064e+01 0 -1 0 +2283 2 4.1823708180317992e-01 4.5748216314865070e-01 2.9633425011777803e+01 9.9150992687357231e+00 0 0 0 +2662 1 -7.4003655433427440e-01 2.6664637143622563e+00 2.3560630291725882e+01 1.4418375427170361e+01 0 0 0 +109 1 -7.5977382313663044e-01 1.9055882972700284e+00 2.6096448762336642e+01 1.4006135911992970e+01 0 -1 0 +110 2 3.5479215686412657e-01 1.3927653851935911e+00 2.6513347488364442e+01 1.4765745062724859e+01 0 -1 0 +2475 2 3.5741072622930053e-01 5.6307128342522352e+00 2.2855817075340919e+01 1.5361045007921270e+01 0 0 0 +2492 2 3.4668336412011003e-01 4.2340425669308424e+00 2.6694833106235713e+01 1.2413656554824133e+01 0 0 0 +2487 2 3.6683106593829695e-01 5.5441176634189455e+00 2.4617578699145994e+01 1.3662232150179799e+01 0 0 0 +2485 1 -7.3305340844882494e-01 5.7369451291585660e+00 2.5553291098444294e+01 1.3448761055350099e+01 0 0 0 +912 2 3.7863694181231811e-01 2.7893370743276495e+01 3.0413138803232307e+01 8.0702270047507252e+00 -1 0 0 +92 2 3.8132548215501233e-01 2.1190540495800669e+00 3.0302769407529631e+01 1.1789497509934840e+01 0 0 0 +91 1 -6.9177040178921889e-01 1.2569725004997006e+00 3.0103235284568061e+01 1.1455679813964528e+01 0 0 0 +575 2 3.3863973483648530e-01 2.0446333414633720e+01 2.6761208615750910e+01 4.0302338863605713e-01 0 -1 0 +1688 2 3.8521082307435872e-01 5.6336866786490143e+00 2.7608018581349981e+01 7.4137911714745517e+00 0 0 1 +2831 2 4.0120236849744478e-01 1.1541474163486269e+01 2.9359371686660065e+01 1.1752173950452967e+01 0 0 0 +2152 1 -7.2840395014258164e-01 1.0771233970095382e+01 2.2869455708534712e+01 8.4131440408646938e+00 1 0 1 +2153 2 3.4814834762962904e-01 1.0147816463516468e+01 2.3775620741313222e+01 8.3219357419077973e+00 1 0 1 +2037 2 3.8362085249896749e-01 1.9899847643284769e+01 2.5336370734770949e+01 1.4911183385682811e+01 0 0 1 +894 2 3.4374717299163865e-01 2.1779549416947212e+01 3.0425566677244884e+01 5.2775980603456469e+00 -1 0 0 +188 2 3.8115975079692371e-01 3.0992125779233263e+01 2.1477571266727409e+01 1.1216504440015862e+00 -1 0 1 +1687 1 -7.1719615304991724e-01 5.5991592764731992e+00 2.7338239278206903e+01 8.3617872748748301e+00 0 0 1 +1795 1 -7.6870820021542008e-01 5.9494360062101341e+00 2.8972972617046459e+01 1.2403016717369882e+01 0 -1 0 +1878 2 3.7636298385944633e-01 6.4934736890311697e+00 2.8466200272256263e+01 1.1743586516661779e+01 0 -1 0 +1242 2 3.4819153269248820e-01 1.1458703621783737e+01 2.6217662116156244e+01 7.0050228561939214e+00 0 0 0 +172 1 -7.1874989402726008e-01 9.8018782620938776e+00 2.5205555533011093e+01 7.6901266485896800e+00 0 0 0 +174 2 3.4596646801330511e-01 8.8205436118645792e+00 2.5004152451287883e+01 7.4015636926675379e+00 0 0 0 +173 2 3.0562091312378320e-01 9.5135997837157511e+00 2.5731573796909860e+01 8.5283624559504201e+00 0 0 0 +2289 2 3.4569195403219072e-01 8.3959156523212233e+00 2.4458657913821110e+01 1.2248577581774047e+01 0 0 0 +1874 2 3.4453520128448678e-01 1.1217599696795792e+01 2.5665299626114340e+01 1.4875566851880778e+01 0 0 0 +1875 2 3.0763144174779811e-01 1.1633158219400611e+01 2.6723684815386864e+01 1.3980132317917876e+01 0 0 0 +1873 1 -7.7644829978827168e-01 1.0870391602787791e+01 2.6164980504216064e+01 1.4163444117104003e+01 0 0 0 +2944 1 -7.8030950606872118e-01 2.5094625183601316e+01 2.4729624226333470e+01 1.4848347488443634e+01 0 0 0 +2287 1 -7.5971256236996898e-01 8.1613287892445463e+00 2.4424577554753924e+01 1.1296842670315336e+01 0 0 0 +1796 2 3.5652387618113229e-01 6.1658294090837220e+00 2.8629799499281052e+01 1.3291114191694442e+01 0 -1 0 +171 2 3.5455462731887888e-01 8.7845489577640645e+00 2.5037455967793871e+01 1.0824436580267422e+01 0 0 0 +2830 1 -7.4329954283332977e-01 1.1656641946018244e+01 2.8912746684218583e+01 1.0890491019252101e+01 0 0 0 +1274 2 3.3728908911554367e-01 1.0254271118106468e+01 2.6247367068049233e+01 1.1641460915073457e+01 0 0 0 +2457 2 3.1916350196148274e-01 7.4395176851492133e+00 2.6616304689440746e+01 1.0786739217533420e+01 0 0 0 +1017 2 3.4525292214042869e-01 9.9089982397385334e+00 2.7756063275864712e+01 1.4549603740398132e+01 0 0 0 +2455 1 -7.2212191390713598e-01 7.1761790177787246e+00 2.7529759230761492e+01 1.0450754065767292e+01 0 0 0 +2456 2 4.0167138987704837e-01 6.3966272305360334e+00 2.7358149110698143e+01 9.8423136660914370e+00 0 0 0 +1129 1 -7.4402689481222684e-01 9.8679871040149294e+00 2.6428557603968883e+01 1.0818379404068505e+01 0 0 0 +1130 2 3.4906253787067065e-01 1.0308848949186933e+01 2.7296657017511102e+01 1.0631858315759979e+01 0 0 0 +1108 1 -7.3509866285050496e-01 6.7819386709148510e+00 2.8350745869579519e+01 1.5157542166913336e+01 0 0 0 +2486 2 3.7124170033753284e-01 6.7668685306300000e+00 2.5639416955711489e+01 1.3452178874451207e+01 0 0 0 +1309 1 -7.7410997084759603e-01 1.1738301814259012e+01 3.0966864452431789e+01 6.6548083195092929e+00 0 0 0 +1080 2 3.5058274539291207e-01 1.0337418717062187e+01 2.9558191710750361e+01 1.3402523135697662e+01 0 0 0 +1275 2 3.6837993201431540e-01 9.0598754230804577e+00 2.5439639281251701e+01 1.4159497195899700e+01 0 0 0 +1273 1 -7.5103018929361298e-01 8.2221070722734506e+00 2.4989921683706754e+01 1.4234853006812012e+01 0 0 0 +545 2 3.7983422390290761e-01 8.3190199387179860e+00 2.4323247452721915e+01 1.4988061584299976e+01 0 0 0 +1015 1 -7.2625316751530800e-01 9.5679904653137164e+00 2.8632579762848515e+01 1.4747348448165372e+01 0 0 0 +1016 2 3.8358706448607893e-01 8.5947944756125754e+00 2.8552143838314887e+01 1.4740479930045707e+01 0 0 0 +2832 2 3.6833849269024443e-01 1.2588437322679425e+01 2.9053786834328644e+01 1.0683054358137804e+01 0 0 0 +227 2 3.8069043050140500e-01 6.7542390031189177e+00 3.0773260057919693e+01 9.1966885347387062e-01 0 -1 0 +2915 2 3.8551792146819380e-01 2.9656999864425053e+01 2.3973228441648722e+01 1.4866838077747847e+01 0 0 0 +2639 2 3.5382776357617346e-01 1.6007331995540330e+01 2.5236837403739859e+01 7.9389906345421988e+00 0 0 0 +1193 2 3.8051987740779625e-01 1.8522913699255128e+01 2.9847006931604518e+01 8.6640675735241128e+00 0 0 0 +1732 1 -7.4532839113724625e-01 8.2798027313755096e+00 1.5589978915163060e+01 6.0614107305412301e-01 0 0 1 +1538 2 3.2744579304075944e-01 2.8846945819764723e+01 2.8684559785946476e+01 1.4562564651170861e+01 -1 -1 0 +1073 2 3.5008751492266438e-01 1.3516348774983586e+01 2.7235119518117589e+01 1.5243551143419339e+01 0 0 0 +1227 2 3.8695006736496318e-01 1.6865139872453611e+01 2.5470963849060176e+01 1.4541920940672078e+01 0 0 0 +1226 2 3.7873760396994960e-01 1.5874096929113774e+01 2.6770712919022515e+01 1.4331108043844960e+01 0 0 0 +2063 2 3.8209526769738550e-01 1.4922461290486877e+01 2.3021166676742244e+01 7.9279146966643985e+00 0 0 1 +1172 2 3.5355614092858006e-01 1.2267462673473288e+01 2.4221920277934284e+01 1.2202751818008295e+01 0 0 0 +1317 2 3.6427128582856894e-01 1.7258174439809238e+01 2.8197828259110025e+01 1.4529929347731880e+01 0 0 0 +1315 1 -7.0673690633660369e-01 1.7467177185380216e+01 2.8996844434408963e+01 1.5032248418901911e+01 0 0 0 +1225 1 -7.3521269320585547e-01 1.6760428185466743e+01 2.6343852476671227e+01 1.4119017882511317e+01 0 0 0 +2307 2 4.1092433174476961e-01 1.3686499160217535e+01 2.6190888129513567e+01 1.0509522490312445e+01 0 0 0 +2305 1 -7.3363234297698821e-01 1.3801725526248331e+01 2.6425268615620343e+01 9.5587547222638403e+00 0 0 0 +1043 2 3.7488238002414792e-01 1.4224794825377835e+01 2.4795576440808638e+01 1.2407501077041029e+01 0 0 0 +1072 1 -7.5077515467102973e-01 1.4100174963763427e+01 2.7158099946067772e+01 1.4422332292510733e+01 0 0 0 +2354 2 3.7955646818807254e-01 1.4403336353317394e+01 2.5707977956498741e+01 9.0801816765774657e+00 0 0 0 +1042 1 -7.5574451851450375e-01 1.3722560202291875e+01 2.5625203017520530e+01 1.2160140075432530e+01 0 0 0 +2689 1 -7.5596613291204851e-01 1.8049130070871175e+01 2.4077677492745515e+01 1.1843914553786719e+01 0 0 0 +1044 2 3.8444265938506628e-01 1.3719370747684914e+01 2.6258494731729748e+01 1.2866591766800873e+01 0 0 0 +2638 1 -7.3946183648271491e-01 1.5838469627839384e+01 2.4793575644859470e+01 8.7445951541069427e+00 0 0 0 +2640 2 3.8000076377866066e-01 1.6482863244304806e+01 2.5165264274375453e+01 9.3536532814575395e+00 0 0 0 +402 2 3.5434434072595594e-01 1.6485829848811974e+01 2.9322011186864653e+01 1.1874800116819284e+01 0 -1 0 +2691 2 3.4324381271677640e-01 1.8497596222731573e+01 2.4288384210517094e+01 1.2685712673771203e+01 0 0 0 +456 2 4.0156213536723340e-01 1.4079078091068254e+01 2.9208691867340892e+01 8.7948409004611250e+00 0 0 0 +454 1 -7.4724607350644467e-01 1.4269704606927844e+01 2.9049367119220246e+01 9.7639277367604222e+00 0 0 0 +1157 2 3.9693621783976146e-01 1.4549899230700456e+01 3.0410698280629511e+01 1.2407421056395414e+01 0 0 0 +455 2 3.8938432504030729e-01 1.4306317791770821e+01 2.8082202413390142e+01 9.8257789927633485e+00 0 0 0 +1074 2 3.3688842220012999e-01 1.4007528479879568e+01 2.8062766023229749e+01 1.4005996237181597e+01 0 0 0 +1158 2 3.6991769068996366e-01 1.4328583456193895e+01 2.9097732895946045e+01 1.1522628580131078e+01 0 0 0 +1156 1 -7.3693579554483479e-01 1.4375724792677884e+01 2.9473555471827485e+01 1.2424077907767250e+01 0 0 0 +494 2 3.8074666430643545e-01 1.7744184738142668e+01 2.5702243032888457e+01 1.1254239154423740e+01 0 -1 0 +495 2 4.0180544917710997e-01 1.7684296342007571e+01 2.7320131652222550e+01 1.1035037616890445e+01 0 -1 0 +493 1 -7.2753012853380328e-01 1.7560127483372341e+01 2.6468309166629076e+01 1.0624576470576089e+01 0 -1 0 +400 1 -7.4414814174795618e-01 1.7364456511259320e+01 2.9156083069696830e+01 1.1409583424397898e+01 0 -1 0 +2526 2 3.8682226415933840e-01 1.7407891697735227e+01 2.9800800492857434e+01 1.0697719107152466e+01 0 0 1 +1192 1 -7.5146970683876402e-01 1.7676230764997566e+01 3.0276716962852685e+01 8.8718959354934217e+00 0 0 0 +1741 1 -7.3205757942065153e-01 6.5646294206871234e+00 1.6602793438545699e+01 1.4935295448350956e+01 0 0 0 +1019 2 3.7533566628932991e-01 1.5494448101255530e+01 1.7967393218913010e+01 9.6419364205948610e-01 0 1 0 +1457 2 3.3608578371234021e-01 2.1802152775354795e+01 1.9974146943511290e+01 1.5349502717791385e+01 0 0 0 +429 2 3.7369022834846510e-01 2.3737537351792326e+01 2.9042833884525809e+01 9.9993294061308617e+00 0 -1 0 +245 2 3.2729285075045900e-01 1.9299541545737657e+01 2.3204914995461841e+01 1.4823889772453104e+01 0 -1 0 +2945 2 3.8493052695990354e-01 2.4558820099153891e+01 2.4237362512852961e+01 1.4248491875091533e+01 0 0 0 +1110 2 3.2284115324006901e-01 5.9629587183467230e+00 2.7879547095184176e+01 1.5289372348273277e+01 0 0 0 +1946 2 3.4319387916119626e-01 2.6385533926690393e+01 2.6915266267265956e+01 1.2790122706965821e+01 0 0 0 +2035 1 -7.4850951670186616e-01 1.9522439391815791e+01 2.5501955878457565e+01 1.4044260114417856e+01 0 0 1 +2 2 3.7182616676479113e-01 2.2099257703414636e+01 2.4866968193163192e+01 6.7331328722075625e+00 -1 -1 0 +1486 1 -7.4570053510063972e-01 2.9970113727581392e+01 3.0166641069568584e+01 1.4964882298871128e+01 0 0 0 +2084 2 3.6571927225739886e-01 1.8926476090992040e+01 2.5747936370918769e+01 9.4622934725375138e+00 0 -1 0 +1885 1 -7.5905026705536827e-01 1.9492371208209629e+01 2.5436962842319616e+01 8.7592194762612987e+00 0 -1 0 +1886 2 3.9134367693637823e-01 1.9417671525079349e+01 2.6040516596834813e+01 8.0482391152251491e+00 0 -1 0 +2264 2 3.6876059672045897e-01 2.0127903249874674e+01 2.9294240185926455e+01 1.0162597224450533e+01 -1 0 0 +1359 2 3.5682764756711299e-01 2.0003498669298974e+01 2.8159304742168526e+01 7.4747609713330609e+00 0 0 0 +1014 2 3.4719095364891989e-01 2.2834738116041521e+01 2.7860297648398340e+01 7.6587750779259025e+00 0 0 0 +2736 2 3.4769891114122353e-01 1.3599245093020784e+01 1.6479025823656730e+01 1.0280685422969542e+01 0 0 0 +2263 1 -7.4090646041065489e-01 2.0305524809265258e+01 2.9319573919632511e+01 9.0448243895213505e+00 -1 0 0 +1012 1 -7.6915917651958687e-01 2.2686210632562460e+01 2.8150152827682845e+01 8.5602338989257909e+00 0 0 0 +2265 2 3.6087503388705217e-01 2.1257154507068531e+01 2.9033514336035918e+01 8.9465941849200608e+00 -1 0 0 +1013 2 3.6505715459970411e-01 2.2306724491447220e+01 2.7355122049564567e+01 9.0130000203875085e+00 0 0 0 +2954 2 3.7582232234417695e-01 2.1564640697541989e+01 2.6395567250149814e+01 1.0872246030938877e+01 0 0 1 +2755 1 -7.6148392492405548e-01 2.1799280755174109e+01 2.5846175036755039e+01 1.0063024342258730e+01 0 0 1 +1184 2 3.7014196369676028e-01 2.0509120429392205e+01 2.8869233821073585e+01 1.2145827657275872e+01 0 0 0 +2757 2 3.8709186019132275e-01 2.0979702888375712e+01 2.5586546353317935e+01 9.5932138541673204e+00 0 0 1 +1185 2 3.7230877560740350e-01 1.9055063706262271e+01 2.9462956218345347e+01 1.1831934015659300e+01 0 0 0 +2076 2 3.7915662099277253e-01 2.0567140417363138e+01 2.6485831293818670e+01 1.2865693203352905e+01 0 -1 0 +1183 1 -7.3721753404518597e-01 2.0050729408969488e+01 2.9641306532156555e+01 1.1671696178352919e+01 0 0 0 +2074 1 -7.7414661817605712e-01 2.1190928563446558e+01 2.7145357222097807e+01 1.2441861780772955e+01 0 -1 0 +2075 2 4.0285127557932976e-01 2.1963979517384846e+01 2.7248635801780097e+01 1.2960945200595175e+01 0 -1 0 +2882 2 3.4567728753195492e-01 2.3689262756956474e+01 2.6221608865749200e+01 1.3897438508303820e+01 0 0 0 +683 2 3.8850947898225768e-01 2.2287043656262462e+01 2.2710659639236084e+01 1.3159838603159599e+01 0 -1 0 +684 2 3.9098808257530643e-01 2.3339634958910594e+01 2.3402399945945756e+01 1.2344122318292756e+01 0 -1 0 +682 1 -6.9746337220353483e-01 2.3125296302024395e+01 2.3166784061331143e+01 1.3275389404967701e+01 0 -1 0 +2883 2 3.3405337731821316e-01 2.4594507691402203e+01 2.7413326810741978e+01 1.3573785439163032e+01 0 0 0 +2881 1 -7.4833507498208907e-01 2.3678702829374647e+01 2.7157308162026748e+01 1.3777877093008364e+01 0 0 0 +1206 2 4.0841236155139748e-01 2.3127446955732903e+01 2.4816037541215099e+01 1.0488707043851456e+01 0 0 0 +1204 1 -7.3831533211398614e-01 2.3666061908616861e+01 2.4028985318967081e+01 1.0766836745112006e+01 0 0 0 +572 2 3.5723901917161704e-01 2.5448062543971378e+01 2.4378839592437217e+01 8.4478213725293188e+00 0 -1 0 +427 1 -7.2658915359131349e-01 2.4338046472811751e+01 2.9165416708310708e+01 1.0751912586528359e+01 0 -1 0 +911 2 3.2269895416079913e-01 2.8199373540185583e+01 2.9038503386115810e+01 8.8708669066955714e+00 -1 0 0 +428 2 3.4990884231565705e-01 2.4398068524033910e+01 3.0172422508081215e+01 1.0810772009746300e+01 0 -1 0 +2331 2 3.5079342493493992e-01 5.2064627058065236e+00 2.7708451934664833e+01 9.4589076273547601e-01 0 0 1 +289 1 -6.8890047440900226e-01 2.5614823927510720e+01 2.7405470988437354e+01 9.0938119240594943e+00 -1 -1 0 +2143 1 -7.5804542689975407e-01 7.8745710373642239e-02 2.8267785805496505e+01 1.3067751100228358e+01 1 0 0 +2139 2 3.7928201005903961e-01 3.0523943861771443e+01 2.5123347238073457e+01 1.2286052823693883e+01 0 0 0 +2337 2 3.5914943750021483e-01 2.7982980760739459e+01 3.0361659529949762e+01 1.0725883676226925e+01 -1 0 1 +1467 2 3.5954451884135707e-01 2.5873940482334660e+01 2.3683995088923901e+01 1.1185822601501235e+01 0 0 0 +1455 2 3.7693870283650671e-01 2.6146068105875198e+01 2.1789399816838561e+01 1.5035604289235520e+01 0 0 0 +183 2 3.4828795567031207e-01 2.8557800567354928e+01 2.6376138691493416e+01 1.2266070203373703e+01 -1 0 0 +677 2 3.6396272860491191e-01 2.5712859436769588e+01 2.9030195725155021e+01 1.2128497063177194e+01 0 -1 0 +1106 2 3.9913351683679482e-01 1.8174279945828175e+01 3.0684727674107993e+01 1.4512233723842488e+01 0 0 0 +1304 2 3.6107063623748398e-01 2.8625501449869109e+01 2.7181843318364749e+01 1.0310947948550398e+01 0 0 0 +1912 1 -7.4104414153033016e-01 1.1698069005670529e+01 1.5744419460621131e+01 1.2544597663609681e+01 0 0 0 +678 2 3.3044914957682942e-01 2.6419359007871105e+01 2.9680792073147057e+01 1.3215613763102581e+01 0 -1 0 +910 1 -7.4281924048833048e-01 2.8437280336074551e+01 2.9976056974506591e+01 8.8325068950829451e+00 -1 0 0 +676 1 -7.6505901219117389e-01 2.6301827644936228e+01 2.8799583958072560e+01 1.2882579797955763e+01 0 -1 0 +1303 1 -7.8727795606889606e-01 2.8309919864935516e+01 2.7010363946789624e+01 9.4216674720800295e+00 0 0 0 +290 2 3.7043836185306966e-01 2.6565017029408050e+01 2.7390411449107006e+01 9.1249793246568327e+00 -1 -1 0 +2171 2 3.4326834663890887e-01 2.7562919121937277e+01 2.7975513531725674e+01 1.4186873036472745e+01 0 -1 0 +2145 2 3.5341020361431097e-01 5.8511868267090583e-01 2.7692818681943656e+01 1.3752232476885101e+01 1 0 0 +1945 1 -7.6402729752946219e-01 2.6695077837973667e+01 2.6000376719885502e+01 1.2969061133326520e+01 0 0 0 +93 2 3.7976280265708601e-01 9.0348566445855460e-01 2.9409424590030735e+01 1.2152921026129114e+01 0 0 0 +1947 2 3.5703833910423982e-01 2.6106173714029055e+01 2.5634024907519958e+01 1.3699848668347313e+01 0 0 0 +2282 2 3.8799513008704178e-01 3.0099826630609414e+01 2.9613146404803253e+01 8.9160193148825062e+00 -1 0 0 +291 2 3.5750723329860512e-01 2.5331940887455815e+01 2.8152410132656726e+01 9.7326543340109648e+00 -1 -1 0 +2144 2 3.3552473139954792e-01 3.0642422856655269e+01 2.8868905179467856e+01 1.3638219124658908e+01 0 0 0 +1305 2 3.9480578818462042e-01 2.8376297744365395e+01 2.6030779364580070e+01 9.3636649868968576e+00 0 0 0 +1466 2 3.9246402888933674e-01 2.6904922929046229e+01 2.4783907287116225e+01 1.1771241445637314e+01 0 0 0 +2734 1 -7.2382854903492777e-01 1.3707108314973883e+01 1.6770863409777963e+01 1.1231203325519900e+01 0 0 0 +1238 2 3.4481247578860302e-01 2.9313808677053302e+01 2.6259789677049987e+01 1.5302785766078491e+01 0 0 0 +2569 1 -7.3177289447898375e-01 1.7137009565743430e+01 2.3885095763143838e+01 1.5187813887405355e+01 0 0 0 +1488 2 3.5692691954684008e-01 2.9509775826894746e+01 3.0717097422710697e+01 1.4205998097752483e+01 0 0 0 +1967 2 3.5178852207702033e-01 5.1822116287820572e+00 1.6081427724137171e+01 7.8795791913758668e+00 0 0 1 +178 1 -6.7984691073543635e-01 9.1232380330040979e+00 1.5777570487371852e+01 1.1278161510519119e+01 0 0 0 +2216 2 3.4190717057196779e-01 2.4732804026675620e+01 3.0787678630554399e+01 6.5088003105526468e-02 0 -1 1 +107 2 3.4971144609339067e-01 3.5813792575530221e+00 2.5772053968346633e+01 2.5939715693812210e-01 0 -1 0 +1596 2 3.8907654241846407e-01 1.3932695527699384e+01 2.1276800284547537e+01 1.5421449348608080e+01 0 0 0 +2812 1 -7.0935516142550625e-01 1.6201426602723924e+01 3.1004616013418381e+01 6.7505702489044870e+00 0 0 1 +942 2 3.5904571565151733e-01 9.9603587503673836e+00 2.2884806884661739e+01 1.5325075750172157e+01 0 0 0 +2476 1 -7.5195101737034253e-01 1.6465874655471463e+01 1.5593224616913542e+01 1.3965217933360407e+01 0 0 0 +602 2 3.6704959261871023e-01 2.1035877062916210e+01 3.0977558031118289e+01 8.4737950394283104e+00 0 -1 0 +2829 2 3.8852471663730892e-01 2.2462937506558461e+01 1.5984134869706034e+01 1.5510374544909403e+01 0 0 0 +2841 2 3.6796209378854011e-01 6.3042865678625271e+00 2.2908991682961382e+01 8.0237084697705630e-02 1 0 0 +2565 2 4.0436469491963317e-01 1.2704761764209320e+00 1.6053650115450203e+01 1.9080890623613435e+01 0 0 0 +2563 1 -6.7611000077238470e-01 1.1472683325292459e+00 1.6249162632465769e+01 2.0035846446403664e+01 0 0 0 +2564 2 4.0778981150198818e-01 3.2501020578611023e-01 1.6753303182253919e+01 2.0229597294791944e+01 0 0 0 +2874 2 3.0889470933723584e-01 4.5820739533130483e+00 2.2128723260691615e+01 1.7462635147454915e+01 1 0 0 +1062 2 3.6037252280074866e-01 1.5638869745625017e+00 2.1597388647498928e+01 2.0415959146700228e+01 0 0 0 +2453 2 3.7904019657753646e-01 2.3220359130048061e+00 2.1698675539625103e+01 1.8975353307752130e+01 0 0 0 +2452 1 -7.1933244817353248e-01 1.8909493635495129e+00 2.1082951341513748e+01 1.9587431856443843e+01 0 0 0 +810 2 3.4622181872072527e-01 3.3923609315101131e+00 1.7049297110884318e+01 2.0486325237545703e+01 0 0 -1 +2467 1 -7.4410670249583011e-01 1.9985166093300266e+00 1.6134561924140069e+01 1.7564190458245303e+01 0 0 0 +2374 1 -7.5549882313366945e-01 4.9708970216671613e+00 1.5897640845727093e+01 1.8162153196036638e+01 0 0 0 +2376 2 3.4100942613539392e-01 5.3517499864409963e+00 1.6193354287035945e+01 1.7356460206206449e+01 0 0 0 +809 2 3.7578964355484112e-01 4.7014133471784998e+00 1.7027075716661063e+01 1.9863578419664893e+01 0 0 -1 +957 2 4.0200516441711215e-01 3.1711690929003957e+00 2.0435804024865750e+01 2.0366921012028225e+01 0 0 -1 +955 1 -7.8889873207496419e-01 3.9247566400771396e+00 2.0163465758259353e+01 2.0907781192972930e+01 0 0 -1 +956 2 3.8557050395591708e-01 4.0623801606004930e+00 1.9223205577425333e+01 2.0751641667477642e+01 0 0 -1 +2880 2 3.6470456104793036e-01 4.5590835487633585e+00 2.1324788166738507e+01 2.2180636558811027e+01 1 0 0 +2448 2 3.7891469717871362e-01 6.4104048348264353e+00 1.5780213047357663e+01 1.9122582220757749e+01 0 0 0 +581 2 3.7460426720235190e-01 1.5419382297134044e+01 3.0800518915771480e+01 2.6043886925557764e+01 0 -1 -1 +2872 1 -7.6269479373786953e-01 3.7009428876424453e+00 2.2413959840696482e+01 1.7771422527835437e+01 1 0 0 +2583 2 3.7327435409857357e-01 5.4441623512822481e+00 1.8249974051004482e+01 2.2056304735162637e+01 0 0 0 +2276 2 3.6149696853742197e-01 3.1288172812713939e+00 2.2351439514553785e+01 1.7001251371961878e+01 0 0 0 +1711 1 -6.8819152537359740e-01 5.8566533843091850e+00 1.8293718521491556e+01 2.2909298612410424e+01 0 -1 0 +570 2 3.7790956638870143e-01 1.0061486189159239e+00 2.2026618126685257e+01 1.6446196223609501e+01 1 -1 0 +1712 2 3.7429560628687081e-01 5.9482113502938487e+00 1.7356911971271291e+01 2.3291942335504508e+01 0 -1 0 +2997 2 3.5225437272715709e-01 6.6086757608250366e+00 2.1146860438570563e+01 1.9455868658346034e+01 1 0 0 +2995 1 -7.1265882757587440e-01 6.0246788973483776e+00 2.0382500638383885e+01 1.9229781344684003e+01 1 0 0 +2996 2 3.6650296349571998e-01 5.2499733116524041e+00 2.0470690161445592e+01 1.9880591363399045e+01 1 0 0 +868 1 -7.3205821000451254e-01 2.5958374885186419e+00 1.8850417537589575e+01 1.6354720355830807e+01 0 0 0 +2878 1 -7.1548846979217984e-01 4.9358770289344820e+00 2.2117119705858219e+01 2.2697449221692509e+01 1 0 0 +635 2 3.5961360442179929e-01 5.6901360064690110e+00 1.9633135447409259e+01 1.7042339689310896e+01 1 0 0 +634 1 -6.7563410020830350e-01 5.3605055245776070e+00 1.8786296859330406e+01 1.6629063670717017e+01 1 0 0 +2115 2 3.6239867576259466e-01 8.1957615718520105e-01 2.1726024313333614e+01 2.2120325638004008e+01 1 -1 0 +808 1 -7.5427064274521927e-01 4.2494047742010075e+00 1.7450448103663643e+01 2.0626646924584463e+01 0 0 -1 +869 2 3.8570557115870291e-01 2.5185340578773343e+00 1.7998889873837001e+01 1.6843735479251066e+01 0 0 0 +2879 2 3.7164260702824170e-01 5.8521700015176608e+00 2.2045790028891812e+01 2.2297213410798278e+01 1 0 0 +2929 1 -7.1547115163270913e-01 1.6733174735264713e+00 1.7565037739044858e+01 2.3239784168949743e+01 1 0 0 +2931 2 3.2300493004303144e-01 2.2415982955798239e+00 1.7185611160903488e+01 2.2537360933781954e+01 1 0 0 +636 2 3.5946336426886771e-01 4.4147762414063987e+00 1.9027776247970419e+01 1.6412064428481170e+01 1 0 0 +870 2 3.7872752608724825e-01 2.0905325493323708e+00 1.9511792379724071e+01 1.6829961939440512e+01 0 0 0 +90 2 3.8834987715673935e-01 3.0943079419730942e+01 2.3362929219921256e+01 1.7346239916805800e+01 -1 0 0 +2113 1 -7.4531961303516558e-01 4.7096294719936260e-01 2.2425780260519058e+01 2.1565634816952937e+01 1 -1 0 +84 2 3.4897705322751993e-01 6.4508803916872415e+00 2.3559543074305076e+01 1.9269480285743430e+01 0 0 0 +2446 1 -6.7386356744338205e-01 7.2018006619244739e+00 1.5776218241604699e+01 1.9761553973954879e+01 0 0 0 +2442 2 3.5677817428353492e-01 9.6049044051135581e+00 2.2246363140981110e+01 1.7420877969602010e+01 0 0 0 +2447 2 3.9770318677378780e-01 7.4935616608432012e+00 1.6709551456264087e+01 1.9776904052396038e+01 0 0 0 +1800 2 4.1263441495919023e-01 1.0493244043314887e+01 1.7856467585679393e+01 1.7093068535115474e+01 0 -1 0 +135 2 3.9020101999581147e-01 8.9585516768587699e+00 1.8955011839864781e+01 1.8149561907320830e+01 0 0 0 +2260 1 -7.0103070485976005e-01 9.3873721090698456e+00 1.9082381628952291e+01 1.7263300317648142e+01 0 0 0 +2459 2 4.0434139329975316e-01 9.9682070030173868e+00 1.9843076963821684e+01 1.7447146520603926e+01 0 0 0 +1672 1 -7.3253141780020958e-01 7.9840608557733734e+00 1.8482620317594353e+01 1.9685083124885651e+01 0 0 0 +1674 2 3.7607888027345554e-01 7.3596416275299301e+00 1.9230285660106546e+01 1.9813327146661464e+01 0 0 0 +1673 2 3.6415389748626503e-01 8.5081160988086832e+00 1.8502998507052023e+01 2.0514696258781356e+01 0 0 0 +2440 1 -7.2029648161625559e-01 9.6242880106291349e+00 2.1778741467411137e+01 1.8312320727913580e+01 0 0 0 +2441 2 3.4230058605961328e-01 8.8814147484251507e+00 2.2167102283532959e+01 1.8858178997559353e+01 0 0 0 +979 1 -6.7482259063424510e-01 9.3088737385903926e+00 1.8844654865070989e+01 2.2460656347640754e+01 0 0 -1 +981 2 3.2430814659994767e-01 1.0090752856278911e+01 1.8493242842363081e+01 2.3048318147233751e+01 0 0 -1 +2509 1 -7.0196068058637862e-01 1.1788754153574342e+01 2.1536558931188686e+01 2.2727285444582797e+01 0 0 0 +2494 1 -7.4134374356485211e-01 1.1760325640174159e+01 1.5944605909120598e+01 1.9376881358470484e+01 0 0 0 +1972 1 -7.0047005231308657e-01 1.0356107018540603e+01 1.5765792843229191e+01 2.1808303769585933e+01 0 -1 0 +1097 2 3.6804654533983650e-01 7.8990432043169108e+00 2.1860162981074073e+01 2.2981153842560516e+01 0 0 0 +1096 1 -7.2729234791305175e-01 7.6152216078739663e+00 2.1444382553767134e+01 2.2209500718085835e+01 0 0 0 +1098 2 3.4838062587641866e-01 8.2952355939697160e+00 2.0776200139787651e+01 2.1968914814861467e+01 0 0 0 +980 2 3.7621919366667722e-01 8.5832690427575464e+00 1.8897036762754400e+01 2.3096414297956674e+01 0 0 -1 +2511 2 3.7597610626228445e-01 1.2184327819808559e+01 2.1060047289538311e+01 2.1924792581040840e+01 0 0 0 +2652 2 3.9789000070420916e-01 1.2263660768542426e+01 2.0679378164077566e+01 1.6766552072505430e+01 0 0 0 +2650 1 -6.8409435611026848e-01 1.1940315526251053e+01 1.9971637937423427e+01 1.7402509219403665e+01 0 0 0 +276 2 3.5792728558793091e-01 1.2473518730115815e+01 1.9986571964075942e+01 1.8227032133933289e+01 0 0 0 +1883 2 3.5294858934765755e-01 2.0126515986864028e+01 2.6600416664575562e+01 1.6710503370343691e+01 0 -1 0 +2468 2 3.5615560919483652e-01 2.8654151542591384e+00 1.5740984955840435e+01 1.7791581939739004e+01 0 0 0 +47 2 3.7949325700519548e-01 2.9817534616981050e+01 2.8032334758234612e+01 3.0746086176961189e+01 -1 -1 -1 +82 1 -7.7671112964081956e-01 7.1843657320280654e+00 2.3006719761256434e+01 1.9524647308538508e+01 0 0 0 +83 2 3.7436185898904384e-01 7.7254895369175776e+00 2.3519389228185439e+01 2.0129349219977321e+01 0 0 0 +1799 2 4.0180775006962682e-01 1.1810581389420010e+01 1.7033363248374886e+01 1.6621855523625594e+01 0 -1 0 +2496 2 4.0008485730469134e-01 1.1250540164512902e+01 1.6368263642458796e+01 1.8542999428761011e+01 0 0 0 +1083 2 3.4433348874294767e-01 1.1232902323015876e+01 2.5552244869791163e+01 3.0999593987954334e+01 0 0 -1 +2259 2 3.6420374135793915e-01 2.8495310473049784e+01 1.6082096260150365e+01 2.4803330061870188e+01 -1 0 0 +605 2 3.6069102724715812e-01 1.0653259836693101e+01 3.0665436152166350e+01 2.8953516374747096e+01 0 -1 -1 +1798 1 -7.4143336877672139e-01 1.0949162989447700e+01 1.6939559656764274e+01 1.7089535490890931e+01 0 -1 0 +1973 2 3.9184314405503479e-01 1.0849543291546629e+01 1.6068095219841016e+01 2.1029731159266454e+01 0 -1 0 +2682 2 3.5444139370273653e-01 2.2872210746000949e+01 1.5823126078637777e+01 1.9045757247082200e+01 0 0 0 +2177 2 3.7577310362369815e-01 2.7328595985351306e+01 2.7745186194996887e+01 2.7380636598096508e+01 0 -1 0 +1861 1 -7.2948921739616235e-01 1.4647541013196969e+01 1.5893645690038790e+01 1.6279559372752470e+01 0 0 0 +2498 2 3.8097263973112555e-01 1.2938270040404607e+01 1.7100569370949469e+01 1.9757891409716329e+01 0 0 0 +2510 2 3.9891115678219063e-01 1.2767352583765447e+01 2.1753746710905055e+01 2.3420981789955796e+01 0 0 0 +1200 2 3.8872285951965591e-01 1.3469725203925210e+01 2.0688908003932251e+01 2.0114797967351016e+01 0 0 0 +2558 2 3.6746091393743319e-01 1.4197026966545986e+01 1.7970933823901291e+01 2.1890988724450011e+01 0 0 0 +2753 2 3.7812641223402427e-01 1.4503789050574767e+01 1.7016554098710056e+01 2.0007044748354808e+01 0 0 0 +2752 1 -7.5794476806788680e-01 1.3773058971560914e+01 1.7610063743754900e+01 2.0147381432369915e+01 0 0 0 +1198 1 -7.3785542644020652e-01 1.2722945994650141e+01 2.0178892074428340e+01 2.0412494058857920e+01 0 0 0 +2754 2 3.7953874501108459e-01 1.2955585724155942e+01 1.9237787247783668e+01 2.0402977981879534e+01 0 0 0 +2501 2 3.8591245743111002e-01 1.7069179347359253e+01 2.0427873319025792e+01 1.8107261744812714e+01 0 0 0 +2500 1 -7.6572664227792298e-01 1.7451409436569911e+01 2.0796108924863930e+01 1.7384990849850592e+01 0 0 0 +627 2 3.8642862893208907e-01 2.9111656614776731e+01 3.0905618749578579e+01 2.1355596991645790e+01 0 -1 -1 +949 1 -7.3787771051202400e-01 1.6477607738654012e+01 1.9366811648631813e+01 1.9731657372562406e+01 0 0 -1 +950 2 3.3931122396063440e-01 1.5985927502409446e+01 1.8563515801563192e+01 2.0012871080420258e+01 0 0 -1 +951 2 3.3522345570974904e-01 1.6399763962324545e+01 1.9974858343661673e+01 2.0488216687038562e+01 0 0 -1 +2502 2 3.2300893204683401e-01 1.7701586389495752e+01 1.9978779271362470e+01 1.6797287143588839e+01 0 0 0 +2856 2 3.6286740285890251e-01 1.9088413504040428e+01 2.1422083807728644e+01 1.7331561596723645e+01 0 0 0 +1896 2 3.3866811829528354e-01 1.8154982291173472e+01 2.2262265937145784e+01 1.8813822681117955e+01 0 -1 0 +1894 1 -7.3085053977240566e-01 1.8742250855955579e+01 2.2242430132658562e+01 1.9587550246900438e+01 0 -1 0 +1153 1 -7.0909725109401156e-01 1.4568212577030154e+01 2.1758084676468798e+01 1.9084218084358760e+01 0 0 0 +1155 2 3.9048148196889804e-01 1.4683212818975365e+01 2.2584919729163854e+01 1.8463305709392731e+01 0 0 0 +1594 1 -7.5416754141135045e-01 1.3083912575970864e+01 2.1704003403232615e+01 1.5708244538227005e+01 0 0 0 +1813 1 -6.9441977609673300e-01 6.3039324182827920e+00 3.0821799880495821e+01 2.1189606677534080e+01 0 -1 0 +2849 2 3.5480349581328491e-01 1.8129051651410556e+01 1.8705079174557753e+01 2.0228902761443340e+01 0 0 0 +1863 2 3.6854576007161327e-01 1.5172666627302098e+01 1.6095702708726595e+01 1.7029458334273805e+01 0 0 0 +2746 1 -7.3273328749835243e-01 1.6093205557140369e+01 1.6337803951705954e+01 1.9134412030967425e+01 0 0 0 +2670 2 3.7884885366866627e-01 1.6904941489106388e+01 3.1017946547072516e+01 1.8351426234861631e+01 0 0 0 +2747 2 3.7526896474913241e-01 1.6632130676703571e+01 1.6039388323818944e+01 1.8415729258210146e+01 0 0 0 +1386 2 3.8475593535460384e-01 2.7164340055959478e+01 3.0099801116608390e+01 1.7095499208172395e+01 0 0 0 +653 2 3.7600427557950300e-01 1.8429978363641840e+01 1.6393214087114725e+01 2.0536708163206043e+01 0 0 0 +926 2 3.3585894276326667e-01 1.1333087962713002e+01 3.0477256321291371e+01 2.4285673591173943e+01 0 0 0 +2965 1 -7.2583966210207052e-01 1.2864962032239149e+00 1.6632632849149697e+01 3.0381041687091447e+01 1 0 0 +2559 2 3.4260462364336525e-01 1.4848326918990606e+01 1.8875073679901682e+01 2.2968734193161435e+01 0 0 0 +2557 1 -7.0605139533455008e-01 1.4331764527916098e+01 1.8058309776495935e+01 2.2872018353667798e+01 0 0 0 +568 1 -7.1732389025140930e-01 1.8578047794583581e+00 2.1535792668020783e+01 1.6028395496735452e+01 1 -1 0 +2748 2 3.8168868936078065e-01 1.6471888994325148e+01 1.6105801488731093e+01 1.9974337730133673e+01 0 0 0 +2193 2 3.7234436478270250e-01 2.7998844550166559e+01 2.6328675841197466e+01 2.6367469356902838e+01 0 -1 0 +2855 2 3.6194534394557654e-01 2.0033965557468058e+01 2.1858791951418684e+01 1.6125877121497311e+01 0 0 0 +1148 2 3.4354261902983407e-01 2.5158469268152945e+01 1.6053290568144252e+01 2.3155099627088500e+01 0 0 -1 +2835 2 3.3871436051537818e-01 2.1391769693115197e+01 1.6752990314935037e+01 1.6522425972689309e+01 0 0 0 +2854 1 -7.6148130321416307e-01 2.0042981091993074e+01 2.1579410100574112e+01 1.7093249739522637e+01 0 0 0 +1895 2 3.3633802886671432e-01 1.9645176520042821e+01 2.2097828586501326e+01 1.9152440208691370e+01 0 -1 0 +1811 2 3.5609428898676954e-01 1.8707827025288051e+01 1.6952055951109241e+01 2.3651863342904992e+01 0 -1 0 +701 2 3.9222358501290394e-01 2.3503612900094463e+01 2.0341372940500914e+01 1.7687642841542818e+01 0 0 0 +702 2 3.7651346292397025e-01 2.4993255123712686e+01 2.0385384067740553e+01 1.7991898240006243e+01 0 0 0 +1199 2 3.6152846434730673e-01 2.1925673007890705e+01 2.2668013759151197e+01 1.7366330540124970e+01 0 0 0 +2922 2 3.6359369647919776e-01 2.3361693486816201e+01 1.7936969153801638e+01 1.5680260362233357e+01 0 0 0 +1951 1 -7.9328339981929941e-01 2.0314945917663909e+01 1.7053498194643307e+01 1.8136306919551057e+01 0 0 0 +1953 2 4.0646187120711424e-01 1.9964678378818739e+01 1.7591120829025456e+01 1.8830486704836559e+01 0 0 0 +1471 1 -7.0560238583825863e-01 2.1591710370264284e+01 1.9400709504333953e+01 1.7575382984451089e+01 0 0 0 +1473 2 3.6358229425505018e-01 2.0895794207685931e+01 2.0046956148602124e+01 1.7377298397087262e+01 0 0 0 +1472 2 3.5797336917149358e-01 2.1135558773815383e+01 1.8509993956440493e+01 1.7515866130752990e+01 0 0 0 +2848 1 -7.4639765540348535e-01 1.8884359102375498e+01 1.8088210388615583e+01 2.0089347304986042e+01 0 0 0 +2823 2 3.3361870878766836e-01 1.9594100684430078e+01 1.8350188943716372e+01 2.0815798117173369e+01 0 0 0 +729 2 3.7204357853523695e-01 2.5116144885662930e+01 1.7388683086282882e+01 1.8512589751641979e+01 0 0 0 +727 1 -7.5798923778031790e-01 2.4500483041448923e+01 1.6633913849547586e+01 1.8522427042114860e+01 0 0 0 +700 1 -7.2428328091107230e-01 2.4173472907905484e+01 2.0978036113664331e+01 1.7857787913545049e+01 0 0 0 +1598 2 3.5615949548720716e-01 2.4266877405299546e+01 2.1718804381820732e+01 1.9993608189643279e+01 -1 -1 0 +1597 1 -6.8879075016082236e-01 2.4547053504657136e+01 2.1460191437475498e+01 2.0842654794992228e+01 -1 -1 0 +2895 2 3.4721873723606850e-01 2.3611735806262967e+01 1.7418190978508740e+01 2.0520242610221505e+01 0 1 0 +728 2 3.2560686269065575e-01 2.4729109153127549e+01 1.6294300081678781e+01 1.7621847646784289e+01 0 0 0 +812 2 3.6544233381893815e-01 3.0350325135098089e+01 2.9852854799496011e+01 1.8855060403428610e+01 -1 0 0 +1262 2 3.9280028734695327e-01 2.3320715372853154e+01 2.2594933660546744e+01 1.8002306692272668e+01 0 0 0 +2893 1 -6.7043759366381761e-01 2.3372327680289807e+01 1.7931492806898280e+01 2.1317027953159300e+01 0 1 0 +687 2 3.8011281492684679e-01 2.2063828530596499e+01 3.0140444948093727e+01 1.8154991056672642e+01 0 -1 0 +1261 1 -7.8027245716304938e-01 2.2625684936239633e+01 2.3207155910459772e+01 1.7695133159849458e+01 0 0 0 +1599 2 3.4109075232904440e-01 2.5005131269365876e+01 2.2272712024131749e+01 2.1123917212844873e+01 -1 -1 0 +2894 2 3.8818749381521300e-01 2.2400140867531587e+01 1.8072813606607230e+01 2.1214357055362939e+01 0 1 0 +2920 1 -7.4414679730307309e-01 2.4285015990036879e+01 1.8212687527780602e+01 1.5899101547282720e+01 0 0 0 +1300 1 -7.4822613276536010e-01 2.0800383473570825e+01 1.8465849784410672e+01 2.2204085512601551e+01 0 0 0 +1302 2 3.5738914623477813e-01 2.0487439209381307e+01 1.9408482096827495e+01 2.2244477767286060e+01 0 0 0 +1149 2 4.0392969453323502e-01 2.3972783245823674e+01 1.7019307704670378e+01 2.2751918520546074e+01 0 0 -1 +1916 2 3.3613964528713897e-01 1.8997302249916039e+01 2.0878099496222401e+01 2.1543113259621361e+01 0 0 0 +1915 1 -7.6926925654261991e-01 1.9342540467916194e+01 2.0868884698068083e+01 2.2407952677753215e+01 0 0 0 +1964 2 4.0187800998034429e-01 1.9927315977925936e+01 2.1596354965791296e+01 2.2454076308555667e+01 0 0 0 +1909 1 -7.2852885325819183e-01 2.1619076440640026e+01 2.2641295424567502e+01 2.2370432722815025e+01 0 -1 0 +1923 2 3.3898145705281468e-01 2.2544854891054413e+01 2.2316554998686897e+01 2.2403423703457392e+01 0 -1 0 +2939 2 3.8223651968555239e-01 1.8668189867310097e+01 1.6390840966832787e+01 1.7277087787602792e+01 0 0 0 +2484 2 3.7307712781596902e-01 7.6359864421142936e+00 3.0975696403139899e+01 2.5643613489742151e+01 0 0 0 +1652 2 3.5794883155325735e-01 5.0427297969356157e+00 3.0832567574938459e+01 2.2775451059533083e+01 0 -1 0 +2174 2 3.8363043313262279e-01 2.6110317662816119e+01 2.0443548485530055e+01 2.1075769124118832e+01 0 -1 0 +1391 2 3.7290317354576341e-01 2.7111382834942216e+01 2.1894183992540228e+01 1.6151440859766556e+01 0 0 0 +2358 2 3.8008604609966268e-01 9.3263411365665654e+00 1.5948262579326640e+01 1.5980403394054617e+01 0 0 0 +2833 1 -7.7680805794190866e-01 2.1889033295979491e+01 1.6742009812923342e+01 1.5635214724251041e+01 0 0 0 +2552 2 3.4690752209002046e-01 3.0224935614711704e+01 1.8289187070138855e+01 2.0077458156807612e+01 -1 0 0 +2551 1 -6.9442600053127224e-01 2.9902739622371950e+01 1.7510894175084186e+01 2.0595281762567023e+01 -1 0 0 +2671 1 -7.8981279469468568e-01 2.7038448668057629e+01 1.6109327801297642e+01 2.1980652823958877e+01 0 0 0 +2553 2 3.4054194871104354e-01 2.9932848115363079e+01 1.7888113838751423e+01 2.1503092451354249e+01 -1 0 0 +2673 2 3.5462103090337649e-01 2.7642869727354125e+01 1.6345687751129560e+01 2.1314664342917510e+01 0 0 0 +1339 1 -7.1505846326089539e-01 3.0264441714750088e+01 2.0001447498995709e+01 1.8559038714274156e+01 0 0 -1 +1340 2 3.8626202073150107e-01 3.0830832560579825e+01 2.0507250999418257e+01 1.8012385725203700e+01 0 0 -1 +1341 2 3.6031343875946437e-01 3.0053357011462392e+01 2.0572482492739759e+01 1.9371104911776399e+01 0 0 -1 +133 1 -7.3076751616149360e-01 2.8186702082558806e+01 2.0605350989896191e+01 1.6998728028641448e+01 -1 0 0 +2288 2 3.6741410489919724e-01 2.8499639413149080e+01 1.9791474184393412e+01 1.6047710584435372e+01 -1 0 0 +88 1 -7.3974407319908686e-01 3.0642275184573499e+01 2.2444786654927732e+01 1.7303369220099167e+01 -1 0 0 +2147 2 3.7038335781937110e-01 2.7025335670146816e+01 1.9672959580777288e+01 1.7723089611091176e+01 0 0 0 +2148 2 3.7651016205666127e-01 2.6496805034932265e+01 1.9443354706358477e+01 1.9246338887601325e+01 0 0 0 +2146 1 -7.2104093540569658e-01 2.6280388468820234e+01 1.9237152426356072e+01 1.8293702857600966e+01 0 0 0 +654 2 3.4769438023806692e-01 1.7623658204021812e+01 1.5643832632787415e+01 2.1610894594067368e+01 0 0 0 +1877 2 3.2112080310880986e-01 1.3870985175542049e+01 2.9875449119889161e+01 1.5792307590707940e+01 0 -1 0 +651 2 3.9286800400053029e-01 2.9192664370322753e+01 1.7711724994172208e+01 1.5802045269930654e+01 0 0 0 +134 2 3.9047567034986069e-01 2.9008881684968355e+01 2.0503523319701635e+01 1.7547946173593918e+01 -1 0 0 +2275 1 -6.4774583495306726e-01 2.9360709086511637e+01 1.6935661418682951e+01 1.6403866516251814e+01 -1 0 0 +2173 1 -7.3404361623082071e-01 2.6633380646204319e+01 1.9635410283715427e+01 2.1140455287178625e+01 0 -1 0 +89 2 3.8746167291159628e-01 2.9827072030322309e+01 2.2528212416225113e+01 1.6740639784501301e+01 -1 0 0 +1392 2 3.7102612806233226e-01 2.8390741155099267e+01 2.0538409814570340e+01 2.1339382996650819e+01 0 0 0 +1974 2 3.9124312565084696e-01 1.1007641386595305e+01 1.5652532773548923e+01 2.2598675846856850e+01 0 -1 0 +1766 2 4.1012433962073519e-01 1.2093625146649675e+01 1.5616728719308202e+01 2.4139661025106957e+01 0 0 0 +1390 1 -7.4075990346411791e-01 2.8955462743157913e+01 2.1197977826611819e+01 2.0980214939671992e+01 0 0 0 +14 2 3.3216402906072906e-01 3.0807338651004379e+01 2.0010596347711214e+01 2.3173548166399449e+01 -1 0 -1 +13 1 -7.1823393407369551e-01 3.0181623694281640e+01 1.9196841376224548e+01 2.3232789797521033e+01 -1 0 -1 +15 2 3.6643141516383010e-01 3.0824115746408197e+01 1.8564929535970997e+01 2.3620467024305327e+01 -1 0 -1 +2946 2 3.5464067049253556e-01 2.8347711815742397e+01 2.1955609811562447e+01 2.0786727957214900e+01 0 0 0 +609 2 3.3726211282363161e-01 2.6722126209328781e+01 2.1864245394913599e+01 1.8227963199264458e+01 0 0 0 +2114 2 3.6294635940713710e-01 3.0569382111652988e+01 2.2092167602819217e+01 2.1384765432168759e+01 0 -1 0 +2175 2 3.6956857299387247e-01 2.6775328288934990e+01 1.9391414265406720e+01 2.2070995898872191e+01 0 -1 0 +2277 2 3.4130372475137410e-01 2.8461490696868786e+01 1.6572290727888070e+01 1.6616339409653147e+01 -1 0 0 +607 1 -6.7870281831109713e-01 2.6848217984759554e+01 2.2629066216455989e+01 1.8799515229904490e+01 0 0 0 +1742 2 3.7733924902200827e-01 6.2124954020967262e+00 1.7260377098056626e+01 1.5550962438447414e+01 0 0 0 +1330 1 -7.8496253413332018e-01 2.3270089834049863e+01 2.6534928251474859e+01 2.4065661470658988e+01 0 0 -1 +887 2 3.6946757095486138e-01 2.0040782937944233e+00 3.0061591848212984e+01 1.8686775775007728e+01 0 0 0 +737 2 3.7155224071670767e-01 3.5949238954512595e+00 2.9850888051310818e+01 1.7110461504270695e+01 1 0 0 +835 1 -7.3994905485209217e-01 1.9001215466248231e+00 3.0243246749550234e+01 2.2811929013447735e+01 0 0 0 +1482 2 3.2537375859813600e-01 1.9086213375222647e+00 2.4433742767312904e+01 1.6078242920839681e+01 1 0 0 +2379 2 3.8172034119539050e-01 1.1872760584299091e+00 2.8351728036452197e+01 1.6573683527548113e+01 0 0 0 +1658 2 3.7598090017212937e-01 4.3362350139691737e+00 2.3622345476035559e+01 1.8845548092946810e+01 0 0 0 +1448 2 3.9598335182587041e-01 2.8956507372101109e-01 2.4211592747288478e+01 2.1898365888876480e+01 1 0 0 +1816 1 -7.4039505542705264e-01 4.4548197327358166e+00 2.9048771957014083e+01 2.0364574050961149e+01 0 -1 0 +1608 2 3.8415672467719181e-01 3.4094829216785132e+00 2.4810241251644356e+01 2.3214769057767086e+01 0 -1 0 +1480 1 -7.4321766030088710e-01 1.3151549441660131e+00 2.4699572551697230e+01 1.6845119956996410e+01 1 0 0 +1657 1 -7.5391051177746882e-01 4.6406861138286324e+00 2.4411640466564599e+01 1.9369193193625961e+01 0 0 0 +1607 2 3.4950019252893449e-01 3.9391172258977307e+00 2.4668809266498091e+01 2.1762309228807219e+01 0 -1 0 +168 2 3.9778111545845751e-01 4.8475093205966653e+00 2.6357860575154756e+01 2.2702131321288228e+01 0 -1 0 +890 2 3.6811701282287895e-01 6.2511905814711950e+00 2.6600886977625279e+01 1.9000587336021255e+01 0 0 0 +2218 1 -7.7505098638268577e-01 1.6972191076454666e+00 2.7678944955362095e+01 2.0391031360233221e+01 1 -1 0 +2220 2 3.2792785896845461e-01 1.0077534081334456e+00 2.6993360710017047e+01 2.0440971238793225e+01 1 -1 0 +1659 2 3.8144052861295125e-01 4.0897156698269264e+00 2.5182641988673712e+01 1.9084729215070265e+01 0 0 0 +891 2 3.5274381077766698e-01 6.2083068484585358e+00 2.5461600949760292e+01 2.0013337957564250e+01 0 0 0 +889 1 -7.6685202371536598e-01 6.4538906183109939e+00 2.6406976884223820e+01 1.9888325559538149e+01 0 0 0 +2389 1 -7.4567975904915462e-01 2.9232523437030604e+00 2.6152195051468794e+01 1.8331498017525611e+01 0 0 0 +2391 2 3.9326254808262040e-01 2.3780527706042967e+00 2.5518835027557358e+01 1.7847227822781967e+01 0 0 0 +2219 2 3.5504751925497596e-01 1.9382781297843090e+00 2.7899885033152866e+01 2.1228752311420461e+01 1 -1 0 +2390 2 3.5492559747849900e-01 2.3951946751869384e+00 2.6463788627000607e+01 1.9098362572217635e+01 0 0 0 +1606 1 -7.8273983031529759e-01 3.5379376735739876e+00 2.5287692988003748e+01 2.2404395229677025e+01 0 -1 0 +824 2 3.5757835209464606e-01 1.6778081964300646e+00 2.8544713183763236e+01 1.8504583158296640e+01 0 0 0 +1447 1 -7.8084231982991281e-01 4.1723176459940631e-01 2.5098881068255277e+01 2.2252886266331245e+01 1 0 0 +886 1 -7.4338410648607733e-01 1.9580275389767821e+00 2.9338943355103435e+01 1.8031630550089133e+01 0 0 0 +1449 2 3.4068386353378610e-01 1.3526734389341162e+00 2.5260052242748490e+01 2.2189683785804149e+01 1 0 0 +1817 2 3.3863263823282508e-01 4.7495420765212675e+00 2.8245071703044033e+01 2.0815730761767309e+01 0 -1 0 +1818 2 3.6230976516486735e-01 3.6050574599956482e+00 2.8796585338422496e+01 2.0080230250081200e+01 0 -1 0 +836 2 3.7944051003969576e-01 1.8343953575126255e+00 2.9269659788844582e+01 2.2711957199106845e+01 0 0 0 +1619 2 3.0865492332967515e-01 5.2531346251025601e+00 2.5839475428431044e+01 1.7155063367279972e+01 0 -1 0 +1553 2 3.3759533236758055e-01 2.3331642385303124e+00 2.6798799991892459e+01 2.3233869925364218e+01 0 -1 0 +2888 2 3.7221098412170578e-01 2.1736036678608901e+00 3.0554994531806472e+01 3.0547439384624489e+01 1 0 0 +1618 1 -7.2150748307404122e-01 6.0675544812496733e+00 2.6343445561732437e+01 1.6914227835244521e+01 0 -1 0 +166 1 -7.7798256713464498e-01 5.4730584070999084e+00 2.7036778709998938e+01 2.2512398414187615e+01 0 -1 0 +1481 2 3.6273777416015407e-01 7.8842479601488002e-01 2.5379055134433440e+01 1.6393740924115864e+01 1 0 0 +1622 2 3.7958629953034284e-01 3.0355259666111596e+01 2.8912811005557533e+01 2.8734220869269837e+01 -1 -1 0 +2658 2 3.3046556022745233e-01 1.2616239059600234e+01 2.3718554088655857e+01 1.6156384330192726e+01 0 0 0 +2967 2 3.9694405617735240e-01 7.8619980381494770e-01 1.5852233150811893e+01 3.0191631415087002e+01 1 0 0 +1536 2 2.9020479076616773e-01 1.2721807801685799e+01 3.0544256463690271e+01 2.7995926123662766e+01 0 -1 0 +1521 2 3.8855343951159921e-01 2.9008050743040521e+01 2.4575896530061790e+01 2.9455934354360195e+01 -1 -1 0 +1581 2 3.4044964783745879e-01 6.6704753023468610e+00 2.2146446156744457e+01 1.7720354237761928e+01 0 0 0 +1579 1 -7.3079233402842936e-01 6.8473799725083850e+00 2.2032389149695376e+01 1.6775499150127768e+01 0 0 0 +1710 2 3.3164288297072542e-01 6.3442717039164833e+00 2.9399264140279374e+01 1.7809259870664633e+01 0 -1 0 +1186 1 -7.1762498153613963e-01 1.2061130362862064e+01 2.7710725555119232e+01 1.6303129930368414e+01 0 0 0 +2543 2 3.9132667210679384e-01 8.0328620678882103e+00 2.7360249799475074e+01 2.0200877092041747e+01 0 0 0 +2542 1 -7.4335551537365108e-01 8.8588566111759999e+00 2.7839565103082613e+01 2.0158454636607239e+01 0 0 0 +1580 2 3.6660103810031852e-01 7.7822935418275607e+00 2.2187181491108323e+01 1.6653747143274629e+01 0 0 0 +905 2 3.8125581257206370e-01 9.9809440180732878e+00 2.5058303935333765e+01 1.8708120984336677e+01 0 0 0 +904 1 -6.6718807913192824e-01 9.7640093485817729e+00 2.5881439346480942e+01 1.8157436649501598e+01 0 0 0 +2028 2 3.7288708414509059e-01 1.1465150032820725e+01 2.2959931806776911e+01 2.2204695762379774e+01 0 -1 0 +189 2 3.6496297873456091e-01 9.5150793476160480e+00 2.6576982078446441e+01 1.8746133122372619e+01 0 0 0 +1683 2 3.3609316699776010e-01 9.5418941214948010e+00 2.4143828787022262e+01 2.1454915643622822e+01 0 0 0 +2544 2 3.5925502517564772e-01 8.7192940972858128e+00 2.8455501814449036e+01 1.9433901210997096e+01 0 0 0 +2026 1 -7.6000936424524745e-01 1.1481342449937031e+01 2.4001709511526855e+01 2.1916569286833848e+01 0 -1 0 +167 2 3.5939831747318335e-01 5.8399563755352411e+00 2.6838134911364133e+01 2.1648050653970635e+01 0 -1 0 +2387 2 3.7171811309155250e-01 2.7904319420004885e+01 2.8455017550611686e+01 3.0357763291847803e+01 -1 0 0 +99 2 3.6473960429000868e-01 1.0731596183910357e+01 2.2867900148968648e+01 1.9092941586161427e+01 0 -1 0 +2700 2 3.7199849930061141e-01 2.0852448107235148e+01 1.7054906030418309e+01 3.0575464308630306e+01 0 0 0 +97 1 -7.5071721085194021e-01 1.1049890349600167e+01 2.3840135524714370e+01 1.9254247088408178e+01 0 -1 0 +800 2 3.5710118669031121e-01 2.4035493305068787e+01 3.0830422818147284e+01 2.5625406350025436e+01 -1 0 -1 +98 2 3.9763138146762189e-01 1.1341014006311463e+01 2.3953077489078169e+01 2.0157369867347231e+01 0 -1 0 +1682 2 3.5912858910436246e-01 8.3063524807804434e+00 2.3893927687367249e+01 2.2415732600795270e+01 0 0 0 +1746 2 4.0922736998545300e-01 1.0218875115844151e+01 2.7265474418666845e+01 2.1122927422688214e+01 0 -1 0 +1681 1 -7.1194996980377623e-01 8.5989116638959242e+00 2.4407703998472464e+01 2.1619795482451607e+01 0 0 0 +1745 2 3.7183887959671857e-01 1.0709595644695415e+01 2.5864885948545112e+01 2.1638167364185758e+01 0 -1 0 +1744 1 -7.3448628392948379e-01 1.0884850457999093e+01 2.6795137266220760e+01 2.1657055121225177e+01 0 -1 0 +2656 1 -7.3595319421670635e-01 1.2278339467500622e+01 2.4569208954327447e+01 1.6485816072697872e+01 0 0 0 +2657 2 3.4676392257192501e-01 1.1761127253799433e+01 2.4296052154892031e+01 1.7274728627990154e+01 0 0 0 +1708 1 -7.2804739697530674e-01 7.2541583481233065e+00 2.9027374704991516e+01 1.7779498249360810e+01 0 -1 0 +1769 2 3.6420768175652235e-01 1.0065218192421860e+01 2.4199319642198414e+01 2.4657457497983135e+01 0 0 0 +1814 2 3.4098094159333331e-01 6.6857723747746620e+00 2.9926880883147600e+01 2.1470524305880222e+01 0 -1 0 +1704 2 3.4684011316705121e-01 7.0846777559195795e+00 2.8056444158164609e+01 1.7623210577804553e+01 0 -1 0 +1026 2 3.8781539415751987e-01 1.0532268753529356e+01 2.7258597941924911e+01 2.3254135035277464e+01 0 0 0 +1815 2 3.6556475865578497e-01 5.4602084228133503e+00 3.0496894748905664e+01 2.0791504545758951e+01 0 -1 0 +1532 2 4.1676796539526711e-01 2.6985021244925864e+00 3.0332255359412574e+01 2.3328311399892229e+01 0 -1 0 +941 2 3.3011655614087365e-01 1.0235075396833105e+01 2.3914868421003952e+01 1.6431859224198476e+01 0 0 0 +1960 1 -7.4577671936548362e-01 1.0672557369495419e+01 2.2202495197016393e+01 3.0797234871241518e+01 0 0 0 +1187 2 3.5475340768696395e-01 1.2074232581338990e+01 2.6801524266253413e+01 1.6557468728805507e+01 0 0 0 +1263 2 3.6177104414988503e-01 6.8798332669191469e+00 2.8866167446549504e+01 1.6015683362064738e+01 0 0 0 +1025 2 3.4740510085813531e-01 1.3831000128405167e+01 2.9956041032301236e+01 2.0265276112271710e+01 0 0 0 +1887 2 3.4401208015117996e-01 1.3693521295342007e+01 2.9883365004670086e+01 1.8803328339921094e+01 0 -1 0 +1024 1 -7.4732187151657015e-01 1.4087397191898239e+01 2.9404061588278498e+01 1.9492453858151610e+01 0 0 0 +530 2 3.7072902686858572e-01 1.8333980877958460e+01 2.8495650933719439e+01 2.1013438094557412e+01 0 -1 0 +2668 1 -7.2586779053953332e-01 1.6468616660246916e+01 3.0200576834508450e+01 1.8107458376186266e+01 0 0 0 +1154 2 3.4661338446117257e-01 1.5147437638589933e+01 2.1087505274478012e+01 1.8824016883184473e+01 0 0 0 +2027 2 3.6997504158884464e-01 1.2396017155534320e+01 2.4352657259825314e+01 2.2151001049086265e+01 0 -1 0 +1140 2 3.4746339177485541e-01 1.3293086927379797e+01 2.8899256805032657e+01 2.1625048514514795e+01 0 0 -1 +964 1 -7.4458835564014869e-01 1.4019783567999925e+01 2.4794847815034593e+01 2.1473518938176689e+01 0 0 -1 +1625 2 3.4774047102489730e-01 1.5675859432699948e+01 2.4603413527062351e+01 1.8148153647608549e+01 0 -1 0 +2620 1 -7.0699379411909236e-01 1.4511457350057446e+01 2.6632506733136950e+01 1.9393603708328243e+01 0 0 0 +2622 2 4.0309427424184130e-01 1.4177434274016157e+01 2.7522401107493817e+01 1.9327041279340989e+01 0 0 0 +965 2 3.7670942870363838e-01 1.4795561586879975e+01 2.4239948137266012e+01 2.1598707770989751e+01 0 0 -1 +966 2 4.0283551317030708e-01 1.4130893948778615e+01 2.5315683513789242e+01 2.0618639203639322e+01 0 0 -1 +2621 2 3.7009770339032583e-01 1.5534641821589435e+01 2.6597926923867742e+01 1.9152049738736999e+01 0 0 0 +546 2 3.9382516461967920e-01 1.7478807026721604e+01 2.5575790465036320e+01 1.9552121382113413e+01 0 0 0 +1109 2 3.9603631716475218e-01 1.7587893381911218e+01 2.7037447379780758e+01 1.8842235312372665e+01 0 0 0 +544 1 -7.5072975927881780e-01 1.7106796996545597e+01 2.6158125046985724e+01 1.8868433779044160e+01 0 0 0 +2521 1 -7.4647176537913629e-01 1.6428268017121251e+01 2.3429442241142524e+01 2.2041669613978961e+01 0 0 0 +529 1 -7.0375099083884907e-01 1.8131769227280607e+01 2.8795775098271839e+01 2.1924862280486551e+01 0 -1 0 +531 2 3.5122400712037394e-01 1.8980691893033367e+01 2.9179868653899451e+01 2.2242680310203820e+01 0 -1 0 +2570 2 3.6124228882708764e-01 1.6866886169502983e+01 2.3823010403779197e+01 1.6164612093841882e+01 0 0 0 +2021 2 3.5382380688622811e-01 8.1392963818983528e+00 2.9579488267733431e+01 3.0253733617405214e+01 0 -1 0 +2523 2 3.6929354710445378e-01 1.7232548888680952e+01 2.3622220153421953e+01 2.1593006085617734e+01 0 0 0 +1256 2 3.8051453201239649e-01 1.9030161814415106e+01 2.8274253626770872e+01 1.8113350609912985e+01 0 0 0 +1454 2 3.5206106808239324e-01 1.7664833885406878e+01 2.9013449343858760e+01 1.8533401541384283e+01 0 0 0 +1255 1 -7.5347409426897416e-01 1.8438052720492330e+01 2.8456261883209745e+01 1.8922797934676712e+01 0 0 0 +2083 1 -7.0262180250070194e-01 1.8718730438484116e+01 2.4754632237447048e+01 2.0588384405181767e+01 0 -1 0 +1624 1 -7.3956337810603157e-01 1.5475438283386362e+01 2.3771735795258046e+01 1.7641629969102098e+01 0 -1 0 +1138 1 -7.6146681499474245e-01 1.3501118733959119e+01 2.9300473626089911e+01 2.2448873836361070e+01 0 0 -1 +2474 2 3.5290603632116113e-01 1.2611528613337823e+01 2.9176722611242191e+01 2.2934708093577072e+01 0 0 0 +1626 2 3.2229356468678999e-01 1.4641124069320480e+01 2.3957978604511425e+01 1.7192156142550395e+01 0 -1 0 +2669 2 3.4717046986472083e-01 1.5952070580594635e+01 2.9875827566246453e+01 1.8883612975171534e+01 0 0 0 +1901 2 3.5317885571686453e-01 1.4822065551027405e+01 3.0854677505537257e+01 1.6477916041192977e+01 0 -1 0 +1136 2 4.0767392731456431e-01 2.6442879725683227e+01 1.5660008620575594e+01 2.8388589670819208e+01 0 0 -1 +1176 2 3.9978903776553631e-01 1.6613533320728646e+01 2.8201931388980782e+01 2.2813638686767995e+01 0 0 -1 +1174 1 -7.1174938226555085e-01 1.5872914593859974e+01 2.7707197555882992e+01 2.3184198145441943e+01 0 0 -1 +1286 2 3.4628438558018088e-01 1.3704448050920417e+01 2.4838717995177532e+01 2.3350832111526049e+01 0 0 0 +1175 2 3.8363519506068650e-01 1.5078492004653695e+01 2.8150711279424037e+01 2.2899483423447752e+01 0 0 -1 +1651 1 -7.8285060938598927e-01 4.4194403360896963e+00 3.0887922791398800e+01 2.3466532786569424e+01 0 -1 0 +626 2 3.9621845435720282e-01 2.7847615437997295e+01 3.0501424331885072e+01 2.2180508767960035e+01 0 -1 -1 +1992 2 3.6051410708628318e-01 2.0626178995937018e+01 3.0100602719890823e+01 2.3131218091174588e+01 0 -1 0 +686 2 3.7421055410712623e-01 2.3659852309891750e+01 3.0028143307556778e+01 1.8342547479037314e+01 0 -1 0 +2079 2 3.9583162780992048e-01 1.9723128741721968e+01 2.4988631778753060e+01 2.0407977996557332e+01 0 -1 0 +1932 2 3.4421227945259986e-01 2.1344207544968793e+01 2.7851226360959707e+01 2.1272955535337648e+01 0 -1 0 +2094 2 3.6354366099202706e-01 2.0173786607516888e+01 2.9422326227873164e+01 1.9269407748667831e+01 0 -1 0 +2085 2 3.8122818574191608e-01 1.8605509104893063e+01 2.3830764690561470e+01 2.0277565134432361e+01 0 -1 0 +1930 1 -7.1467213111077366e-01 2.1061847246342328e+01 2.6972145939373167e+01 2.0962496030190213e+01 0 -1 0 +2861 2 3.7137108517621442e-01 2.4010162127788433e+01 2.8885012400371821e+01 2.2101341853608798e+01 0 0 0 +1493 2 3.1921227646168970e-01 2.1941377844299840e+01 2.6041777970915742e+01 1.6078635848747432e+01 0 0 0 +2645 2 3.7965892203550533e-01 2.1310205260161514e+01 2.3565953570186085e+01 2.0756286030596012e+01 0 0 0 +2646 2 3.5161030539515398e-01 2.1820045308662191e+01 2.3535148380306374e+01 1.9184269218590966e+01 0 0 0 +2644 1 -7.1520438057815272e-01 2.1191335657157019e+01 2.3965552173549941e+01 1.9868811349623044e+01 0 0 0 +2000 2 3.1274855451952654e-01 2.2624599183228213e+01 2.6435976023384825e+01 1.7772537425430986e+01 0 -1 0 +2001 2 3.6783470505669036e-01 2.2505073076895595e+01 2.5088515871338409e+01 1.8459579740222669e+01 0 -1 0 +1999 1 -7.3642715313987328e-01 2.2887589255464917e+01 2.5970513611562644e+01 1.8578068888355745e+01 0 -1 0 +1501 1 -6.9287330548869552e-01 2.0836175516565266e+01 2.5384126095132398e+01 2.3299606156038639e+01 -1 -1 0 +1503 2 3.7331495611030308e-01 2.0789067022777637e+01 2.5767747167377664e+01 2.2398845118656855e+01 -1 -1 0 +87 2 3.8326523475718316e-01 2.4548780893894236e+01 2.5925905445403366e+01 1.9298195248266229e+01 -1 0 0 +714 2 3.6404874289258238e-01 2.2611542123142179e+01 2.9062648080099102e+01 1.6401000149738167e+01 0 -1 0 +1494 2 3.6072749688955152e-01 2.1849896753612629e+01 2.4555361021431327e+01 1.6572136572799668e+01 0 0 0 +1492 1 -7.3316391226676914e-01 2.1376452327114844e+01 2.5236755111693732e+01 1.6013729069238671e+01 0 0 0 +712 1 -7.6409342265939650e-01 2.2275477138770068e+01 2.8254020254038011e+01 1.5978890268152776e+01 0 -1 0 +1502 2 3.2750900876334710e-01 2.1854605585089143e+01 2.5496881375028856e+01 2.3527282653141938e+01 -1 -1 0 +1979 2 3.5852533808203746e-01 2.1799106933111819e+01 2.6740398500441689e+01 2.0401528248955636e+01 0 -1 0 +788 2 3.6507823480155110e-01 6.4987601079497761e+00 1.5912072241343145e+01 2.7219369238076688e+01 0 0 -1 +940 1 -7.5993433492151319e-01 9.4971805038864261e+00 2.3359367531046708e+01 1.6091599198667009e+01 0 0 0 +1477 1 -7.1577442377359546e-01 2.3053780979927641e+01 2.8890241959665630e+01 2.2208804037335931e+01 0 0 0 +2092 1 -7.5466715536911633e-01 2.0846215571218774e+01 3.0087135731962384e+01 1.9428012576765440e+01 0 -1 0 +1884 2 3.5873098249391222e-01 2.0613278823251694e+01 2.8033346049140139e+01 1.6555712592891147e+01 0 -1 0 +2093 2 3.5280392882267042e-01 2.1063815814163046e+01 3.0163670223973018e+01 2.0433479183754347e+01 0 -1 0 +2660 2 3.5286436995863907e-01 2.7487043461046728e+01 1.5571799794734668e+01 2.2627831911794022e+01 0 0 0 +1334 2 2.7821251700341615e-01 2.6832516560421453e+01 2.0818061555282569e+01 3.0764535328747993e+01 0 0 -1 +1487 2 3.4957869916832085e-01 2.9561919775415696e+01 3.0500099929317116e+01 1.5755978158247848e+01 0 0 0 +1764 2 3.5788303295335155e-01 1.6073523692620853e+01 2.1330068963384001e+01 1.5693728250753868e+01 0 0 0 +2251 1 -6.5790732008145958e-01 2.7060622111411480e+01 2.3138700873311208e+01 2.2664690476658780e+01 -1 0 0 +1312 1 -7.3031361001199424e-01 2.5070922222013131e+01 3.0006153655259908e+01 1.9220975369543176e+01 0 0 0 +1313 2 3.5012392042868484e-01 2.5663626027006142e+01 2.9716243149321699e+01 1.8394812199552447e+01 0 0 0 +1425 2 3.7723369047906075e-01 2.8704011049145159e+01 2.8681496250141464e+01 1.8905034529406556e+01 0 -1 0 +1423 1 -7.6388720290780832e-01 2.9459068497605028e+01 2.8458150964772159e+01 1.9529336963744697e+01 0 -1 0 +2859 2 3.3898463393995498e-01 2.4412946085468128e+01 2.5266811427507651e+01 2.2706451280232127e+01 0 0 0 +1314 2 3.9911783707008580e-01 2.5230358647721125e+01 2.9296964356321265e+01 1.9878087884485009e+01 0 0 0 +85 1 -7.2176281150996591e-01 2.5501815796869369e+01 2.5912885136275552e+01 1.9550462972877664e+01 -1 0 0 +86 2 3.7828471673898134e-01 2.5977024907606967e+01 2.6044837885169201e+01 1.8729185148217773e+01 -1 0 0 +2857 1 -7.1861125738522080e-01 2.4810140820814162e+01 2.4609540156158999e+01 2.2135171478698584e+01 0 0 0 +2858 2 3.5289203010979869e-01 2.5210821844548992e+01 2.5198328136581399e+01 2.1434880036131528e+01 0 0 0 +2860 1 -7.5285457172525971e-01 2.5601738315333559e+01 2.8319951749867720e+01 2.1315971798595246e+01 0 0 0 +2329 1 -7.1587306170789655e-01 1.2745333444452337e+01 3.0713852883838449e+01 2.8991351654586076e+01 0 0 0 +210 2 3.6226682833164664e-01 1.4143902594545324e+01 1.9423887559536048e+01 3.0612047887587707e+01 0 -1 -1 +2959 1 -7.3013535989558320e-01 3.0237182633524661e+01 2.5890023663243380e+01 1.9740863231399143e+01 0 0 0 +2960 2 3.5622862537414779e-01 3.0299131846153013e+01 2.5693359166793037e+01 2.0688122868310288e+01 0 0 0 +1257 2 3.5933204238177729e-01 2.5657296690931656e+01 2.7455889667437290e+01 2.0917270722460326e+01 0 0 0 +2862 2 3.7250045307840729e-01 2.6255280745453227e+01 2.8288700086652774e+01 2.2064979665634123e+01 0 0 0 +1922 2 3.4362641349359224e-01 2.6976547696003230e+01 2.6801524385294677e+01 1.6077574805213192e+01 0 -1 0 +655 1 -7.3923104617492019e-01 2.8532214575804154e+01 2.4786964313114087e+01 1.7945087656029163e+01 0 0 0 +2961 2 3.8798185001293345e-01 3.0122827747604592e+01 2.6862559208414233e+01 1.9598814034183825e+01 0 0 0 +1239 2 3.4811734015773615e-01 2.9401706320264012e+01 2.5196281784305587e+01 1.6473066862725489e+01 0 0 0 +1980 2 3.5305149377366718e-01 2.5905406120992328e+01 2.5790280102005948e+01 1.6219988346805874e+01 0 -1 0 +2828 2 3.9278023582779725e-01 2.7598890178238655e+01 2.3144953493614747e+01 1.8505526299270542e+01 0 0 0 +1989 2 3.4454112243938917e-01 3.0076554704847812e+01 2.6633317441455134e+01 2.2689203245614717e+01 0 -1 0 +1978 1 -7.6844919196992867e-01 2.6583171425421828e+01 2.6293726405368989e+01 1.6752193747778342e+01 0 -1 0 +2885 2 3.9118904723554615e-01 2.8359710255059280e+01 2.7730344669396558e+01 2.2859672370126003e+01 0 0 0 +656 2 3.9255638374308610e-01 2.9045824561554294e+01 2.5362944038839306e+01 1.8596145177741722e+01 0 0 0 +657 2 3.7129585855316388e-01 2.7893426569355885e+01 2.5397429958062208e+01 1.7541061765761540e+01 0 0 0 +2884 1 -7.3268410251980332e-01 2.7413006812704335e+01 2.7529314741846104e+01 2.3251247739875684e+01 0 0 0 +1948 1 -7.4953320836361537e-01 2.8122726365632381e+01 3.0850868487460112e+01 2.7573055039574019e+01 0 -1 0 +1385 2 3.3269047709986116e-01 2.6842454196208301e+01 2.8600625368696640e+01 1.6957790706377303e+01 0 0 0 +1384 1 -7.1975854813490003e-01 2.7167743036007774e+01 2.9237737336757228e+01 1.7610578135538887e+01 0 0 0 +2253 2 3.8404855165492230e-01 2.6250991974089555e+01 2.3689503084155746e+01 2.2698207350136617e+01 -1 0 0 +1990 1 -7.5799876694940427e-01 2.0310033339867175e+01 3.0558379448676224e+01 2.2290969717053880e+01 0 -1 0 +504 2 3.2915485874146866e-01 2.7263663448182932e+01 3.0494235989220375e+01 2.7481866585701230e+01 0 -1 -1 +2947 1 -7.3195509874969900e-01 2.6441829801977150e+01 2.5826687157912477e+01 2.5428823592552760e+01 0 0 0 +1424 2 3.9331289744865816e-01 2.9214220635044462e+01 2.8921798538790245e+01 2.0328427778120837e+01 0 -1 0 +2886 2 3.7960746802718409e-01 2.7191708866374935e+01 2.8239158756923270e+01 2.3829865930469452e+01 0 0 0 +1237 1 -7.3117183968274879e-01 2.9918237329244480e+01 2.5592796656982234e+01 1.5666137887588182e+01 0 0 0 +1952 2 3.7923751450845622e-01 2.0907546181404513e+01 1.6385037666537183e+01 1.8589971419953056e+01 0 0 0 +2952 2 3.8170399981523723e-01 2.8453831402895418e+01 3.0346460350421467e+01 2.8318315062606668e+01 0 0 0 +2982 2 3.5160848176065723e-01 2.1433520797686438e+00 1.9570177324108638e+01 2.3107669594727223e+01 1 0 0 +738 2 3.3881585883435528e-01 4.3942328605555732e+00 3.0940415646398296e+01 1.7571086406364834e+01 1 0 0 +2527 1 -7.2698607350615241e-01 2.3196844427726404e+00 2.8597361533093011e+01 3.0511378841156507e+01 0 0 0 +2385 2 3.8112394632777896e-01 2.9961022611046481e+01 3.0046928320472791e+01 2.9583730813162237e+01 -1 0 0 +2425 1 -7.1482193954971462e-01 3.3532621097783730e+00 1.9839960179927040e+01 3.0697845470502060e+01 0 0 0 +2044 1 -7.6541947644699238e-01 2.4080883844593615e+00 1.6570250945378213e+01 2.6274366783401948e+01 0 0 0 +2349 2 3.4925697880558282e-01 4.2177899621053410e+00 1.8625834447867678e+01 2.8263978262672715e+01 0 0 0 +1670 2 3.5537701753545869e-01 4.3957175266996851e+00 1.8261981054295262e+01 2.4220414729432971e+01 0 0 0 +2993 2 3.5601728201365512e-01 5.9966209851872598e+00 2.1505486325908254e+01 2.9316820119416924e+01 1 0 0 +2185 1 -7.2026698964259472e-01 5.9251447342090566e+00 2.1302848211743100e+01 3.0255932247279645e+01 1 -1 0 +2427 2 3.7781551298825800e-01 3.2391788583891357e+00 1.9129839771225384e+01 3.0004605488449087e+01 0 0 0 +2186 2 3.8086033796125646e-01 5.1316614119440169e+00 2.0823693620839357e+01 3.0628727699587035e+01 1 -1 0 +662 2 3.7040438123801894e-01 5.6057775253857596e+00 2.1244164183074147e+01 2.7714058504464710e+01 1 0 -1 +1669 1 -7.7973807097322501e-01 3.7105665137867598e+00 1.8465511511109611e+01 2.4917478135107892e+01 0 0 0 +661 1 -7.4345978647853916e-01 5.4534343238070910e+00 2.2178300475985267e+01 2.7535137116941208e+01 1 0 -1 +1671 2 3.7906399431028182e-01 3.6035188306125527e+00 1.9407400904731173e+01 2.5080826225205467e+01 0 0 0 +639 2 3.4775917502865855e-01 5.0086058037080203e+00 2.1304207456058961e+01 2.5805251422869500e+01 1 0 -1 +638 2 3.7575797283131918e-01 4.8161222937691592e+00 2.1373822266418401e+01 2.4186793679858802e+01 1 0 -1 +2609 2 3.6207718172912584e-01 2.5653745886657213e+00 1.7346433081956352e+01 2.5687148876610067e+01 0 0 0 +637 1 -7.5029474511640637e-01 4.3746138153245155e+00 2.1132142902691289e+01 2.5054344794489687e+01 1 0 -1 +1781 2 3.7299382573261469e-01 1.5271124588344611e+00 2.2359489900499078e+01 2.7318293041670938e+01 0 0 0 +1782 2 3.4965800040112033e-01 4.0408778846199250e-01 2.2811477995160018e+01 2.6495021835586197e+01 0 0 0 +1780 1 -6.6727446371460963e-01 7.6765915283417141e-01 2.1982486223802791e+01 2.6826298420496851e+01 0 0 0 +8 2 4.0004543789923119e-01 3.7389007622466433e+00 2.2956485676150958e+01 2.4736635630508982e+01 0 -1 -1 +2373 2 3.4132676429244602e-01 2.2320075841095659e+00 1.7572741224824838e+01 2.3968808897901820e+01 0 0 0 +2347 1 -6.9994644078339785e-01 3.2585968610693312e+00 1.8514001117853020e+01 2.8126629022433701e+01 0 0 0 +663 2 3.8517369262463574e-01 6.2863239824351833e+00 2.2550862664264713e+01 2.7125988994371482e+01 1 0 -1 +2985 2 3.5959307243929090e-01 2.7533647909566361e+00 2.0801544070023564e+01 2.3695961648486293e+01 1 0 0 +2980 1 -7.2435082162749465e-01 1.9530433639087641e+00 2.0497439297340019e+01 2.3255410862279671e+01 1 0 0 +2348 2 3.9242028395195871e-01 3.2298511116835784e+00 1.7896940828707912e+01 2.7452545440331555e+01 0 0 0 +1332 2 3.7557528071718405e-01 2.3335505391886112e+01 2.7170785156078885e+01 2.4806508931105750e+01 0 0 -1 +2970 2 3.6688522164120557e-01 2.1392287851070968e-01 1.6775029319005199e+01 2.8400191754781204e+01 1 0 0 +1164 2 3.7203740054446527e-01 2.3420702508344302e+01 1.5916410685922342e+01 2.7892214141606132e+01 0 0 -1 +877 1 -7.2797792673171768e-01 2.7326507547330130e+00 2.3122953324870057e+01 2.8587166585888376e+01 0 0 -1 +1373 2 3.7454744342175622e-01 3.5294120548527474e+00 2.2758599641007351e+01 2.8177262459028825e+01 1 0 -1 +878 2 3.4533057748804208e-01 2.7299791782970173e+00 2.2789702867485666e+01 2.9454504281095979e+01 0 0 -1 +1855 1 -7.4413045278774148e-01 2.0109463741570114e+01 2.8384278303775087e+01 3.0775028429911707e+01 0 -1 0 +789 2 3.2201335287888250e-01 8.0366521987961370e+00 1.6295480587007585e+01 2.6943826305270736e+01 0 0 -1 +1008 2 3.6199647950362324e-01 1.1433061008357118e+01 2.0584924781475298e+01 2.4739606332638903e+01 0 0 -1 +1007 2 3.3963757848030784e-01 1.1848870115635458e+01 1.9859120995618696e+01 2.6036267103374858e+01 0 0 -1 +2046 2 3.7504334709875575e-01 1.6784148202346003e+00 1.6097212511656824e+01 2.5866521603033110e+01 0 0 0 +1368 2 3.5296855135188632e-01 2.6786486543256075e+01 2.9770869533580811e+01 2.5853573431031720e+01 0 0 -1 +854 2 3.6495895283248919e-01 1.0286963693574066e+01 1.6226732856398215e+01 2.7079333688374668e+01 0 0 -1 +2580 2 3.7666573385358160e-01 8.0818711634162241e+00 1.9557816392836582e+01 3.0249395448745599e+01 0 0 0 +2984 2 3.4942380265166256e-01 7.3056665123708395e+00 2.4380438677743957e+01 2.9776738135504704e+01 1 0 0 +787 1 -7.1655311593151649e-01 7.1150450095111992e+00 1.6645050808161916e+01 2.6734791315587966e+01 0 0 -1 +2372 2 3.2708739682564875e-01 5.0403624953012516e+00 1.9460215584045418e+01 2.6762566269908149e+01 0 0 0 +2933 2 3.6884964838213624e-01 6.2588127909998352e+00 1.8712568461369344e+01 2.7358088496745232e+01 1 0 0 +2371 1 -7.6084226326464821e-01 5.7205299563339622e+00 1.9502373901037121e+01 2.7485782073226098e+01 0 0 0 +2579 2 3.7101854074803220e-01 7.3931112197157898e+00 1.9412394060699523e+01 2.8883205652423072e+01 0 0 0 +816 2 3.6774779926751000e-01 9.4885281301581639e+00 2.0502346966278203e+01 2.6628657758632169e+01 0 0 -1 +814 1 -7.4049522540214852e-01 8.9900266550976813e+00 2.0373456443070861e+01 2.7417177277438903e+01 0 0 -1 +1006 1 -7.4730406840951236e-01 1.1097194937958344e+01 2.0016171171720160e+01 2.5430917037415238e+01 0 0 -1 +815 2 3.5102478765766632e-01 9.6899271298978391e+00 2.0409386983556040e+01 2.8102725733044746e+01 0 0 -1 +929 2 3.5755448360355291e-01 1.2546024301591041e+01 2.0845001726412651e+01 2.8344045518432125e+01 0 0 -1 +2517 2 3.6053355160253997e-01 8.4146087133532834e+00 1.8066566043726258e+01 2.5923904072527709e+01 0 0 0 +2516 2 3.4208952252192504e-01 9.2010884982553840e+00 1.9021930393649431e+01 2.5203628674164495e+01 0 0 0 +2515 1 -6.8006417961155186e-01 8.3528672536724606e+00 1.8612341393371388e+01 2.5136481650863537e+01 0 0 0 +928 1 -7.4850589529028377e-01 1.1671665128308016e+01 2.0545031197013902e+01 2.8559542782304217e+01 0 0 -1 +930 2 3.5951898378706293e-01 1.1589631713643650e+01 2.0699238047084538e+01 2.9503360926302939e+01 0 0 -1 +411 2 3.6526854477137383e-01 1.0645338564008624e+01 1.8898674590499819e+01 2.8282499080327316e+01 0 -1 -1 +409 1 -7.3779704757276465e-01 1.0766834302382104e+01 1.7944319338377518e+01 2.8103255051933751e+01 0 -1 -1 +270 2 4.0932337550909392e-01 8.1287106356269145e+00 2.3450734020607989e+01 2.7686443730116949e+01 0 0 -1 +268 1 -7.6334650286139838e-01 7.9717188740338152e+00 2.2791802523291700e+01 2.6972408292185314e+01 0 0 -1 +269 2 3.8850743812907546e-01 8.3507946121563723e+00 2.1871436925633514e+01 2.7166011096979176e+01 0 0 -1 +10 1 -7.4144922682737113e-01 1.2652418375462048e+01 2.3822356309873324e+01 2.9498822671200010e+01 0 -1 -1 +2578 1 -6.8685119850518728e-01 7.7546564097184811e+00 1.8883074033833029e+01 2.9632613543449569e+01 0 0 0 +277 1 -7.4706014041644864e-01 6.3301207185237756e+00 1.5872939889636022e+01 2.4321732661954936e+01 0 0 0 +1139 2 3.3703715380538052e-01 1.1492728536418293e+01 1.7905262033176264e+01 2.4808368934517500e+01 0 0 -1 +11 2 3.5868183038247675e-01 1.3261055176239545e+01 2.4501129818021180e+01 2.9929913633790228e+01 0 -1 -1 +279 2 3.9636694809602385e-01 6.6822072006268058e+00 1.6388886105691455e+01 2.5120445204020498e+01 0 0 0 +1845 2 4.0037342141108112e-01 7.9788801684986606e+00 2.3368313336261640e+01 2.5155337074150104e+01 0 -1 0 +969 2 3.7681680487321695e-01 1.0780364875361105e+01 1.6902594079348503e+01 2.9810591300870293e+01 0 0 -1 +967 1 -8.0341325939387198e-01 1.0920621920707132e+01 1.6408302649097482e+01 3.0592893380933546e+01 0 0 -1 +2020 1 -7.7720933259377167e-01 8.2167274088490192e+00 2.3526983558392313e+01 2.4273999926959096e+01 0 -1 0 +2330 2 3.1725450587772430e-01 1.3446069005233168e+01 3.0100047985129379e+01 2.9198445776585761e+01 0 0 0 +1562 2 4.0113596528416090e-01 6.7074618120947695e+00 1.8100496235919344e+01 3.0879391555179403e+01 0 0 0 +2340 2 3.4546254223701778e-01 2.6540877819908410e+01 3.0447579965943490e+01 3.0279007941670262e+01 -1 0 0 +2333 2 3.7427108553013344e-01 3.0312874408061170e+01 2.7955092532008830e+01 2.7083093710849329e+01 -1 0 0 +1838 2 3.6426806310453319e-01 2.7112712927454506e+01 2.5237078829455747e+01 2.9994996804296004e+01 -1 -1 0 +2921 2 3.6796808973412642e-01 2.4922742466873604e+01 1.7489024369484341e+01 1.5888872013393337e+01 0 0 0 +736 1 -7.4994288039603940e-01 4.4751578473554732e+00 3.0231809296514271e+01 1.6926561001074131e+01 1 0 0 +410 2 3.7103952897677045e-01 1.1700570944419812e+01 1.7907387620704849e+01 2.8072410962195082e+01 0 -1 -1 +2249 2 3.6271331741513041e-01 1.6047288290823513e+01 2.1465633278741688e+01 2.2290319722325474e+01 0 0 0 +2248 1 -7.5260699785787322e-01 1.5731104879424302e+01 2.0552829578736780e+01 2.2430334922013024e+01 0 0 0 +2804 2 3.4363111603013075e-01 1.4471450578665561e+01 2.1724211498166685e+01 2.3504168456583962e+01 0 0 0 +2803 1 -7.4214056675984197e-01 1.3740812956746506e+01 2.1922717519747298e+01 2.4070672139493468e+01 0 0 0 +2250 2 3.5142395968296219e-01 1.6129463650684603e+01 2.0248459053629599e+01 2.3317441670243696e+01 0 0 0 +2582 2 3.8977704893254450e-01 1.2861941248787465e+01 1.7812813146045013e+01 2.3995236909727296e+01 0 0 0 +563 2 3.5360806667720890e-01 1.5080638054134404e+01 1.8520850171831054e+01 2.5758444075542553e+01 0 0 0 +580 1 -7.1206380693296645e-01 1.5819259777887305e+01 3.0978924485328747e+01 2.6928838839147804e+01 0 -1 -1 +2581 1 -7.2464733914795854e-01 1.2072914091350238e+01 1.7310040258710867e+01 2.4319887671166473e+01 0 0 0 +2606 2 3.8488747493431397e-01 1.7223805320404139e+01 1.8751765336860593e+01 2.8549103739813059e+01 0 0 0 +2629 1 -7.1240331807136525e-01 1.3724090020591767e+01 1.7128619971024985e+01 2.8231056127148104e+01 0 0 0 +2630 2 3.9094337921919620e-01 1.4281730500596009e+01 1.6483114767839940e+01 2.7746463813392200e+01 0 0 0 +2607 2 3.9206192799752232e-01 1.6847408948963519e+01 1.7849259917193070e+01 2.7332766647667007e+01 0 0 0 +2631 2 3.9134762402389950e-01 1.4279825054977309e+01 1.7441650590514307e+01 2.8860695893539742e+01 0 0 0 +2763 2 3.7883083012660163e-01 1.4862849102273890e+01 2.1199087176219283e+01 2.7047873708804747e+01 0 0 0 +2610 2 3.8097877885246345e-01 1.4310294745680100e+01 2.1191642484291055e+01 2.5568789027123973e+01 0 0 0 +564 2 3.8620485995142811e-01 1.6334436071431139e+01 1.8209376617717730e+01 2.4885801605375711e+01 0 0 0 +562 1 -6.9442575926660211e-01 1.5960965023542474e+01 1.8000404601672813e+01 2.5681609184661667e+01 0 0 0 +1993 1 -7.8544544675307293e-01 1.7438500911029035e+01 1.9461175578395899e+01 2.4088072177965216e+01 0 -1 0 +1995 2 3.6610933987576810e-01 1.7858694438469321e+01 1.9743094768525580e+01 2.4957071043448625e+01 0 -1 0 +1994 2 3.8039387092930027e-01 1.8053146063622791e+01 1.9757759414042464e+01 2.3452471451239436e+01 0 -1 0 +2608 1 -6.9546497224632975e-01 1.4427363092491850e+01 2.0614043292949013e+01 2.6354243067334536e+01 0 0 0 +2605 1 -7.0024437477443791e-01 1.7089106746636350e+01 1.7781850141267849e+01 2.8280314037135241e+01 0 0 0 +470 2 3.4606186412457152e-01 1.6607238470069163e+01 2.1272678734434784e+01 2.8979620400158684e+01 0 0 -1 +471 2 3.8486238589398858e-01 1.8010319637759057e+01 2.0559641968183449e+01 2.9183181282864364e+01 0 0 -1 +469 1 -7.5831135526856086e-01 1.7013760232937795e+01 2.0417007679385165e+01 2.9221752671395731e+01 0 0 -1 +1810 1 -6.8899465113569558e-01 1.7911312854825663e+01 1.6412749962375969e+01 2.3513700999536169e+01 0 -1 0 +2771 2 3.7489250165045396e-01 1.8493762769375266e+01 1.6714324027319922e+01 2.8490710819456293e+01 0 0 0 +204 2 3.6041723731107411e-01 1.5442314737664583e+01 1.9466709597492596e+01 3.0037712119166141e+01 0 -1 -1 +208 1 -7.2934340302405676e-01 1.4871228020502002e+01 1.8824698229469004e+01 3.0484373772147251e+01 0 -1 -1 +1366 1 -7.4613125621415322e-01 2.6643465478865014e+01 2.9872579896477610e+01 2.4914848573997180e+01 0 0 -1 +1147 1 -7.5456616405851118e-01 2.4163657367115821e+01 1.6259721158965124e+01 2.3377254583738907e+01 0 0 -1 +2964 2 3.6279463005322188e-01 2.4298622883527816e+01 1.6542279311060948e+01 2.5095159947458509e+01 0 0 0 +2770 1 -7.7205724521821151e-01 1.9427531126532596e+01 1.6342768478911413e+01 2.8787123080373348e+01 0 0 0 +2772 2 3.6390852749045111e-01 1.9248788262341225e+01 1.5861972063849548e+01 2.9589690494124500e+01 0 0 0 +2692 1 -7.3114909635428738e-01 2.4990018061830138e+01 2.3585327886121178e+01 2.6797083651917649e+01 0 0 0 +424 1 -7.2929243113180064e-01 2.1239111080180553e+01 1.8939714610065902e+01 3.0062136047596304e+01 0 0 -1 +426 2 4.1507469421731258e-01 2.0759460028566689e+01 1.9761222262362434e+01 3.0087046903840445e+01 0 0 -1 +1301 2 4.0909015601880788e-01 2.0767657987657248e+01 1.8167735872840655e+01 2.3088357058105732e+01 0 0 0 +447 2 3.6191683487441856e-01 2.4868176168858252e+01 1.7637350263868818e+01 2.9233546595072163e+01 0 0 -1 +1169 2 3.5321442406942771e-01 2.0277735005661945e+01 2.0606302196555387e+01 2.6436307245565981e+01 0 0 -1 +421 1 -6.7318672714800865e-01 1.9429796533662035e+01 2.0122675620520248e+01 2.6266337750176962e+01 0 -1 -1 +423 2 3.2409281002149115e-01 1.9884268339156151e+01 1.9303723181849239e+01 2.5886815017702389e+01 0 -1 -1 +2765 2 3.5381083906999028e-01 2.0505030447930626e+01 1.7688359823121470e+01 2.5712955095425375e+01 0 0 0 +2764 1 -7.5695650025452821e-01 2.0398911189531699e+01 1.7533166422233943e+01 2.4798122794444140e+01 0 0 0 +2766 2 3.8334976508300433e-01 2.0683086237215296e+01 1.6572826079878492e+01 2.4694602340485581e+01 0 0 0 +2739 2 3.8092389943616745e-01 2.0598879023088998e+01 1.7308868782891839e+01 2.7904348744792323e+01 0 0 0 +2737 1 -7.5949639804443092e-01 2.1237717472622915e+01 1.7984561023148117e+01 2.7588141215097284e+01 0 0 0 +2800 1 -7.6863444694662719e-01 1.9762401024159434e+01 2.0920727819452814e+01 2.9158192822963130e+01 0 0 0 +2962 1 -7.2012821007221539e-01 2.4782289513233604e+01 1.7161592013255284e+01 2.5759584365449108e+01 0 0 0 +2963 2 3.9475884974624215e-01 2.4642101980632091e+01 1.8152731193999116e+01 2.5386051097155971e+01 0 0 0 +2200 1 -7.0806354251879322e-01 2.4803482404097416e+01 1.9573007909627194e+01 2.4639957992118209e+01 0 0 0 +2202 2 3.5398416735722610e-01 2.5208295664395344e+01 2.0065017129635752e+01 2.5355732899804082e+01 0 0 0 +1345 1 -7.4077799166676994e-01 2.4337151889574532e+01 2.0976359468170397e+01 2.7482560070454834e+01 0 0 0 +2738 2 3.5382670487519752e-01 2.2154171455854229e+01 1.7571991838633284e+01 2.7621612234553314e+01 0 0 0 +1347 2 3.5767944889164582e-01 2.4098675887539958e+01 2.1058088172753649e+01 2.8429073543605433e+01 0 0 0 +2890 1 -7.1134171079813080e-01 2.3948994068967480e+01 2.1768390795138274e+01 3.0239052543182453e+01 0 0 0 +2194 1 -7.7005533830644213e-01 2.1593578849022897e+01 2.1909665487347979e+01 2.7150936207444126e+01 0 -1 0 +2801 2 3.7680248718311998e-01 1.9753315877993963e+01 2.1850851090497795e+01 2.9250284169925031e+01 0 0 0 +2802 2 3.7775311204537776e-01 2.0088431299985153e+01 2.0835141653967284e+01 2.8262560503447393e+01 0 0 0 +1931 2 3.7340981769755499e-01 2.2481048550654055e+01 2.1634913462016630e+01 2.7334322781005660e+01 0 -1 0 +425 2 3.7733790477895340e-01 2.1341562748922446e+01 1.8715140346393170e+01 2.9035597074486233e+01 0 0 -1 +1520 2 3.5081941354284474e-01 2.8604862763264908e+01 2.6064968730485209e+01 3.0012145223389343e+01 -1 -1 0 +1163 2 3.5123299324139184e-01 2.4218545706233790e+01 1.7177471664828058e+01 2.7344628742021239e+01 0 0 -1 +2195 2 3.7191712074675409e-01 2.1641294437109263e+01 2.2553720625071406e+01 2.6358006779170779e+01 0 -1 0 +2787 2 3.7900832422832464e-01 2.1357955026866012e+01 2.3358944425225616e+01 2.8043798120570020e+01 0 0 0 +1162 1 -7.7294150906629944e-01 2.3738793405157892e+01 1.6793835797848175e+01 2.8183931456706201e+01 0 0 -1 +777 2 3.6526099881417373e-01 2.9291447506110003e+01 1.9633422795007050e+01 3.0227173720571582e+01 -1 0 -1 +2948 2 3.3876707305675657e-01 2.5840550746034133e+01 2.6563734313338895e+01 2.5634148093608594e+01 0 0 0 +1519 1 -7.4423344612837405e-01 2.8566053943919371e+01 2.5389228152121881e+01 2.9231470426526773e+01 -1 -1 0 +2892 2 3.4394128628595089e-01 2.7411376064331339e+01 1.8548164515244540e+01 3.0704759839983378e+01 0 0 0 +2891 2 3.1500274960369046e-01 2.4942839275197503e+01 2.1683154869679498e+01 3.0248557032862443e+01 0 0 0 +445 1 -7.2055742434151882e-01 2.5453325969256660e+01 1.8201205864971534e+01 2.9922644033042840e+01 0 0 -1 +1346 2 3.7426422957622152e-01 2.4777820535855341e+01 2.1777859132828794e+01 2.7157887994497667e+01 0 0 0 +1959 2 3.5676757844118456e-01 2.5955744968716498e+01 1.8830190125656461e+01 2.9401250695427361e+01 0 0 0 +2778 2 3.3240223367030014e-01 2.5653419504413105e+01 1.5905306876794777e+01 2.7091852749206318e+01 0 0 0 +2969 2 3.6140904145656000e-01 3.0371147281621667e+01 1.7962524420357099e+01 2.8442466939553253e+01 0 0 0 +1759 1 -7.0207241864620085e-01 2.6803821166335151e+01 1.9902731058748088e+01 2.8047471868469973e+01 0 0 0 +1761 2 3.3033621077096037e-01 2.6146036844911823e+01 2.0376170066351857e+01 2.7486409083193607e+01 0 0 0 +2201 2 3.7114937986094171e-01 2.5492265507516144e+01 1.9491449559574850e+01 2.3980633814947911e+01 0 0 0 +2852 2 3.8642713804367368e-01 3.0292001594240364e+01 2.0568454834328030e+01 2.6273874260723719e+01 0 0 0 +2851 1 -7.1396659452734812e-01 2.9781360737889816e+01 1.9760783830209274e+01 2.6173936849067317e+01 0 0 0 +2853 2 3.6259541874575191e-01 2.9856612523789366e+01 1.9371806996527081e+01 2.7002171787561632e+01 0 0 0 +1760 2 3.3584733374450615e-01 2.7063943447771521e+01 2.0579588662236208e+01 2.8739497742062330e+01 0 0 0 +2873 2 3.8156420091352133e-01 2.8303034274005881e+01 1.8810809494973025e+01 2.3592363344886095e+01 0 0 0 +2377 1 -7.7285998145380552e-01 2.7411198341751980e+01 1.8610465274165609e+01 2.3509268190818457e+01 -1 0 0 +2368 1 -7.4133803164839684e-01 3.0071042992031234e+01 1.7172635406489047e+01 2.5360360610992696e+01 -1 0 0 +1411 1 -7.0726184327607333e-01 2.9703089302358126e+01 2.2688212790944046e+01 2.9781736784407720e+01 0 1 -1 +2378 2 3.6741168961987092e-01 2.7325458878714954e+01 1.7854217822780477e+01 2.2924957783030532e+01 -1 0 0 +1413 2 3.4035912367261106e-01 2.8906208759675490e+01 2.2121840792563646e+01 2.9850792566144921e+01 0 1 -1 +2366 2 3.6557559721913407e-01 2.7846204052099736e+01 2.0623467579608405e+01 2.4661950593140830e+01 -1 0 0 +1412 2 3.7429572264244859e-01 2.9997367793858011e+01 2.2785128819122058e+01 3.0713338178886954e+01 0 1 -1 +1333 1 -7.5236688755738135e-01 2.7027778479900594e+01 2.1701169214954394e+01 3.0363360727079922e+01 0 0 -1 +2370 2 3.8938617284034410e-01 2.9791141378046454e+01 1.8065002579796118e+01 2.5164060641733553e+01 -1 0 0 +2365 1 -7.0341069822843671e-01 2.7292999694524205e+01 2.1051650997946986e+01 2.5299927111788076e+01 -1 0 0 +2367 2 3.5931050852613372e-01 2.7202886627774667e+01 2.0591058063121025e+01 2.6141104189896701e+01 -1 0 0 +1081 1 -7.2623026523966339e-01 1.0359708259632736e+01 2.5754602836530488e+01 3.0597181989901138e+01 0 0 -1 +2369 2 3.8601335417491206e-01 3.0184442787734234e+01 1.7122241626572624e+01 2.6392827528273283e+01 -1 0 0 +2151 2 3.5893200566606132e-01 2.9853835223179420e+01 2.0775184427352997e+01 2.9358028437581574e+01 0 0 0 +2968 1 -7.0585150738382718e-01 3.0415294278882868e+01 1.7061252469570523e+01 2.8049592201235807e+01 0 0 0 +2252 2 3.3233735956158739e-01 2.7135265159528309e+01 2.2677530133245838e+01 2.3586960967350421e+01 -1 0 0 +775 1 -7.1814401310402909e-01 2.9918594119506444e+01 1.9839242677151031e+01 2.9430222869433294e+01 -1 0 -1 +1882 1 -7.2962295169510083e-01 1.9766300369619930e+01 2.7484739766634636e+01 1.6840089774999381e+01 0 -1 0 +2363 2 3.9183006922419689e-01 3.0839120732604822e+01 1.5524605227580697e+01 2.5368644947236863e+01 -1 0 0 +1988 2 3.6340908240412312e-01 3.0967276367153293e+01 2.7788527741365566e+01 2.3146059568728401e+01 0 -1 0 +1554 2 3.5062160154457800e-01 2.1164725943631124e+00 2.7678281093954819e+01 2.4448838860822121e+01 0 -1 0 +1552 1 -7.5913021673515657e-01 1.9530853219502355e+00 2.7658148697066434e+01 2.3496036916015548e+01 0 -1 0 +2617 1 -7.1264602361352236e-01 1.5842973009205968e-01 2.8313015250304193e+01 2.7375141368128162e+01 0 0 0 +1383 2 3.4875302711310585e-01 1.4474008158954297e+00 2.4172295651312034e+01 2.4966607673459713e+01 1 0 -1 +1483 1 -7.6320194121864704e-01 2.5453294539634537e+00 2.9521571381169366e+01 2.6039842449803501e+01 1 0 0 +1611 2 3.5863197081729287e-01 3.6205108526375840e+00 3.0060441539693148e+01 2.7362278849312919e+01 0 -1 0 +7 1 -7.5409262646562625e-01 3.3900185909921507e+00 2.3823035607086346e+01 2.4742428461570352e+01 0 -1 -1 +992 2 3.7610283904537362e-01 7.4047158409418379e-01 2.4993492128150478e+01 2.6937442204874170e+01 0 0 -1 +1381 1 -7.0217098583733417e-01 4.5520265359593814e-01 2.4391166630035702e+01 2.5003301853567422e+01 1 0 -1 +9 2 3.7975874120524844e-01 3.9878364961086796e+00 2.4416407729365705e+01 2.5299613634629868e+01 0 -1 -1 +2988 2 3.6537032146765108e-01 5.3630589197478207e+00 2.6674288377103551e+01 2.5588961302343627e+01 1 0 0 +888 2 3.7320512175451920e-01 2.0259605386041040e+00 2.8989725874326989e+01 2.6643812594427295e+01 0 0 0 +1648 1 -6.8731347318196734e-01 4.3383930649571809e+00 2.6876900521866716e+01 2.8627980167180233e+01 0 -1 0 +1650 2 3.5035214020937255e-01 4.4602818424953181e+00 2.7800290571680282e+01 2.8974432396754139e+01 0 -1 0 +1485 2 3.7992839106175530e-01 2.0724564809390413e+00 3.0352605799639591e+01 2.6080167500462871e+01 1 0 0 +2986 1 -7.0517640356463918e-01 5.0520641376271467e+00 2.5868858529121702e+01 2.5993326509601506e+01 1 0 0 +2529 2 3.4380582257115677e-01 2.2785048511840382e+00 2.7600134441466800e+01 3.0465877467269781e+01 0 0 0 +1649 2 3.6993684073797140e-01 3.7866749124656991e+00 2.6503061020048609e+01 2.9334048146157194e+01 0 -1 0 +794 2 3.4907112031664300e-01 5.0334666622090438e+00 2.9699565783287376e+01 2.9453950022178201e+01 0 0 -1 +2528 2 3.2110433303502028e-01 3.2630215633260642e+00 2.8788177915042240e+01 3.0266879555696274e+01 0 0 0 +94 1 -7.3215244151473424e-01 5.4398947636738129e+00 2.8944232487265118e+01 2.9996847749942390e+01 0 0 -1 +1961 2 3.6720856359441328e-01 1.1058221646402345e+01 2.3018171575082601e+01 3.0437508092903503e+01 0 0 0 +96 2 3.6525225261484517e-01 6.3672541858607197e+00 2.8908676796345578e+01 2.9657490921514537e+01 0 0 -1 +1389 2 3.6840834067600892e-01 4.3452777825173037e+00 2.9298867914184569e+01 2.5621753667941775e+01 1 0 -1 +2942 2 3.8448109061175989e-01 5.1013602095786190e+00 2.6106041213995315e+01 2.6924039253064095e+01 1 -1 0 +1387 1 -7.2554241457730873e-01 5.2127084233274603e+00 2.8978618994196445e+01 2.5197873399463443e+01 1 0 -1 +2386 1 -7.7376847037950447e-01 2.6969910565227856e+01 2.8386413434994740e+01 3.0314562483857912e+01 -1 0 0 +793 1 -7.1460856800938677e-01 9.7591676489196044e-01 2.5523489704217855e+01 2.7659852576475188e+01 0 0 -1 +795 2 3.8577436027645262e-01 1.4825937931493596e+00 2.4955746313923022e+01 2.8220796550580239e+01 0 0 -1 +1388 2 3.6925195446831038e-01 5.1691797847700611e+00 2.9393746663623940e+01 2.4310500047171569e+01 1 0 -1 +2618 2 3.7121663015303408e-01 5.8782697787149829e-01 2.7432234349809995e+01 2.7603766565551126e+01 0 0 0 +1382 2 3.7990383263614713e-01 2.6443699335495163e-01 2.4767822202894063e+01 2.4144401120631628e+01 1 0 -1 +106 1 -7.0486890047044037e-01 2.7985788214763172e+00 2.5569580527672773e+01 3.0721585942445316e+01 0 -1 -1 +2191 1 -7.3083575291983516e-01 2.8704437797836427e+01 2.6894651490831347e+01 2.6734975656461348e+01 0 -1 0 +2694 2 3.6337366625768674e-01 2.5737670399612583e+01 2.4216796695439196e+01 2.6649687322663659e+01 0 0 0 +2176 1 -7.5613931522288169e-01 2.6762040473911160e+01 2.8483105591886680e+01 2.7605050075699619e+01 0 -1 0 +925 1 -7.2044071090621375e-01 1.1004842122560150e+01 3.0016032342643072e+01 2.3574561590193454e+01 0 0 0 +927 2 3.5110245458827566e-01 1.0466623919005164e+01 2.9355810372546408e+01 2.4065796143698797e+01 0 0 0 +779 2 3.6630765481385175e-01 8.6167900450400197e+00 2.8521014218489622e+01 2.3190577399418117e+01 0 0 0 +1535 2 3.4816152118132787e-01 7.0727241547640611e+00 2.8396433899465585e+01 2.2807856871500093e+01 0 -1 0 +2178 2 3.5675646291851237e-01 2.6856755211333482e+01 2.8666566478278924e+01 2.8626403150797390e+01 0 -1 0 +1534 1 -7.2079320399291869e-01 7.8709229505903080e+00 2.8881479574040327e+01 2.2696054936946226e+01 0 -1 0 +209 2 3.7890348180635819e-01 1.2096436414616607e+01 2.4283157202713589e+01 2.8853301925179338e+01 0 -1 -1 +1694 2 3.7520729136396180e-01 1.0953731572345454e+01 2.4580176926173490e+01 2.6777936550244700e+01 0 -1 0 +1693 1 -7.2028810897973572e-01 1.0715917823054868e+01 2.4721082239705062e+01 2.7764209730456109e+01 0 -1 0 +2483 2 3.8049307740787236e-01 6.8324288598040166e+00 2.9479525315165830e+01 2.5702964183565111e+01 0 0 0 +2983 1 -7.3414451880007303e-01 7.9875708816313775e+00 2.4463438658456099e+01 2.9096783413365394e+01 1 0 0 +2590 1 -7.2907085058343046e-01 1.0713225216098387e+01 2.8165099995967665e+01 2.9144048021431452e+01 0 0 0 +2022 2 3.7474215018716495e-01 7.9321816111131778e+00 2.4454649762766973e+01 2.4141189095730770e+01 0 -1 0 +2388 2 3.3855074313136202e-01 8.8410670268371678e+00 2.4523189780805186e+01 2.9687125346169363e+01 0 0 0 +778 1 -7.3530338721298338e-01 7.4537888540314698e+00 2.6201661620481389e+01 2.4328928176807235e+01 0 0 0 +95 2 3.5587007654712272e-01 6.6464886966388210e+00 2.6455432280956632e+01 2.3738958179300059e+01 0 0 -1 +780 2 3.6094472110162096e-01 8.1797419624579817e+00 2.6754160530349242e+01 2.4063336587493822e+01 0 0 0 +2351 2 3.7263350397852646e-01 1.2095558771593497e+01 2.6893517914914153e+01 2.8658514256147928e+01 0 0 0 +1900 1 -7.5017107106248870e-01 1.0047486607705302e+01 2.7297477414103192e+01 2.4106027791286110e+01 0 -1 0 +1902 2 3.7742380634974315e-01 1.0357768258223230e+01 2.6528225575362569e+01 2.4640372223980712e+01 0 -1 0 +2436 2 3.3064507514740132e-01 8.2323848658921044e+00 2.6245640125394928e+01 2.7666321339555154e+01 0 0 0 +2434 1 -7.6684558527022262e-01 8.6740245078306568e+00 2.6918569071689486e+01 2.7162793777667694e+01 0 0 0 +2435 2 3.6972965492390847e-01 8.2509188569067984e+00 2.6878450585816331e+01 2.6292718318792783e+01 0 0 0 +1713 2 3.6317368550040352e-01 9.9653952796582459e+00 2.5352711622882772e+01 2.7677101168969372e+01 0 -1 0 +2482 1 -6.6884895017431434e-01 7.7119215590855346e+00 2.9819988715105385e+01 2.5913585988215438e+01 0 0 0 +1768 1 -7.4820989217329548e-01 1.0806932376836187e+01 2.4697294621808201e+01 2.4999548897865250e+01 0 0 0 +2352 2 3.3682209783127309e-01 1.2465870149761788e+01 2.5664582375565605e+01 2.7903000497471627e+01 0 0 0 +986 2 3.6084021645724457e-01 8.2753706048266480e+00 2.8074798137637920e+01 2.8296011002168939e+01 0 0 -1 +985 1 -7.8115382437982284e-01 7.8739472659069119e+00 2.9015117011382625e+01 2.8528028459092397e+01 0 0 -1 +987 2 3.9002089906374315e-01 7.6985290404801940e+00 2.9413557581916631e+01 2.7637481126301328e+01 0 0 -1 +1316 2 3.5091206851755652e-01 1.7770036251770858e+01 2.8700256245078734e+01 1.5883152222774891e+01 0 0 0 +2350 1 -7.1253130897378247e-01 1.2814965956497741e+01 2.6557520855818161e+01 2.8070815413822476e+01 0 0 0 +2592 2 3.4110753363333102e-01 1.0030333530839522e+01 2.8107151557959874e+01 2.8417960549489454e+01 0 0 0 +1770 2 3.5170336486136156e-01 1.1513488860313641e+01 2.4656801810522989e+01 2.4286819711244870e+01 0 0 0 +606 2 3.6385264633856612e-01 9.1466917539784660e+00 3.0404332468949825e+01 2.8859181933473284e+01 0 -1 -1 +2591 2 3.7854329901120853e-01 1.0438083463654520e+01 2.7540518291983641e+01 2.9775168239414267e+01 0 0 0 +1620 2 3.3604212857084048e-01 6.0709212969241069e+00 2.6247420923327301e+01 1.5980916154775347e+01 0 -1 0 +2687 2 3.9087604956725852e-01 1.7622129756600057e+01 2.9928015108487546e+01 3.0079417920144522e+01 0 0 0 +1647 2 3.6075636633338520e-01 2.5235880987689036e+01 2.8038742066905233e+01 2.6646719148616551e+01 -1 -1 0 +1727 2 3.6764575340621874e-01 1.6452491471712243e+01 2.4081167199556990e+01 2.2777656890647606e+01 0 -1 0 +582 2 3.6831021773205630e-01 1.5549289163030222e+01 3.0201367488385721e+01 2.7417632738869521e+01 0 -1 -1 +823 1 -7.3516470270034551e-01 1.0035927205217823e+00 2.8118524429521937e+01 1.5676637337578386e+01 0 0 0 +2805 2 3.7391239590807357e-01 1.3538816278882962e+01 2.3684716482749010e+01 2.4326891292117342e+01 0 0 0 +2810 2 3.9093755993206647e-01 1.4014598370655994e+01 2.3023500339754261e+01 2.8639030381633468e+01 0 0 0 +2809 1 -7.3262781038372915e-01 1.4756960259799975e+01 2.2508609309234476e+01 2.8255141987300249e+01 0 0 0 +2190 2 3.6014914737506321e-01 1.5334509282582109e+01 2.3213266681974812e+01 2.7842344949930002e+01 0 -1 0 +2070 2 3.8882041488348895e-01 1.6553590010225371e+01 2.5286772999264638e+01 2.7442275352269800e+01 0 -1 0 +2002 1 -7.0378300403560734e-01 1.7129616940812923e+01 2.5389778301853571e+01 2.4275413345063487e+01 0 -1 0 +2003 2 3.8780752904161625e-01 1.6655070310705369e+01 2.6207382688531730e+01 2.3936863052330455e+01 0 -1 0 +2068 1 -7.2808066890463030e-01 1.6095334105090782e+01 2.4803547543770900e+01 2.6784206983098890e+01 0 -1 0 +1478 2 4.1761848612086006e-01 1.6254280242307647e+01 2.5075195163945317e+01 2.5934700912500176e+01 0 0 0 +2905 1 -7.1075187786685157e-01 1.4617800468373995e+01 2.5410815879726041e+01 3.0487900816105022e+01 0 0 0 +2906 2 3.7754294860194931e-01 1.4223248156640576e+01 2.6338978664063184e+01 3.0430746927634406e+01 0 0 0 +2572 1 -7.4531379502836315e-01 1.3546298381435944e+01 2.8095604635320178e+01 3.0502364202542847e+01 0 0 0 +384 2 3.5651215750392595e-01 1.3886508788719953e+01 2.9870827945273504e+01 2.4100047036607084e+01 0 -1 -1 +1285 1 -7.2050589708172608e-01 1.3511883500665618e+01 2.4681824286146849e+01 2.4301924947063576e+01 0 0 0 +1287 2 3.9328036995849186e-01 1.4036705975733248e+01 2.9008649365676227e+01 2.5465121929570358e+01 0 0 0 +382 1 -7.5527424873250282e-01 1.4117349154791070e+01 2.9941452563643050e+01 2.5081547463325599e+01 0 -1 -1 +2313 2 4.0458292355223296e-01 1.3659834686985018e+01 2.6447811829920681e+01 2.5044311700596946e+01 0 0 0 +1843 1 -7.3135402935307969e-01 1.3676724329591480e+01 2.7330696169100058e+01 2.5481621223302461e+01 0 -1 0 +1844 2 3.7595962128880162e-01 1.3557345164051824e+01 2.7180939481059948e+01 2.6412742230556990e+01 0 -1 0 +2057 2 3.6506409503807830e-01 1.7042007962283868e+01 2.7042214182468303e+01 2.9010314649618508e+01 0 0 0 +2058 2 3.4009653230409059e-01 1.7064597438359606e+01 2.5768114672953143e+01 2.9894780175783726e+01 0 0 0 +2056 1 -7.2199243227411480e-01 1.7325713749006116e+01 2.6102863001217031e+01 2.9065231302929991e+01 0 0 0 +387 2 3.3951229230480767e-01 1.4242415604477493e+01 2.8193928381198607e+01 2.7710812344400068e+01 0 -1 -1 +2524 1 -7.1540897185153074e-01 1.5088215211884521e+01 2.8346132092430032e+01 2.8163745691278145e+01 0 0 0 +2525 2 3.3713086907605433e-01 1.4908941862619400e+01 2.8028687490498818e+01 2.9120332366794937e+01 0 0 0 +2573 2 3.5737926522529234e-01 1.2760235703432556e+01 2.8621653619195200e+01 3.0370938938254547e+01 0 0 0 +2688 2 3.3244394654366038e-01 1.6467799768217787e+01 2.8971082726217151e+01 2.9575279074570702e+01 0 0 0 +1748 2 3.9932207221014837e-01 1.7943470010350762e+01 2.5823004247923688e+01 2.4619943642054714e+01 0 -1 0 +2686 1 -7.4281423106968880e-01 1.7209207993618779e+01 2.9010021595303098e+01 3.0203456019417672e+01 0 0 0 +2726 2 3.6069766156550270e-01 1.8044706625504677e+01 2.4171176863546254e+01 2.8673693693914721e+01 0 0 0 +1911 2 3.6333317646275737e-01 2.1674751578335314e+01 2.3230973178826719e+01 2.3120171874733760e+01 0 -1 0 +1856 2 3.7801019952403159e-01 1.9157564727075059e+01 2.8463717008823142e+01 3.0565682923722431e+01 0 -1 0 +2089 1 -7.0496813300901562e-01 3.8846483720764891e+00 1.5580136852342440e+01 3.0988989949697324e+01 1 0 -1 +1446 2 3.5684944118174039e-01 2.3622382153967447e+01 2.1145980699353274e+01 3.0922007381584152e+01 0 0 -1 +20 2 3.8313988649451719e-01 2.3567149168289870e+01 2.6521600224523564e+01 2.9047557301732944e+01 -1 -1 -1 +1645 1 -7.2975217517491020e-01 2.4503116602137837e+01 2.8220645360772622e+01 2.6024256833339081e+01 -1 -1 0 +1479 2 3.3277901451789660e-01 2.3043266049476788e+01 2.9472055510377256e+01 2.3026684338522582e+01 0 0 0 +21 2 3.6957552563387847e-01 2.3004009724383639e+01 2.5151261985446151e+01 2.9010157214707696e+01 -1 -1 -1 +19 1 -7.3283206707000104e-01 2.3837342577896429e+01 2.5590600819654583e+01 2.9004041557282498e+01 -1 -1 -1 +2919 2 3.3657564800542050e-01 2.3226334412340972e+01 2.8631419923044739e+01 3.0565437556374363e+01 0 0 0 +2994 2 3.3185646686298959e-01 2.2130529141372453e+01 2.7788822981808160e+01 3.0249116095757081e+01 0 0 0 +2811 2 3.4347782695574663e-01 2.1728890000655692e+01 2.9920986248140004e+01 2.5214011447807373e+01 0 0 0 +2950 1 -7.5540204534745348e-01 2.0926670256690628e+01 2.9448847715040952e+01 2.5024621462083321e+01 0 0 0 +2725 1 -7.3873503702858367e-01 1.8570953662424213e+01 2.3495487828789724e+01 2.9114240296907006e+01 0 0 0 +2727 2 3.4578431704926010e-01 1.8521402073736528e+01 2.3803369510420776e+01 3.0046711269915065e+01 0 0 0 +2706 2 4.0134355968739022e-01 2.0027182644166121e+01 2.6557493357920286e+01 2.4145390728749291e+01 0 0 0 +2992 1 -7.5913711940645257e-01 2.2970109524231784e+01 2.8032645642922468e+01 2.9869171958268229e+01 0 0 0 +385 1 -7.1279576946000944e-01 2.2400765939444359e+01 2.3888346755024067e+01 2.5425837077985594e+01 0 -1 -1 +584 2 3.3997388729632499e-01 2.3252595381056373e+01 2.3597189808628819e+01 2.5892592333652562e+01 0 -1 -1 +386 2 3.6021614130896101e-01 2.2591488978199816e+01 2.4730541934939339e+01 2.5006367399286887e+01 0 -1 -1 +1646 2 3.5247924473061648e-01 2.4187891291529947e+01 2.9084220378797124e+01 2.6265107250975543e+01 -1 -1 0 +2704 1 -7.2538461010879418e-01 1.9366548933982255e+01 2.7003482749459032e+01 2.4784293272716216e+01 0 0 0 +2705 2 3.5569396967362998e-01 1.9532957843494568e+01 2.7959407245345876e+01 2.4860260856571184e+01 0 0 0 +799 1 -7.6050101057871444e-01 2.3988048355725599e+01 3.0636437496838141e+01 2.4652500799214650e+01 -1 0 -1 +1268 2 3.7639747176313071e-01 2.2231703368249963e+01 2.9098356754253786e+01 2.8585082778064507e+01 0 0 -1 +1986 2 3.5487267787675603e-01 1.9750188049423382e+01 2.7187594892472802e+01 2.6640233875527738e+01 0 -1 0 +1985 2 3.3736674454677884e-01 2.0267462855064423e+01 2.6820323975036533e+01 2.8102370674810249e+01 0 -1 0 +1984 1 -6.9783562612802830e-01 1.9825533572332510e+01 2.7529939521248139e+01 2.7600380138886276e+01 0 -1 0 +1267 1 -7.2532864435020250e-01 2.1636063668219499e+01 2.9461977229570202e+01 2.7859512169419489e+01 0 0 -1 +2785 1 -6.8589612528722610e-01 2.1172630996025855e+01 2.4133535125323121e+01 2.8645805385843328e+01 0 0 0 +2786 2 3.6187004113704491e-01 2.0324955226508639e+01 2.3878077420526786e+01 2.9143893808061488e+01 0 0 0 +1269 2 3.8169946623808348e-01 2.0777827361035222e+01 2.8843598204104719e+01 2.7926543763986889e+01 0 0 -1 +2827 1 -7.5178981778370491e-01 2.5980207330104658e+01 1.5883927015697910e+01 1.5933980603556099e+01 0 0 0 +2951 2 3.5115645556354869e-01 2.0613112882121001e+01 2.9282777176086590e+01 2.5849956558510126e+01 0 0 0 +1830 2 3.4562081475759565e-01 2.5042883762442986e-01 1.9659806805631007e+01 3.0838531101438452e+01 0 0 0 +2949 2 3.7538315262016592e-01 2.6728904078646107e+01 2.5980725541678012e+01 2.4524765091211119e+01 0 0 0 +2693 2 3.3339425832370145e-01 2.4465202567280162e+01 2.4127880542052008e+01 2.7395744824065918e+01 0 0 0 +2192 2 3.6659376702940660e-01 2.8856470552368346e+01 2.6506868869494156e+01 2.7596926665383766e+01 0 -1 0 +1837 1 -7.1365031316252459e-01 2.6425043242862866e+01 2.5620135077268284e+01 3.0621573076223548e+01 -1 -1 0 +1331 2 3.5500527902638757e-01 2.3184779434937365e+01 2.7082744171995643e+01 2.3370410135977959e+01 0 0 -1 +1621 1 -7.6435417363797209e-01 2.9628730033886924e+01 2.9180588446022917e+01 2.9391911565459942e+01 -1 -1 0 +1367 2 3.6840931346151579e-01 2.5693374475437924e+01 3.0087113401159538e+01 2.4915942123885991e+01 0 0 -1 +1987 1 -7.1082251196474511e-01 3.0060262246121411e+01 2.7610554694576539e+01 2.2780775200354022e+01 0 -1 0 +2938 1 -7.4112000273699075e-01 1.8149803686751540e+01 1.5695169511354322e+01 1.6947474577849174e+01 0 0 0 +1839 2 3.6079283000119255e-01 2.5602942316285514e+01 2.5649254220041389e+01 3.0064023277643344e+01 -1 -1 0 +1876 1 -7.1122447250616871e-01 1.3882831693372349e+01 3.0791374304312075e+01 1.6088923223980341e+01 0 -1 0 +1188 2 3.5912490985459461e-01 1.1132479352648046e+01 2.7769533203195365e+01 1.6085424043853980e+01 0 0 0 +625 1 -6.8070199915260399e-01 2.8298375442686439e+01 3.0378227657718618e+01 2.1330941736995175e+01 0 -1 -1 +2324 2 3.6528238885428532e-01 2.6624285533476154e+01 2.7465633462681023e+01 3.0405350018301814e+01 -1 0 0 +2966 2 3.8324270048809833e-01 2.2145736866876939e+00 1.6293361592060393e+01 3.0554627512122444e+01 1 0 0 +685 1 -7.6185286627974624e-01 2.2911596052139330e+01 3.0356836516298955e+01 1.7698177981943278e+01 0 -1 0 +1812 2 3.4587306522017625e-01 1.7231487300098411e+01 1.6994206995354919e+01 2.3772481960570808e+01 0 -1 0 +2449 1 -7.3098760066670754e-01 1.7226073658772862e+01 1.8207511631168725e+01 1.5571328926836692e+01 0 0 0 +1609 1 -7.3209378689090843e-01 3.8038541319091670e+00 3.0469943247784794e+01 2.8248713179443495e+01 0 -1 0 +71 2 3.7722929972710306e-01 1.1828349487701109e+01 1.6115815808013849e+01 3.0621871422273017e+01 0 0 -1 +811 1 -6.9547622941354248e-01 3.0428812893249077e+01 3.0859717988145043e+01 1.8802269306680319e+01 -1 0 0 +2405 2 3.4020652691064257e-01 7.4528018084076963e+00 2.6012876505596005e+01 3.0705739252272764e+01 0 0 0 +1253 2 3.5717004716194040e-01 2.3664945895202479e+01 1.6287715192098435e+01 3.0322970930456712e+01 0 0 -1 +252 2 3.8701305495106386e-01 2.1482185801453028e+01 3.1006367209523919e+01 2.7196564479751714e+01 0 -1 -1 +1862 2 3.7625538466757952e-01 1.5251364631771182e+01 1.5616838924692072e+01 1.5618905489741165e+01 0 0 0 +813 2 3.7367922684603366e-01 1.1794541687145023e-01 3.1039606881210492e+01 1.9416399237735966e+01 0 0 0 diff --git a/examples/reaxff/water/in.water.acks2 b/examples/reaxff/water/in.water.acks2 new file mode 100644 index 0000000000..54199b8044 --- /dev/null +++ b/examples/reaxff/water/in.water.acks2 @@ -0,0 +1,29 @@ +# ACKS2 Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p p +units real +atom_style charge + +read_data data.water + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * acks2_ff.water O H +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 1000 +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 diff --git a/examples/reaxff/water/in.water.acks2.field b/examples/reaxff/water/in.water.acks2.field new file mode 100644 index 0000000000..9b0678422e --- /dev/null +++ b/examples/reaxff/water/in.water.acks2.field @@ -0,0 +1,31 @@ +# ACKS2 Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p s +units real +atom_style charge + +read_data data.water + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * acks2_ff.water O H +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 1000 +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 1.0 +fix 4 all wall/reflect zlo EDGE zhi EDGE + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 diff --git a/examples/reaxff/water/in.water.qeq b/examples/reaxff/water/in.water.qeq new file mode 100644 index 0000000000..85a56a0e60 --- /dev/null +++ b/examples/reaxff/water/in.water.qeq @@ -0,0 +1,29 @@ +# QEq Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p p +units real +atom_style charge + +read_data data.water + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 400 +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 diff --git a/examples/reaxff/water/in.water.qeq.field b/examples/reaxff/water/in.water.qeq.field new file mode 100644 index 0000000000..54b68ea898 --- /dev/null +++ b/examples/reaxff/water/in.water.qeq.field @@ -0,0 +1,31 @@ +# QEq Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p s +units real +atom_style charge + +read_data data.water + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 400 +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 1.0 +fix 4 all wall/reflect zlo EDGE zhi EDGE + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 diff --git a/examples/reaxff/water/log.13Oct21.reaxff.water-acks2-field.g++.1 b/examples/reaxff/water/log.13Oct21.reaxff.water-acks2-field.g++.1 new file mode 100644 index 0000000000..fe4cfdbfd9 --- /dev/null +++ b/examples/reaxff/water/log.13Oct21.reaxff.water-acks2-field.g++.1 @@ -0,0 +1,129 @@ +LAMMPS (29 Sep 2021) +# ACKS2 Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p s +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + reading atoms ... +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) + 3000 atoms + read_data CPU = 0.010 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replicating atoms ... + orthogonal box = (0.0000000 0.0000000 0.0012889577) to (31.043046 31.043046 31.045309) + 1 by 1 by 1 MPI processor grid + 3000 atoms + replicate CPU = 0.001 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * acks2_ff.water O H +Reading potential file acks2_ff.water with DATE: 2021-09-21 +WARNING: Changed valency_val to valency_boc for X (../reaxff_ffield.cpp:296) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 1000 +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 1.0 +fix 4 all wall/reflect zlo EDGE zhi EDGE + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix acks2/reaxff command: + +@Article{O'Hearn2020, + author = {K. A. O'Hearn, A. Alperen, and H. M. Aktulga}, + title = {Fast Solvers for Charge Distribution Models on Shared Memory Platforms}, + journal = {SIAM J. Sci. Comput.}, + year = 2020, + volume = 42, + pages = {1--22} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix acks2/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 361.2 | 361.2 | 361.2 Mbytes +Step Temp Press Density Volume + 0 300 -20762.954 0.99996859 29916.212 + 10 396.27588 -18423.747 1.0000143 29914.844 + 20 518.59361 -10010.691 1.0000209 29914.647 +Loop time of 29.8896 on 1 procs for 20 steps with 3000 atoms + +Performance: 0.029 ns/day, 830.268 hours/ns, 0.669 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 11.611 | 11.611 | 11.611 | 0.0 | 38.85 +Neigh | 0.6729 | 0.6729 | 0.6729 | 0.0 | 2.25 +Comm | 0.0020791 | 0.0020791 | 0.0020791 | 0.0 | 0.01 +Output | 0.00015777 | 0.00015777 | 0.00015777 | 0.0 | 0.00 +Modify | 17.602 | 17.602 | 17.602 | 0.0 | 58.89 +Other | | 0.001149 | | | 0.00 + +Nlocal: 3000.00 ave 3000 max 3000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5438.00 ave 5438 max 5438 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 787357.0 ave 787357 max 787357 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 787357 +Ave neighs/atom = 262.45233 +Neighbor list builds = 7 +Dangerous builds = 0 +Total wall time: 0:00:32 diff --git a/examples/reaxff/water/log.13Oct21.reaxff.water-acks2-field.g++.4 b/examples/reaxff/water/log.13Oct21.reaxff.water-acks2-field.g++.4 new file mode 100644 index 0000000000..f69b274c02 --- /dev/null +++ b/examples/reaxff/water/log.13Oct21.reaxff.water-acks2-field.g++.4 @@ -0,0 +1,129 @@ +LAMMPS (29 Sep 2021) +# ACKS2 Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p s +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + reading atoms ... +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) + 3000 atoms + read_data CPU = 0.011 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replicating atoms ... + orthogonal box = (0.0000000 0.0000000 0.0012889577) to (31.043046 31.043046 31.045309) + 2 by 1 by 2 MPI processor grid + 3000 atoms + replicate CPU = 0.001 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * acks2_ff.water O H +Reading potential file acks2_ff.water with DATE: 2021-09-21 +WARNING: Changed valency_val to valency_boc for X (../reaxff_ffield.cpp:296) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 1000 +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 1.0 +fix 4 all wall/reflect zlo EDGE zhi EDGE + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix acks2/reaxff command: + +@Article{O'Hearn2020, + author = {K. A. O'Hearn, A. Alperen, and H. M. Aktulga}, + title = {Fast Solvers for Charge Distribution Models on Shared Memory Platforms}, + journal = {SIAM J. Sci. Comput.}, + year = 2020, + volume = 42, + pages = {1--22} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix acks2/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 198.5 | 199.3 | 199.9 Mbytes +Step Temp Press Density Volume + 0 300 -20761.724 0.99996859 29916.212 + 10 396.27588 -18420.441 1.0000144 29914.843 + 20 518.59146 -10012.622 1.0000207 29914.652 +Loop time of 11.3556 on 4 procs for 20 steps with 3000 atoms + +Performance: 0.076 ns/day, 315.433 hours/ns, 1.761 timesteps/s +94.3% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.7511 | 3.8123 | 3.9245 | 3.4 | 33.57 +Neigh | 0.36492 | 0.3767 | 0.39023 | 1.5 | 3.32 +Comm | 0.12022 | 0.23202 | 0.29307 | 13.8 | 2.04 +Output | 8.0451e-05 | 0.00017452 | 0.00045489 | 0.0 | 0.00 +Modify | 6.9172 | 6.9312 | 6.9431 | 0.4 | 61.04 +Other | | 0.003189 | | | 0.03 + +Nlocal: 750.000 ave 758 max 737 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Nghost: 4219.50 ave 4233 max 4198 min +Histogram: 1 0 0 0 1 0 0 0 0 2 +Neighs: 230733.0 ave 233431 max 225531 min +Histogram: 1 0 0 0 0 0 0 0 2 1 + +Total # of neighbors = 922931 +Ave neighs/atom = 307.64367 +Neighbor list builds = 7 +Dangerous builds = 0 +Total wall time: 0:00:12 diff --git a/examples/reaxff/water/log.13Oct21.reaxff.water-acks2.g++.1 b/examples/reaxff/water/log.13Oct21.reaxff.water-acks2.g++.1 new file mode 100644 index 0000000000..4bf0a5b789 --- /dev/null +++ b/examples/reaxff/water/log.13Oct21.reaxff.water-acks2.g++.1 @@ -0,0 +1,124 @@ +LAMMPS (29 Sep 2021) +# ACKS2 Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p p +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3000 atoms + read_data CPU = 0.010 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replicating atoms ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + 3000 atoms + replicate CPU = 0.001 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * acks2_ff.water O H +Reading potential file acks2_ff.water with DATE: 2021-09-21 +WARNING: Changed valency_val to valency_boc for X (../reaxff_ffield.cpp:296) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 1000 +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix acks2/reaxff command: + +@Article{O'Hearn2020, + author = {K. A. O'Hearn, A. Alperen, and H. M. Aktulga}, + title = {Fast Solvers for Charge Distribution Models on Shared Memory Platforms}, + journal = {SIAM J. Sci. Comput.}, + year = 2020, + volume = 42, + pages = {1--22} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix acks2/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 574.5 | 574.5 | 574.5 Mbytes +Step Temp Press Density Volume + 0 300 1572.3474 1 29915.273 + 10 300.61522 8252.7686 1 29915.273 + 20 294.7387 2502.6624 1 29915.273 +Loop time of 25.9579 on 1 procs for 20 steps with 3000 atoms + +Performance: 0.033 ns/day, 721.052 hours/ns, 0.770 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 14.081 | 14.081 | 14.081 | 0.0 | 54.24 +Neigh | 0.34284 | 0.34284 | 0.34284 | 0.0 | 1.32 +Comm | 0.0027799 | 0.0027799 | 0.0027799 | 0.0 | 0.01 +Output | 0.00012876 | 0.00012876 | 0.00012876 | 0.0 | 0.00 +Modify | 11.53 | 11.53 | 11.53 | 0.0 | 44.42 +Other | | 0.001007 | | | 0.00 + +Nlocal: 3000.00 ave 3000 max 3000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 11077.0 ave 11077 max 11077 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 971815.0 ave 971815 max 971815 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 971815 +Ave neighs/atom = 323.93833 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:27 diff --git a/examples/reaxff/water/log.13Oct21.reaxff.water-acks2.g++.4 b/examples/reaxff/water/log.13Oct21.reaxff.water-acks2.g++.4 new file mode 100644 index 0000000000..4124e7f82f --- /dev/null +++ b/examples/reaxff/water/log.13Oct21.reaxff.water-acks2.g++.4 @@ -0,0 +1,124 @@ +LAMMPS (29 Sep 2021) +# ACKS2 Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p p +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 3000 atoms + read_data CPU = 0.013 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replicating atoms ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + 3000 atoms + replicate CPU = 0.002 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * acks2_ff.water O H +Reading potential file acks2_ff.water with DATE: 2021-09-21 +WARNING: Changed valency_val to valency_boc for X (../reaxff_ffield.cpp:296) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 1000 +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix acks2/reaxff command: + +@Article{O'Hearn2020, + author = {K. A. O'Hearn, A. Alperen, and H. M. Aktulga}, + title = {Fast Solvers for Charge Distribution Models on Shared Memory Platforms}, + journal = {SIAM J. Sci. Comput.}, + year = 2020, + volume = 42, + pages = {1--22} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix acks2/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 271.9 | 273.6 | 275.1 Mbytes +Step Temp Press Density Volume + 0 300 1572.3807 1 29915.273 + 10 300.6152 8252.4834 1 29915.273 + 20 294.73868 2502.5661 1 29915.273 +Loop time of 11.1133 on 4 procs for 20 steps with 3000 atoms + +Performance: 0.078 ns/day, 308.702 hours/ns, 1.800 timesteps/s +92.7% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 4.3609 | 4.7715 | 5.4812 | 19.5 | 42.94 +Neigh | 0.15797 | 0.17176 | 0.19405 | 3.5 | 1.55 +Comm | 0.21014 | 0.922 | 1.3353 | 44.6 | 8.30 +Output | 8.815e-05 | 0.0002 | 0.00030501 | 0.0 | 0.00 +Modify | 5.2267 | 5.2468 | 5.2584 | 0.5 | 47.21 +Other | | 0.001074 | | | 0.01 + +Nlocal: 750.000 ave 760 max 735 min +Histogram: 1 0 0 0 1 0 0 0 0 2 +Nghost: 6231.50 ave 6255 max 6192 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Neighs: 277006.0 ave 280567 max 271394 min +Histogram: 1 0 0 0 0 1 0 0 0 2 + +Total # of neighbors = 1108026 +Ave neighs/atom = 369.34200 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:12 diff --git a/examples/reaxff/water/log.13Oct21.reaxff.water-qeq-field.g++.1 b/examples/reaxff/water/log.13Oct21.reaxff.water-qeq-field.g++.1 new file mode 100644 index 0000000000..74f49665b9 --- /dev/null +++ b/examples/reaxff/water/log.13Oct21.reaxff.water-qeq-field.g++.1 @@ -0,0 +1,128 @@ +LAMMPS (29 Sep 2021) +# QEq Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p s +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + reading atoms ... +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) + 3000 atoms + read_data CPU = 0.010 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replicating atoms ... + orthogonal box = (0.0000000 0.0000000 0.0012889577) to (31.043046 31.043046 31.045309) + 1 by 1 by 1 MPI processor grid + 3000 atoms + replicate CPU = 0.001 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +WARNING: Changed valency_val to valency_boc for X (../reaxff_ffield.cpp:296) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 400 +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 1.0 +fix 4 all wall/reflect zlo EDGE zhi EDGE + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 332.3 | 332.3 | 332.3 Mbytes +Step Temp Press Density Volume + 0 300 25015.837 0.99996859 29916.212 + 10 348.83356 31131.298 0.99964273 29925.965 + 20 414.67243 27564.999 0.99979791 29921.32 +Loop time of 15.4107 on 1 procs for 20 steps with 3000 atoms + +Performance: 0.056 ns/day, 428.074 hours/ns, 1.298 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 11.413 | 11.413 | 11.413 | 0.0 | 74.06 +Neigh | 0.57486 | 0.57486 | 0.57486 | 0.0 | 3.73 +Comm | 0.0019709 | 0.0019709 | 0.0019709 | 0.0 | 0.01 +Output | 0.00013211 | 0.00013211 | 0.00013211 | 0.0 | 0.00 +Modify | 3.4192 | 3.4192 | 3.4192 | 0.0 | 22.19 +Other | | 0.001104 | | | 0.01 + +Nlocal: 3000.00 ave 3000 max 3000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5439.00 ave 5439 max 5439 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 786591.0 ave 786591 max 786591 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 786591 +Ave neighs/atom = 262.19700 +Neighbor list builds = 6 +Dangerous builds = 0 +Total wall time: 0:00:16 diff --git a/examples/reaxff/water/log.13Oct21.reaxff.water-qeq-field.g++.4 b/examples/reaxff/water/log.13Oct21.reaxff.water-qeq-field.g++.4 new file mode 100644 index 0000000000..4f56281aaa --- /dev/null +++ b/examples/reaxff/water/log.13Oct21.reaxff.water-qeq-field.g++.4 @@ -0,0 +1,128 @@ +LAMMPS (29 Sep 2021) +# QEq Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p s +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + reading atoms ... +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) +WARNING: Non-zero imageflag(s) in z direction for non-periodic boundary reset to zero (../atom.cpp:1208) + 3000 atoms + read_data CPU = 0.017 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replicating atoms ... + orthogonal box = (0.0000000 0.0000000 0.0012889577) to (31.043046 31.043046 31.045309) + 2 by 1 by 2 MPI processor grid + 3000 atoms + replicate CPU = 0.002 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +WARNING: Changed valency_val to valency_boc for X (../reaxff_ffield.cpp:296) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 400 +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 1.0 +fix 4 all wall/reflect zlo EDGE zhi EDGE + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 188.9 | 189.5 | 190.1 Mbytes +Step Temp Press Density Volume + 0 300 25015.837 0.99996859 29916.212 + 10 348.83356 31131.298 0.99964273 29925.965 + 20 414.67243 27564.999 0.99979791 29921.32 +Loop time of 5.71549 on 4 procs for 20 steps with 3000 atoms + +Performance: 0.151 ns/day, 158.764 hours/ns, 3.499 timesteps/s +94.1% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.6678 | 3.8126 | 4.1402 | 9.8 | 66.71 +Neigh | 0.31449 | 0.34639 | 0.38898 | 5.5 | 6.06 +Comm | 0.032125 | 0.35935 | 0.50408 | 31.9 | 6.29 +Output | 7.643e-05 | 0.00015959 | 0.00039876 | 0.0 | 0.00 +Modify | 1.1534 | 1.1959 | 1.2283 | 3.0 | 20.92 +Other | | 0.001099 | | | 0.02 + +Nlocal: 750.000 ave 757 max 738 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Nghost: 4219.00 ave 4232 max 4198 min +Histogram: 1 0 0 0 0 1 0 0 1 1 +Neighs: 230549.0 ave 233374 max 225849 min +Histogram: 1 0 0 0 0 0 1 0 1 1 + +Total # of neighbors = 922196 +Ave neighs/atom = 307.39867 +Neighbor list builds = 6 +Dangerous builds = 0 +Total wall time: 0:00:06 diff --git a/examples/reaxff/water/log.13Oct21.reaxff.water-qeq.g++.1 b/examples/reaxff/water/log.13Oct21.reaxff.water-qeq.g++.1 new file mode 100644 index 0000000000..9c991e2ff8 --- /dev/null +++ b/examples/reaxff/water/log.13Oct21.reaxff.water-qeq.g++.1 @@ -0,0 +1,123 @@ +LAMMPS (29 Sep 2021) +# QEq Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p p +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3000 atoms + read_data CPU = 0.010 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replicating atoms ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + 3000 atoms + replicate CPU = 0.001 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +WARNING: Changed valency_val to valency_boc for X (../reaxff_ffield.cpp:296) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 400 +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 539.2 | 539.2 | 539.2 Mbytes +Step Temp Press Density Volume + 0 300 780.33989 1 29915.273 + 10 301.29205 5433.7415 1 29915.273 + 20 297.90652 1572.6111 1 29915.273 +Loop time of 17.5765 on 1 procs for 20 steps with 3000 atoms + +Performance: 0.049 ns/day, 488.237 hours/ns, 1.138 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 13.806 | 13.806 | 13.806 | 0.0 | 78.55 +Neigh | 0.34211 | 0.34211 | 0.34211 | 0.0 | 1.95 +Comm | 0.0028155 | 0.0028155 | 0.0028155 | 0.0 | 0.02 +Output | 0.00012279 | 0.00012279 | 0.00012279 | 0.0 | 0.00 +Modify | 3.4248 | 3.4248 | 3.4248 | 0.0 | 19.49 +Other | | 0.001008 | | | 0.01 + +Nlocal: 3000.00 ave 3000 max 3000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 11077.0 ave 11077 max 11077 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 971826.0 ave 971826 max 971826 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 971826 +Ave neighs/atom = 323.94200 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:18 diff --git a/examples/reaxff/water/log.13Oct21.reaxff.water-qeq.g++.4 b/examples/reaxff/water/log.13Oct21.reaxff.water-qeq.g++.4 new file mode 100644 index 0000000000..152842f516 --- /dev/null +++ b/examples/reaxff/water/log.13Oct21.reaxff.water-qeq.g++.4 @@ -0,0 +1,123 @@ +LAMMPS (29 Sep 2021) +# QEq Water, CITE: Achtyl et al., Nat. Comm., 6 6539 (2015) + +boundary p p p +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 3000 atoms + read_data CPU = 0.010 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replicating atoms ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + 3000 atoms + replicate CPU = 0.001 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +WARNING: Changed valency_val to valency_boc for X (../reaxff_ffield.cpp:296) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 400 +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 260.5 | 262.2 | 263.6 Mbytes +Step Temp Press Density Volume + 0 300 780.34006 1 29915.273 + 10 301.29205 5433.7414 1 29915.273 + 20 297.90652 1572.6111 1 29915.273 +Loop time of 6.79573 on 4 procs for 20 steps with 3000 atoms + +Performance: 0.127 ns/day, 188.770 hours/ns, 2.943 timesteps/s +93.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 4.4827 | 4.6649 | 4.866 | 6.6 | 68.64 +Neigh | 0.16329 | 0.17253 | 0.18074 | 1.6 | 2.54 +Comm | 0.44871 | 0.64804 | 0.82827 | 17.5 | 9.54 +Output | 9.9269e-05 | 0.00013061 | 0.00022048 | 0.0 | 0.00 +Modify | 1.3028 | 1.3091 | 1.3201 | 0.6 | 19.26 +Other | | 0.001043 | | | 0.02 + +Nlocal: 750.000 ave 759 max 735 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Nghost: 6230.50 ave 6256 max 6190 min +Histogram: 1 0 0 0 0 1 0 0 1 1 +Neighs: 277008.0 ave 280943 max 271394 min +Histogram: 1 0 0 0 0 1 0 0 1 1 + +Total # of neighbors = 1108032 +Ave neighs/atom = 369.34400 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:07 diff --git a/examples/reaxff/water/qeq_ff.water b/examples/reaxff/water/qeq_ff.water new file mode 100644 index 0000000000..5d71e747b7 --- /dev/null +++ b/examples/reaxff/water/qeq_ff.water @@ -0,0 +1,83 @@ +Reactive MD-force field: QEq Water [CITE: Achtyl et al., Nat. Comm., 6 6539 (2015)] + 39 ! Number of general parameters + 50.0000 !Overcoordination parameter + 9.5469 !Overcoordination parameter + 26.5405 !Valency angle conjugation parameter + 1.7224 !Triple bond stabilisation parameter + 6.8702 !Triple bond stabilisation parameter + 60.4850 !C2-correction + 1.0588 !Undercoordination parameter + 4.6000 !Triple bond stabilisation parameter + 12.1176 !Undercoordination parameter + 13.3056 !Undercoordination parameter + -70.5044 !Triple bond stabilization energy + 0.0000 !Lower Taper-radius + 10.0000 !Upper Taper-radius + 2.8793 !Not used + 33.8667 !Valency undercoordination + 6.0891 !Valency angle/lone pair parameter + 1.0563 !Valency angle + 2.0384 !Valency angle parameter + 6.1431 !Not used + 6.9290 !Double bond/angle parameter + 0.3989 !Double bond/angle parameter: overcoord + 3.9954 !Double bond/angle parameter: overcoord + -2.4837 !Not used + 5.7796 !Torsion/BO parameter + 10.0000 !Torsion overcoordination + 1.9487 !Torsion overcoordination + -1.2327 !Conjugation 0 (not used) + 2.1645 !Conjugation + 1.5591 !vdWaals shielding + 0.1000 !Cutoff for bond order (*100) + 2.1365 !Valency angle conjugation parameter + 0.6991 !Overcoordination parameter + 50.0000 !Overcoordination parameter + 1.8512 !Valency/lone pair parameter + 0.5000 !Not used + 20.0000 !Not used + 5.0000 !Molecular energy (not used) + 0.0000 !Molecular energy (not used) + 2.6962 !Valency angle conjugation parameter + 3 ! Nr of atoms; cov.r; valency;a.m;Rvdw;Evdw;gammaEEM;cov.r2;# + alfa;gammavdW;valency;Eunder;Eover;chiEEM;etaEEM;n.u. + cov r3;Elp;Heat inc.;n.u.;n.u.;n.u.;n.u. + ov/un;val1;n.u.;val3,vval4 + H 0.8930 1.0000 1.0080 1.3550 0.0930 0.8203 -0.1000 1.0000 + 8.2230 33.2894 1.0000 0.0000 121.1250 3.7248 9.6093 1.0000 + -0.1000 0.0000 61.6606 3.0408 2.4197 0.0003 1.0698 0.0000 + -19.4571 4.2733 1.0338 1.0000 2.8793 0.0000 0.0000 0.0000 + O 1.2450 2.0000 15.9990 2.3890 0.1000 1.0898 1.0548 6.0000 + 9.7300 13.8449 4.0000 37.5000 116.0768 8.5000 8.3122 2.0000 + 0.9049 0.4056 59.0626 3.5027 0.7640 0.0021 0.9745 0.0000 + -3.5500 2.9000 1.0493 4.0000 2.9225 0.0000 0.0000 0.0000 + X -0.1000 2.0000 1.0080 2.0000 0.0000 1.0000 -0.1000 6.0000 + 10.0000 2.5000 4.0000 0.0000 0.0000 8.5000 1.5000 0.0000 + -0.1000 0.0000 -2.3700 8.7410 13.3640 0.6690 0.9745 0.0000 + -11.0000 2.7466 1.0338 2.0000 2.8793 0.0000 0.0000 0.0000 + 3 ! Nr of bonds; Edis1;LPpen;n.u.;pbe1;pbo5;13corr;pbo6 + pbe2;pbo3;pbo4;n.u.;pbo1;pbo2;ovcorr + 1 1 153.3934 0.0000 0.0000 -0.4600 0.0000 1.0000 6.0000 0.7300 + 6.2500 1.0000 0.0000 1.0000 -0.0790 6.0552 0.0000 0.0000 + 2 2 142.2858 145.0000 50.8293 0.2506 -0.1000 1.0000 29.7503 0.6051 + 0.3451 -0.1055 9.0000 1.0000 -0.1225 5.5000 1.0000 0.0000 + 1 2 160.0000 0.0000 0.0000 -0.5725 0.0000 1.0000 6.0000 0.5626 + 1.1150 1.0000 0.0000 0.0000 -0.0920 4.2790 0.0000 0.0000 + 1 ! Nr of off-diagonal terms; Ediss;Ro;gamma;rsigma;rpi;rpi2 + 1 2 0.0283 1.2885 10.9190 0.9215 -1.0000 -1.0000 + 6 ! Nr of angles;at1;at2;at3;Thetao,o;ka;kb;pv1;pv2 + 1 1 1 0.0000 27.9213 5.8635 0.0000 0.0000 0.0000 1.0400 + 2 2 2 80.7324 30.4554 0.9953 0.0000 1.6310 50.0000 1.0783 + 1 2 2 75.6935 50.0000 2.0000 0.0000 1.0000 0.0000 1.1680 + 1 2 1 85.8000 9.8453 2.2720 0.0000 2.8635 0.0000 1.5800 + 2 1 2 0.0000 15.0000 2.8900 0.0000 0.0000 0.0000 2.8774 + 1 1 2 0.0000 8.5744 3.0000 0.0000 0.0000 0.0000 1.0421 + 6 ! Nr of torsions;at1;at2;at3;at4;;V1;V2;V3;V2(BO);vconj;n.u;n + 1 2 2 1 2.5000 -4.0000 0.9000 -2.5000 -1.0000 0.0000 0.0000 + 1 2 2 2 0.8302 -4.0000 -0.7763 -2.5000 -1.0000 0.0000 0.0000 + 2 2 2 2 -2.5000 -4.0000 1.0000 -2.5000 -1.0000 0.0000 0.0000 + 0 1 1 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 0 1 2 0 0.0000 0.1000 0.0200 -2.5415 0.0000 0.0000 0.0000 + 0 2 2 0 0.5511 25.4150 1.1330 -5.1903 -1.0000 0.0000 0.0000 + 1 ! Nr of hydrogen bonds;at1;at2;at3;Rhb;Dehb;vhb1 + 2 1 2 2.1200 -3.5800 1.4500 19.5000 diff --git a/lib/awpmd/ivutils/include/vector_3.h b/lib/awpmd/ivutils/include/vector_3.h index 5711d3bf35..6beef2bcd6 100644 --- a/lib/awpmd/ivutils/include/vector_3.h +++ b/lib/awpmd/ivutils/include/vector_3.h @@ -487,7 +487,7 @@ vec_type dist_av(Vector_3 *va1,Vector_3 *va2,int n); /*e optionally gives the indexes for maximal and minimal difference va2 can be nullptr, then the norm of va1 is used */ -vec_type diff_av(Vector_3 *va1,Vector_3 *va2,int n, int *minind=0, int *maxind=0); +vec_type diff_av(Vector_3 *va1,Vector_3 *va2,int n, int *minind=nullptr, int *maxind=nullptr); //e finds suitable perpendicular to a vector Vector_3 FindPerp(const Vector_3 &vAB); @@ -507,7 +507,7 @@ Vector_3 GetIScopei(const Vector_3 *varr,int *indarr,int n,Vector_3* box_min,Vec // neue Funktionen //e clears vector array with optional integer index -void clear_vecarri(int n,Vector_3 *vec, int *ind=0); +void clear_vecarri(int n,Vector_3 *vec, int *ind=nullptr); //e reflects the vector ini+dir*t+0.5*force*t^2 to be inside a box limited by 0 and box sizes //e changes dir according to the final state diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h index 003b4b3ba7..2cb06999d9 100644 --- a/lib/gpu/geryon/ocl_device.h +++ b/lib/gpu/geryon/ocl_device.h @@ -88,7 +88,7 @@ struct OCLProperties { cl_uint clock; size_t work_group_size; size_t work_item_size[3]; - bool double_precision; + bool has_double_precision; int preferred_vector_width32, preferred_vector_width64; int alignment; size_t timer_resolution; @@ -226,7 +226,7 @@ class UCL_Device { inline bool double_precision() { return double_precision(_device); } /// Returns true if double precision is support for the device inline bool double_precision(const int i) - {return _properties[i].double_precision;} + {return _properties[i].has_double_precision;} /// Get the number of compute units on the current device inline unsigned cus() { return cus(_device); } @@ -481,7 +481,7 @@ int UCL_Device::set_platform(int pid) { cl_device_id *subdevice_list = new cl_device_id[num_subdevices]; CL_SAFE_CALL(clCreateSubDevices(device_list[i], props, num_subdevices, subdevice_list, &num_subdevices)); - for (int j=0; j= 3.0) op.has_shuffle_support=true; } + delete[] buffer2; #endif _properties.push_back(op); @@ -836,7 +837,7 @@ int UCL_Device::auto_set_platform(const enum UCL_DEVICE_TYPE type, bool vendor_match=false; bool type_match=false; - int max_cus=0; + unsigned int max_cus=0; int best_platform=0; std::string vendor_upper=vendor; diff --git a/lib/gpu/lal_atom.cu b/lib/gpu/lal_atom.cu index 1418459301..287d72803c 100644 --- a/lib/gpu/lal_atom.cu +++ b/lib/gpu/lal_atom.cu @@ -18,7 +18,7 @@ #endif __kernel void kernel_cast_x(__global numtyp4 *restrict x_type, - const __global double *restrict x, + const __global numtyp *restrict x, const __global int *restrict type, const int nall) { int ii=GLOBAL_ID_X; diff --git a/lib/gpu/lal_atom.h b/lib/gpu/lal_atom.h index 3cf97d94a0..77c1faa784 100644 --- a/lib/gpu/lal_atom.h +++ b/lib/gpu/lal_atom.h @@ -475,7 +475,7 @@ class Atom { UCL_Vector v; #ifdef GPU_CAST - UCL_Vector x_cast; + UCL_Vector x_cast; UCL_Vector type_cast; #endif diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 59eac78483..43a565c9fe 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -1039,10 +1039,18 @@ Device global_device; using namespace LAMMPS_AL; -bool lmp_has_gpu_device() +// check if a suitable GPU is present. +// for mixed and double precision GPU library compilation +// also the GPU needs to support double precision. +bool lmp_has_compatible_gpu_device() { UCL_Device gpu; - return (gpu.num_platforms() > 0); + bool compatible_gpu = gpu.num_platforms() > 0; + #if defined(_SINGLE_DOUBLE) || defined(_DOUBLE_DOUBLE) + if (compatible_gpu && !gpu.double_precision(0)) + compatible_gpu = false; + #endif + return compatible_gpu; } std::string lmp_gpu_device_info() diff --git a/lib/gpu/lal_zbl.cu b/lib/gpu/lal_zbl.cu index 09e1b4f6bb..2a7d4795da 100644 --- a/lib/gpu/lal_zbl.cu +++ b/lib/gpu/lal_zbl.cu @@ -82,9 +82,9 @@ __kernel void k_zbl(const __global numtyp4 *restrict x_, const __global numtyp4 *restrict coeff1, const __global numtyp4 *restrict coeff2, const __global numtyp4 *restrict coeff3, - const double cut_globalsq, - const double cut_innersq, - const double cut_inner, + const numtyp cut_globalsq, + const numtyp cut_innersq, + const numtyp cut_inner, const int lj_types, const __global int *dev_nbor, const __global int *dev_packed, @@ -174,9 +174,9 @@ __kernel void k_zbl_fast(const __global numtyp4 *restrict x_, const __global numtyp4 *restrict coeff1_in, const __global numtyp4 *restrict coeff2_in, const __global numtyp4 *restrict coeff3_in, - const double cut_globalsq, - const double cut_innersq, - const double cut_inner, + const numtyp cut_globalsq, + const numtyp cut_innersq, + const numtyp cut_inner, const __global int *dev_nbor, const __global int *dev_packed, __global acctyp4 *restrict ans, diff --git a/lib/gpu/lal_zbl.h b/lib/gpu/lal_zbl.h index af4f1b2eac..b7b525661c 100644 --- a/lib/gpu/lal_zbl.h +++ b/lib/gpu/lal_zbl.h @@ -67,9 +67,9 @@ class ZBL : public BaseAtomic { /// If atom type constants fit in shared memory, use fast kernels bool shared_types; - double _cut_globalsq; - double _cut_innersq; - double _cut_inner; + numtyp _cut_globalsq; + numtyp _cut_innersq; + numtyp _cut_inner; /// Number of atom types int _lj_types; diff --git a/lib/machdyn/Install.py b/lib/machdyn/Install.py index 2e90c9ca0f..8471316401 100644 --- a/lib/machdyn/Install.py +++ b/lib/machdyn/Install.py @@ -17,11 +17,12 @@ parser = ArgumentParser(prog='Install.py', # settings -version = '3.3.9' +version = '3.4.0' tarball = "eigen.tar.gz" # known checksums for different Eigen versions. used to validate the download. checksums = { \ + '3.4.0' : '4c527a9171d71a72a9d4186e65bea559', \ '3.3.9' : '609286804b0f79be622ccf7f9ff2b660', \ '3.3.7' : '9e30f67e8531477de4117506fe44669b' \ } @@ -35,7 +36,7 @@ Syntax from src dir: make lib-smd args="-b" Syntax from lib dir: python Install.py -b or: python Install.py -p /usr/include/eigen3" - or: python Install.py -v 3.3.7 -b + or: python Install.py -v 3.4.0 -b Example: @@ -77,7 +78,7 @@ if pathflag: if buildflag: print("Downloading Eigen ...") eigentar = os.path.join(homepath, tarball) - url = "https://gitlab.com/libeigen/eigen/-/archive/%s/eigen-%s.tar.gz" % (version,version) + url = "https://download.lammps.org/thirdparty/eigen-%s.tar.gz" % version geturl(url, eigentar) # verify downloaded archive integrity via md5 checksum, if known. diff --git a/lib/pace/Install.py b/lib/pace/Install.py index e90ae8c312..5b968732c9 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -15,12 +15,14 @@ from install_helpers import fullpath, geturl, checkmd5sum # settings thisdir = fullpath('.') -version = 'v.2021.4.9' +version = 'v.2021.10.25' # known checksums for different PACE versions. used to validate the download. checksums = { \ 'v.2021.2.3.upd2' : '8fd1162724d349b930e474927197f20d', 'v.2021.4.9' : '4db54962fbd6adcf8c18d46e1798ceb5', + 'v.2021.9.28' : 'f98363bb98adc7295ea63974738c2a1b', + 'v.2021.10.25' : 'a2ac3315c41a1a4a5c912bcb1bc9c5cc' } diff --git a/lib/pace/Makefile b/lib/pace/Makefile index c2e1892ddd..81f7c9db95 100644 --- a/lib/pace/Makefile +++ b/lib/pace/Makefile @@ -2,8 +2,11 @@ SHELL = /bin/sh # ------ FILES ------ -SRC_FILES = $(wildcard src/USER-PACE/*.cpp) -SRC = $(filter-out src/USER-PACE/pair_pace.cpp, $(SRC_FILES)) +YAML_CPP_PATH = src/yaml-cpp +YAML_CPP_INC = $(YAML_CPP_PATH)/include + +SRC_FILES = $(wildcard src/ML-PACE/*.cpp) +SRC = $(filter-out src/ML-PACE/pair_pace.cpp, $(SRC_FILES)) # ------ DEFINITIONS ------ @@ -12,7 +15,7 @@ OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ -CXXFLAGS = -O3 -fPIC -Isrc/USER-PACE +CXXFLAGS = -O3 -fPIC -Isrc/ML-PACE -I$(YAML_CPP_INC) ARCHIVE = ar ARCHFLAG = -rc @@ -21,9 +24,13 @@ SYSLIB = # ------ MAKE PROCEDURE ------ -lib: $(OBJ) +lib: $(OBJ) lib-yaml-cpp $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) + +lib-yaml-cpp: + cd $(YAML_CPP_PATH) && $(MAKE) lib + # ------ COMPILE RULES ------ %.o: %.cpp @@ -32,6 +39,9 @@ lib: $(OBJ) # ------ CLEAN ------ clean-all: -rm -f *~ $(OBJ) $(LIB) + cd $(YAML_CPP_PATH) && $(MAKE) clean-all clean-build: -rm -f *~ $(OBJ) + cd $(YAML_CPP_PATH) && $(MAKE) clean-build + diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index 17820716df..f4cbeb8ffd 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ -pace_SYSINC =-I../../lib/pace/src/USER-PACE -pace_SYSLIB = -L../../lib/pace/ -lpace +pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include +pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp pace_SYSPATH = diff --git a/lib/poems/SystemProcessor.h b/lib/poems/SystemProcessor.h index f009794f66..faa8c01d62 100644 --- a/lib/poems/SystemProcessor.h +++ b/lib/poems/SystemProcessor.h @@ -49,9 +49,9 @@ private: POEMSChain * AddNewChain(POEMSNode * currentNode); bool setLinkVisited(POEMSNode * firstNode, POEMSNode * secondNode); public: - SystemProcessor(void); + SystemProcessor(); - ~SystemProcessor(void) { + ~SystemProcessor() { headsOfSystems.DeleteValues(); for(int i = 0; i < ringsInSystem.GetNumElements(); i++) { @@ -66,7 +66,7 @@ public: int getNumberOfHeadChains(); }; -SystemProcessor::SystemProcessor(void){ +SystemProcessor::SystemProcessor(){ // register callback for deleting auxiliary data from tree nodes. nodes.SetDeleteAuxData(&POEMSNodeDelete_cb); } @@ -271,14 +271,14 @@ bool SystemProcessor::setLinkVisited(POEMSNode * firstNode, POEMSNode * secondNo return true; //return true to indicate that this is the first time the link has been visited } -List * SystemProcessor::getSystemData(void) //Gets the list of POEMSChains that comprise the system. Might eventually only +List * SystemProcessor::getSystemData() //Gets the list of POEMSChains that comprise the system. Might eventually only //return chains linked to the reference plane, but currently returns every chain //in the system. { return &headsOfSystems; } -int SystemProcessor::getNumberOfHeadChains(void) //This function isnt implemented yet, and might be taken out entirely; this was a holdover +int SystemProcessor::getNumberOfHeadChains() //This function isnt implemented yet, and might be taken out entirely; this was a holdover //from when I intended to return an array of chain pointers, rather than a list of chains //It will probably be deleted once I finish figuring out exactly what needs to be returned { diff --git a/lib/poems/body.cpp b/lib/poems/body.cpp index 1fc31243c8..510154ac75 100644 --- a/lib/poems/body.cpp +++ b/lib/poems/body.cpp @@ -132,6 +132,6 @@ Body* NewBody(int type){ case PARTICLE : // A Particle return new Particle; default : // error - return 0; + return nullptr; } } diff --git a/lib/poems/body23joint.cpp b/lib/poems/body23joint.cpp index 2f024a9a58..ef6d888aaf 100644 --- a/lib/poems/body23joint.cpp +++ b/lib/poems/body23joint.cpp @@ -30,8 +30,7 @@ Body23Joint::Body23Joint(){ DimQandU(4,2); } -Body23Joint::~Body23Joint(){ -} +Body23Joint::~Body23Joint() = default; JointType Body23Joint::GetType(){ return BODY23JOINT; diff --git a/lib/poems/colmatmap.cpp b/lib/poems/colmatmap.cpp index 69ec4ec1b0..e075f1d297 100644 --- a/lib/poems/colmatmap.cpp +++ b/lib/poems/colmatmap.cpp @@ -24,7 +24,7 @@ using namespace std; ColMatMap::ColMatMap(){ numrows = 0; - elements = 0; + elements = nullptr; } ColMatMap::~ColMatMap(){ @@ -33,7 +33,7 @@ ColMatMap::~ColMatMap(){ ColMatMap::ColMatMap(const ColMatMap& A){ // copy constructor numrows = 0; - elements = 0; + elements = nullptr; Dim(A.numrows); for(int i=0;iDim(m,n); } diff --git a/lib/poems/matrixfun.cpp b/lib/poems/matrixfun.cpp index 9c20d7cac9..b57710aa7a 100644 --- a/lib/poems/matrixfun.cpp +++ b/lib/poems/matrixfun.cpp @@ -36,7 +36,7 @@ VirtualMatrix* NewMatrix(int type){ case MAT4X4 : return new Mat4x4; case VECT3 : return new Vect3; case VECT4 : return new Vect4; - default : return 0; // error! + default : return nullptr; // error! } } diff --git a/lib/poems/mixedjoint.cpp b/lib/poems/mixedjoint.cpp index 8597b3bb46..f9aad39615 100644 --- a/lib/poems/mixedjoint.cpp +++ b/lib/poems/mixedjoint.cpp @@ -26,11 +26,9 @@ -MixedJoint::MixedJoint(){ -} +MixedJoint::MixedJoint() = default; -MixedJoint::~MixedJoint(){ -} +MixedJoint::~MixedJoint() = default; JointType MixedJoint::GetType(){ return MIXEDJOINT; diff --git a/lib/poems/onbody.cpp b/lib/poems/onbody.cpp index a9f260a329..84dd0b9ea3 100644 --- a/lib/poems/onbody.cpp +++ b/lib/poems/onbody.cpp @@ -30,9 +30,9 @@ using namespace std; OnBody::OnBody(){ - system_body = 0; - system_joint = 0; - parent = 0; + system_body = nullptr; + system_joint = nullptr; + parent = nullptr; // these terms have zeros which are NEVER overwritten sI.Zeros(); diff --git a/lib/poems/onsolver.cpp b/lib/poems/onsolver.cpp index 8149ad694b..24758a7aa8 100644 --- a/lib/poems/onsolver.cpp +++ b/lib/poems/onsolver.cpp @@ -28,8 +28,8 @@ using namespace std; OnSolver::OnSolver(){ numbodies = 0; - bodyarray = 0; - q=0;u=0; qdot=0; udot=0; qdotdot=0; + bodyarray = nullptr; + q=nullptr;u=nullptr; qdot=nullptr; udot=nullptr; qdotdot=nullptr; type = ONSOLVER; } diff --git a/lib/poems/particle.cpp b/lib/poems/particle.cpp index 1993136923..0094a81ec0 100644 --- a/lib/poems/particle.cpp +++ b/lib/poems/particle.cpp @@ -19,11 +19,9 @@ #include "particle.h" #include "fixedpoint.h" -Particle::Particle(){ -} +Particle::Particle() = default; -Particle::~Particle(){ -} +Particle::~Particle() = default; BodyType Particle::GetType(){ return PARTICLE; diff --git a/lib/poems/poemslist.h b/lib/poems/poemslist.h index 39a3af2b51..a56c953349 100644 --- a/lib/poems/poemslist.h +++ b/lib/poems/poemslist.h @@ -65,7 +65,7 @@ template ListElement::ListElement(){ } template ListElement::ListElement(T* v){ - next = prev = 0; + next = prev = nullptr; value = v; } @@ -77,7 +77,7 @@ template ListElement::~ListElement(){ // template List::List(){ - head = tail = 0; + head = tail = nullptr; numelements = 0; } @@ -181,7 +181,7 @@ template S** List::CreateArray(){ S** array = new S* [numelements]; ListElement* ele = head; - for(int i=0;ele != 0;i++){ + for(int i=0;ele != nullptr;i++){ array[i] = ele->value; ele = ele->next; } diff --git a/lib/poems/poemsobject.cpp b/lib/poems/poemsobject.cpp index 5f221f1242..0732179415 100644 --- a/lib/poems/poemsobject.cpp +++ b/lib/poems/poemsobject.cpp @@ -20,7 +20,7 @@ #include POEMSObject::POEMSObject(){ - name = 0; + name = nullptr; ChangeName((const char*)"unnamed"); ID = -1; } diff --git a/lib/poems/poemstree.h b/lib/poems/poemstree.h index cb9499cfd4..6ff7c5ccde 100644 --- a/lib/poems/poemstree.h +++ b/lib/poems/poemstree.h @@ -64,8 +64,8 @@ protected: public: // constructor, destructor - Tree(void); - ~Tree(void) + Tree(); + ~Tree() { ClearTree(root); }; @@ -85,19 +85,19 @@ public: void Insert(const int& item, const int& data, void * AuxData = nullptr); void Delete(const int& item); void AVLInsert(TreeNode* &tree, TreeNode* newNode, int &reviseBalanceFactor); - void ClearList(void); + void ClearList(); // tree specific methods void Update(const int& item); - TreeNode *GetRoot(void) const; + TreeNode *GetRoot() const; }; // constructor -Tree::Tree(void) +Tree::Tree() { - root = 0; - current = 0; + root = nullptr; + current = nullptr; size = 0; DeleteAuxData = nullptr; } @@ -105,7 +105,7 @@ Tree::Tree(void) // return root pointer -TreeNode *Tree::GetRoot(void) const +TreeNode *Tree::GetRoot() const { return root; } @@ -603,7 +603,7 @@ void Tree::ClearTree(TreeNode * &t) } // delete all nodes in list -void Tree::ClearList(void) +void Tree::ClearList() { delete root; delete current; diff --git a/lib/poems/poemstreenode.cpp b/lib/poems/poemstreenode.cpp index d1fd965752..48bd80f283 100644 --- a/lib/poems/poemstreenode.cpp +++ b/lib/poems/poemstreenode.cpp @@ -27,23 +27,23 @@ TreeNode::TreeNode (const int & item, TreeNode *lptr,TreeNode *rptr, // return left -TreeNode* TreeNode::Left(void) +TreeNode* TreeNode::Left() { return left; } // return right -TreeNode* TreeNode::Right(void) +TreeNode* TreeNode::Right() { return right; } -int TreeNode::GetBalanceFactor(void) +int TreeNode::GetBalanceFactor() { return balanceFactor; } -int TreeNode::GetData(void) +int TreeNode::GetData() { return data; } diff --git a/lib/poems/point.cpp b/lib/poems/point.cpp index 66bf8d0373..a742473669 100644 --- a/lib/poems/point.cpp +++ b/lib/poems/point.cpp @@ -21,8 +21,7 @@ Point::Point(){ position.Zeros(); } -Point::~Point(){ -} +Point::~Point() = default; bool Point::ReadIn(std::istream& in){ return ReadInPointData(in); @@ -39,6 +38,6 @@ Point* NewPoint(int type){ case FIXEDPOINT : // A Fixed Point return new FixedPoint(); default : // error - return 0; + return nullptr; } } diff --git a/lib/poems/prismaticjoint.cpp b/lib/poems/prismaticjoint.cpp index e0a0e7b87a..b40705c8dc 100644 --- a/lib/poems/prismaticjoint.cpp +++ b/lib/poems/prismaticjoint.cpp @@ -27,8 +27,7 @@ PrismaticJoint::PrismaticJoint(){ u.Dim(1); udot.Dim(1); } -PrismaticJoint::~PrismaticJoint(){ -} +PrismaticJoint::~PrismaticJoint() = default; JointType PrismaticJoint::GetType(){ return PRISMATICJOINT; diff --git a/lib/poems/revolutejoint.cpp b/lib/poems/revolutejoint.cpp index eef83dc978..5a4ad3edfd 100644 --- a/lib/poems/revolutejoint.cpp +++ b/lib/poems/revolutejoint.cpp @@ -29,8 +29,7 @@ RevoluteJoint::RevoluteJoint(){ SetAxisPK(axis); } -RevoluteJoint::~RevoluteJoint(){ -} +RevoluteJoint::~RevoluteJoint() = default; JointType RevoluteJoint::GetType(){ return REVOLUTEJOINT; diff --git a/lib/poems/rigidbody.cpp b/lib/poems/rigidbody.cpp index 92963f93da..f5063df1e2 100644 --- a/lib/poems/rigidbody.cpp +++ b/lib/poems/rigidbody.cpp @@ -20,10 +20,8 @@ using namespace std; -RigidBody::RigidBody(){ -} -RigidBody::~RigidBody(){ -} +RigidBody::RigidBody() = default; +RigidBody::~RigidBody() = default; BodyType RigidBody::GetType(){ return RIGIDBODY; diff --git a/lib/poems/rowmatrix.cpp b/lib/poems/rowmatrix.cpp index 41e24911aa..dcd00ce7cb 100644 --- a/lib/poems/rowmatrix.cpp +++ b/lib/poems/rowmatrix.cpp @@ -24,7 +24,7 @@ using namespace std; RowMatrix::RowMatrix(){ numcols = 0; - elements = 0; + elements = nullptr; } RowMatrix::~RowMatrix(){ @@ -33,7 +33,7 @@ RowMatrix::~RowMatrix(){ RowMatrix::RowMatrix(const RowMatrix& A){ // copy constructor numcols = 0; - elements = 0; + elements = nullptr; Dim(A.numcols); for(int i=0;i* b_ele = bodies.GetHeadElement(); - while(b_ele !=0){ + while(b_ele !=nullptr){ out << i << ' '; body = b_ele->value; @@ -200,7 +200,7 @@ void System::WriteOut(ostream& out){ i = 0; Joint* joint; ListElement* j_ele = joints.GetHeadElement(); - while(j_ele !=0){ + while(j_ele !=nullptr){ out << i << ' '; joint = j_ele->value; diff --git a/lib/poems/vect3.cpp b/lib/poems/vect3.cpp index d0cb53ff15..2836c1a9d3 100644 --- a/lib/poems/vect3.cpp +++ b/lib/poems/vect3.cpp @@ -23,8 +23,6 @@ using namespace std; Vect3::Vect3(){ numrows = 3; numcols = 1; } -Vect3::~Vect3(){ -} Vect3::Vect3(const Vect3& A){ // copy constructor numrows = 3; numcols = 1; diff --git a/lib/poems/vect3.h b/lib/poems/vect3.h index 0eb4450174..041de608fb 100644 --- a/lib/poems/vect3.h +++ b/lib/poems/vect3.h @@ -30,7 +30,7 @@ class Vect3 : public VirtualColMatrix { double elements[3]; public: Vect3(); - ~Vect3(); + ~Vect3() = default; Vect3(const Vect3& A); // copy constructor Vect3(const VirtualMatrix& A); // copy constructor diff --git a/lib/poems/vect4.cpp b/lib/poems/vect4.cpp index 86b014d129..249eccf1e1 100644 --- a/lib/poems/vect4.cpp +++ b/lib/poems/vect4.cpp @@ -23,8 +23,6 @@ using namespace std; Vect4::Vect4(){ numrows = 4; numcols = 1; } -Vect4::~Vect4(){ -} Vect4::Vect4(const Vect4& A){ // copy constructor numrows = 4; numcols = 1; diff --git a/lib/poems/vect4.h b/lib/poems/vect4.h index 81a3c2143c..28d37313f1 100644 --- a/lib/poems/vect4.h +++ b/lib/poems/vect4.h @@ -28,7 +28,7 @@ class Vect4 : public VirtualColMatrix { double elements[4]; public: Vect4(); - ~Vect4(); + ~Vect4() = default; Vect4(const Vect4& A); // copy constructor Vect4(const VirtualMatrix& A); // copy constructor diff --git a/lib/poems/vect6.cpp b/lib/poems/vect6.cpp index e3fe07e1ea..611a701198 100644 --- a/lib/poems/vect6.cpp +++ b/lib/poems/vect6.cpp @@ -23,8 +23,6 @@ using namespace std; Vect6::Vect6(){ numrows = 6; numcols = 1; } -Vect6::~Vect6(){ -} Vect6::Vect6(const Vect6& A){ // copy constructor numrows = 6; numcols = 1; diff --git a/lib/poems/vect6.h b/lib/poems/vect6.h index 1127daf80e..16ed576ee8 100644 --- a/lib/poems/vect6.h +++ b/lib/poems/vect6.h @@ -29,7 +29,7 @@ class Vect6 : public VirtualColMatrix { double elements[6]; public: Vect6(); - ~Vect6(); + ~Vect6() = default; Vect6(const Vect6& A); // copy constructor Vect6(const VirtualMatrix& A); // copy constructor diff --git a/lib/poems/virtualcolmatrix.cpp b/lib/poems/virtualcolmatrix.cpp index e004458731..adf7bab3fb 100644 --- a/lib/poems/virtualcolmatrix.cpp +++ b/lib/poems/virtualcolmatrix.cpp @@ -25,9 +25,6 @@ VirtualColMatrix::VirtualColMatrix(){ numcols = 1; } -VirtualColMatrix::~VirtualColMatrix(){ -} - double& VirtualColMatrix::operator_2int(int i, int j){ if(j!=1){ cerr << "matrix index invalid in operator ()" << endl; diff --git a/lib/poems/virtualcolmatrix.h b/lib/poems/virtualcolmatrix.h index e0af8b4ae7..e8e348d9d1 100644 --- a/lib/poems/virtualcolmatrix.h +++ b/lib/poems/virtualcolmatrix.h @@ -25,7 +25,7 @@ class VirtualColMatrix : public VirtualMatrix { public: VirtualColMatrix(); - ~VirtualColMatrix(); + ~VirtualColMatrix() = default; double& operator_2int (int i, int j); // array access double Get_2int (int i, int j) const; void Set_2int (int i, int j, double value); diff --git a/lib/poems/virtualmatrix.cpp b/lib/poems/virtualmatrix.cpp index 938c69c037..89e595e648 100644 --- a/lib/poems/virtualmatrix.cpp +++ b/lib/poems/virtualmatrix.cpp @@ -26,8 +26,7 @@ VirtualMatrix::VirtualMatrix(){ numrows = numcols = 0; } -VirtualMatrix::~VirtualMatrix(){ -} +VirtualMatrix::~VirtualMatrix()= default; int VirtualMatrix::GetNumRows() const { return numrows; diff --git a/lib/poems/virtualrowmatrix.cpp b/lib/poems/virtualrowmatrix.cpp index 6d2976a584..9d52de73f4 100644 --- a/lib/poems/virtualrowmatrix.cpp +++ b/lib/poems/virtualrowmatrix.cpp @@ -26,9 +26,6 @@ VirtualRowMatrix::VirtualRowMatrix(){ numrows = 1; } -VirtualRowMatrix::~VirtualRowMatrix(){ -} - double& VirtualRowMatrix::operator_2int (int i, int j){ if(i!=1){ cerr << "matrix index invalid in operator ()" << endl; diff --git a/lib/poems/virtualrowmatrix.h b/lib/poems/virtualrowmatrix.h index 9b1a3bbc44..122ba910da 100644 --- a/lib/poems/virtualrowmatrix.h +++ b/lib/poems/virtualrowmatrix.h @@ -24,7 +24,7 @@ class VirtualRowMatrix : public VirtualMatrix { public: VirtualRowMatrix(); - ~VirtualRowMatrix(); + ~VirtualRowMatrix() = default; double& operator_2int (int i, int j); // array access double Get_2int(int i, int j) const; void Set_2int(int i, int j, double value); diff --git a/lib/qmmm/pwqmmm.c b/lib/qmmm/pwqmmm.c index 99b2aed513..a00000f655 100644 --- a/lib/qmmm/pwqmmm.c +++ b/lib/qmmm/pwqmmm.c @@ -26,6 +26,8 @@ #error "Unsupported QE coupling API. Want API version 1." #endif +// we need to pass an MPI communicator to the LAMMPS library interface +#define LAMMPS_LIB_MPI #include "library.h" static const char delim[] = " \t\n\r"; @@ -67,8 +69,8 @@ int main(int argc, char **argv) #if 1 // AK: temporary hack if ( qmmmcfg.nmm != 2 ) { if (me == 0) { - fprintf( stderr, "\n Error in the number of processors for MM code" - "\n for the time being only two processor are allowed\n"); + fprintf( stderr, "\n Error in the number of processors for the MM code.\n" + " Currently only requesting 2 MM processors is allowed.\n"); } MPI_Finalize(); return -1; diff --git a/potentials/acks2_ff.water b/potentials/acks2_ff.water new file mode 100644 index 0000000000..b2488bf406 --- /dev/null +++ b/potentials/acks2_ff.water @@ -0,0 +1,83 @@ +DATE: 2021-09-21 UNITS: real CONTRIBUTOR: Stan Moore, stamoor@sandia.gov CITATION: Achtyl et al., Nat. Comm., 6 6539 (2015), COMMENT: Reactive MD-force field: ACKS2 Water + 39 ! Number of general parameters + 50.0000 !Overcoordination parameter + 9.5469 !Overcoordination parameter + 26.5405 !Valency angle conjugation parameter + 1.7224 !Triple bond stabilisation parameter + 6.8702 !Triple bond stabilisation parameter + 60.4850 !C2-correction + 1.0588 !Undercoordination parameter + 4.6000 !Triple bond stabilisation parameter + 12.1176 !Undercoordination parameter + 13.3056 !Undercoordination parameter + -70.5044 !Triple bond stabilization energy + 0.0000 !Lower Taper-radius + 10.0000 !Upper Taper-radius + 2.8793 !Not used + 33.8667 !Valency undercoordination + 6.0891 !Valency angle/lone pair parameter + 1.0563 !Valency angle + 2.0384 !Valency angle parameter + 6.1431 !Not used + 6.9290 !Double bond/angle parameter + 0.3989 !Double bond/angle parameter: overcoord + 3.9954 !Double bond/angle parameter: overcoord + -2.4837 !Not used + 5.7796 !Torsion/BO parameter + 10.0000 !Torsion overcoordination + 1.9487 !Torsion overcoordination + -1.2327 !Conjugation 0 (not used) + 2.1645 !Conjugation + 1.5591 !vdWaals shielding + 0.1000 !Cutoff for bond order (*100) + 2.1365 !Valency angle conjugation parameter + 0.6991 !Overcoordination parameter + 50.0000 !Overcoordination parameter + 1.8512 !Valency/lone pair parameter + 548.6451 !Softness + 20.0000 !Not used + 5.0000 !Molecular energy (not used) + 0.0000 !Molecular energy (not used) + 2.6962 !Valency angle conjugation parameter + 3 ! Nr of atoms; cov.r; valency;a.m;Rvdw;Evdw;gammaEEM;cov.r2;# + alfa;gammavdW;valency;Eunder;Eover;chiEEM;etaEEM;n.u. + cov r3;Elp;Heat inc.;n.u.;n.u.;n.u.;n.u. + ov/un;val1;n.u.;val3,vval4 + H 0.8930 1.0000 1.0080 1.3550 0.0930 0.8203 -0.1000 1.0000 + 8.2230 33.2894 1.0000 0.0000 121.1250 3.7248 9.6093 1.0000 + -0.1000 0.0000 61.6606 3.0408 2.4197 0.0003 3.4114 0.0000 + -19.4571 4.2733 1.0338 1.0000 2.8793 0.0000 0.0000 0.0000 + O 1.2450 2.0000 15.9990 2.3890 0.1000 1.0898 1.0548 6.0000 + 9.7300 13.8449 4.0000 37.5000 116.0768 8.5000 8.3122 2.0000 + 0.9049 0.4056 59.0626 3.5027 0.7640 0.0021 0.9745 0.0000 + -3.5500 2.9000 1.0493 4.0000 2.9225 0.0000 0.0000 0.0000 + X -0.1000 2.0000 1.0080 2.0000 0.0000 1.0000 -0.1000 6.0000 + 10.0000 2.5000 4.0000 0.0000 0.0000 8.5000 1.5000 0.0000 + -0.1000 0.0000 -2.3700 8.7410 13.3640 0.6690 0.9745 0.0000 + -11.0000 2.7466 1.0338 2.0000 2.8793 0.0000 0.0000 0.0000 + 3 ! Nr of bonds; Edis1;LPpen;n.u.;pbe1;pbo5;13corr;pbo6 + pbe2;pbo3;pbo4;n.u.;pbo1;pbo2;ovcorr + 1 1 153.3934 0.0000 0.0000 -0.4600 0.0000 1.0000 6.0000 0.7300 + 6.2500 1.0000 0.0000 1.0000 -0.0790 6.0552 0.0000 0.0000 + 2 2 142.2858 145.0000 50.8293 0.2506 -0.1000 1.0000 29.7503 0.6051 + 0.3451 -0.1055 9.0000 1.0000 -0.1225 5.5000 1.0000 0.0000 + 1 2 160.0000 0.0000 0.0000 -0.5725 0.0000 1.0000 6.0000 0.5626 + 1.1150 1.0000 0.0000 0.0000 -0.0920 4.2790 0.0000 0.0000 + 1 ! Nr of off-diagonal terms; Ediss;Ro;gamma;rsigma;rpi;rpi2 + 1 2 0.0283 1.2885 10.9190 0.9215 -1.0000 -1.0000 + 6 ! Nr of angles;at1;at2;at3;Thetao,o;ka;kb;pv1;pv2 + 1 1 1 0.0000 27.9213 5.8635 0.0000 0.0000 0.0000 1.0400 + 2 2 2 80.7324 30.4554 0.9953 0.0000 1.6310 50.0000 1.0783 + 1 2 2 75.6935 50.0000 2.0000 0.0000 1.0000 0.0000 1.1680 + 1 2 1 85.8000 9.8453 2.2720 0.0000 2.8635 0.0000 1.5800 + 2 1 2 0.0000 15.0000 2.8900 0.0000 0.0000 0.0000 2.8774 + 1 1 2 0.0000 8.5744 3.0000 0.0000 0.0000 0.0000 1.0421 + 6 ! Nr of torsions;at1;at2;at3;at4;;V1;V2;V3;V2(BO);vconj;n.u;n + 1 2 2 1 2.5000 -4.0000 0.9000 -2.5000 -1.0000 0.0000 0.0000 + 1 2 2 2 0.8302 -4.0000 -0.7763 -2.5000 -1.0000 0.0000 0.0000 + 2 2 2 2 -2.5000 -4.0000 1.0000 -2.5000 -1.0000 0.0000 0.0000 + 0 1 1 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 0 1 2 0 0.0000 0.1000 0.0200 -2.5415 0.0000 0.0000 0.0000 + 0 2 2 0 0.5511 25.4150 1.1330 -5.1903 -1.0000 0.0000 0.0000 + 1 ! Nr of hydrogen bonds;at1;at2;at3;Rhb;Dehb;vhb1 + 2 1 2 2.1200 -3.5800 1.4500 19.5000 diff --git a/python/examples/matplotlib_plot.py b/python/examples/matplotlib_plot.py index b85d40c4c4..0c918507ad 100755 --- a/python/examples/matplotlib_plot.py +++ b/python/examples/matplotlib_plot.py @@ -62,7 +62,6 @@ if me == 0: plt.show(block=False) # run nfreq steps at a time w/out pre/post, query compute, refresh plot -import time while ntimestep < nsteps: lmp.command("run %d pre no post no" % nfreq) diff --git a/python/examples/simple.py b/python/examples/simple.py index 861a208895..8925ce48c0 100755 --- a/python/examples/simple.py +++ b/python/examples/simple.py @@ -13,7 +13,6 @@ from __future__ import print_function import sys -import numpy as np import ctypes # parse command line diff --git a/python/lammps/core.py b/python/lammps/core.py index 7dea6e5e6e..fcd5c76ad5 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -99,7 +99,7 @@ class lammps(object): # load a shared object. try: - if ptr: self.lib = CDLL("",RTLD_GLOBAL) + if ptr is not None: self.lib = CDLL("",RTLD_GLOBAL) except OSError: self.lib = None @@ -329,7 +329,7 @@ class lammps(object): # ptr is the desired instance of LAMMPS # just convert it to ctypes ptr and store in self.lmp - if not ptr: + if ptr is None: # with mpi4py v2+, we can pass MPI communicators to LAMMPS # need to adjust for type of MPI communicator object @@ -338,7 +338,7 @@ class lammps(object): from mpi4py import MPI self.MPI = MPI - if comm: + if comm is not None: if not self.has_mpi_support: raise Exception('LAMMPS not compiled with real MPI library') if not self.has_mpi4py: @@ -354,7 +354,7 @@ class lammps(object): narg = 0 cargs = None - if cmdargs: + if cmdargs is not None: cmdargs.insert(0,"lammps") narg = len(cmdargs) for i in range(narg): @@ -376,7 +376,7 @@ class lammps(object): if self.has_mpi4py and self.has_mpi_support: self.comm = self.MPI.COMM_WORLD self.opened = 1 - if cmdargs: + if cmdargs is not None: cmdargs.insert(0,"lammps") narg = len(cmdargs) for i in range(narg): @@ -1361,7 +1361,7 @@ class lammps(object): This function is a wrapper around the :cpp:func:`lammps_create_atoms` function of the C-library interface, and the behavior is similar except that the *v*, *image*, and *shrinkexceed* arguments are optional and - default to *None*, *None*, and *False*, respectively. With none being + default to *None*, *None*, and *False*, respectively. With *None* being equivalent to a ``NULL`` pointer in C. The lists of coordinates, types, atom IDs, velocities, image flags can @@ -1389,7 +1389,7 @@ class lammps(object): :return: number of atoms created. 0 if insufficient or invalid data :rtype: int """ - if id: + if id is not None: id_lmp = (self.c_tagint*n)() try: id_lmp[:] = id[0:n] @@ -1411,7 +1411,7 @@ class lammps(object): except ValueError: return 0 - if v: + if v is not None: v_lmp = (c_double*(three_n))() try: v_lmp[:] = v[0:three_n] @@ -1420,7 +1420,7 @@ class lammps(object): else: v_lmp = None - if image: + if image is not None: img_lmp = (self.c_imageint*n)() try: img_lmp[:] = image[0:n] diff --git a/python/lammps/pylammps.py b/python/lammps/pylammps.py index a6e3578aef..abd4d6da98 100644 --- a/python/lammps/pylammps.py +++ b/python/lammps/pylammps.py @@ -854,30 +854,30 @@ class IPyLammps(PyLammps): """ cmd_args = [group, "image", filename, color, diameter] - if size: + if size is not None: width = size[0] height = size[1] cmd_args += ["size", width, height] - if view: + if view is not None: theta = view[0] phi = view[1] cmd_args += ["view", theta, phi] - if center: + if center is not None: flag = center[0] Cx = center[1] Cy = center[2] Cz = center[3] cmd_args += ["center", flag, Cx, Cy, Cz] - if up: + if up is not None: Ux = up[0] Uy = up[1] Uz = up[2] cmd_args += ["up", Ux, Uy, Uz] - if zoom: + if zoom is not None: cmd_args += ["zoom", zoom] cmd_args.append("modify backcolor " + background_color) diff --git a/src/.gitignore b/src/.gitignore index 174ee35be5..7da6b7feb7 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -27,6 +27,9 @@ /*_ssa.h /*_ssa.cpp +!accelerator_kokkos.h +!accelerator_omp.h + /fix_mdi_engine.cpp /fix_mdi_engine.h /library_mdi.cpp @@ -202,7 +205,6 @@ /plugin.cpp /plugin.h -/lammpsplugin.h /atom_vec_spin.cpp /atom_vec_spin.h @@ -265,8 +267,6 @@ /fix_drag.h /fix_numdiff.cpp /fix_numdiff.h -/fix_nve_noforce.cpp -/fix_nve_noforce.h /fix_spring_rg.cpp /fix_spring_rg.h /fix_temp_csld.cpp @@ -367,8 +367,6 @@ /atom_vec_dpd.h /atom_vec_electron.cpp /atom_vec_electron.h -/atom_vec_ellipsoid.cpp -/atom_vec_ellipsoid.h /atom_vec_full.cpp /atom_vec_full.h /atom_vec_full_hars.cpp @@ -535,8 +533,6 @@ /dihedral_harmonic.h /dihedral_helix.cpp /dihedral_helix.h -/dihedral_hybrid.cpp -/dihedral_hybrid.h /dihedral_multi_harmonic.cpp /dihedral_multi_harmonic.h /dihedral_nharmonic.cpp @@ -613,6 +609,8 @@ /fft3d_wrap.h /fix_accelerate_cos.cpp /fix_accelerate_cos.h +/fix_acks2_reaxff.cpp +/fix_acks2_reaxff.h /fix_adapt_fep.cpp /fix_adapt_fep.h /fix_addtorque.cpp @@ -883,8 +881,6 @@ /fix_widom.cpp /fix_widom.h /gpu_extra.h -/gridcomm.cpp -/gridcomm.h /group_ndx.cpp /group_ndx.h /gz_file_writer.cpp @@ -909,8 +905,6 @@ /improper_fourier.h /improper_harmonic.cpp /improper_harmonic.h -/improper_hybrid.cpp -/improper_hybrid.h /improper_inversion_harmonic.cpp /improper_inversion_harmonic.h /improper_ring.cpp @@ -1332,8 +1326,6 @@ /thr_data.h /verlet_split.cpp /verlet_split.h -/write_dump.cpp -/write_dump.h /xdr_compat.cpp /xdr_compat.h /zstd_file_writer.cpp @@ -1403,6 +1395,8 @@ /fix_drude_transform.h /fix_langevin_drude.cpp /fix_langevin_drude.h +/fix_mol_swap.cpp +/fix_mol_swap.h /fix_pimd.cpp /fix_pimd.h /fix_qbmsst.cpp diff --git a/src/AWPMD/pair_awpmd_cut.cpp b/src/AWPMD/pair_awpmd_cut.cpp index 682a0dd3d6..15cd316f12 100644 --- a/src/AWPMD/pair_awpmd_cut.cpp +++ b/src/AWPMD/pair_awpmd_cut.cpp @@ -246,8 +246,8 @@ void PairAWPMDCut::compute(int eflag, int vflag) fi= new Vector_3[wpmd->ni]; // adding electrons - for (std::map >::iterator it=etmap.begin(); it!= etmap.end(); ++it) { - std::vector &el=it->second; + for (auto & it : etmap) { + std::vector &el=it.second; if (!el.size()) // should not happen continue; int s=spin[el[0]] >0 ? 0 : 1; diff --git a/src/BOCS/fix_bocs.cpp b/src/BOCS/fix_bocs.cpp index 786ff216b0..61339cd31a 100644 --- a/src/BOCS/fix_bocs.cpp +++ b/src/BOCS/fix_bocs.cpp @@ -637,7 +637,7 @@ int FixBocs::read_F_table( char *filename, int p_basis_type ) char line[MAX_F_TABLE_LINE_LENGTH]; std::vector inputLines; while (fgets(line, MAX_F_TABLE_LINE_LENGTH, fpi)) { - inputLines.push_back(std::string(line)); + inputLines.emplace_back(line); } fclose(fpi); diff --git a/src/BROWNIAN/fix_brownian.cpp b/src/BROWNIAN/fix_brownian.cpp index 4994b304e1..d4bdefca8b 100644 --- a/src/BROWNIAN/fix_brownian.cpp +++ b/src/BROWNIAN/fix_brownian.cpp @@ -45,7 +45,7 @@ void FixBrownian::init() { FixBrownianBase::init(); g1 /= gamma_t; - g2 *= sqrt(gamma_t); + g2 /= sqrt(gamma_t); } /* ---------------------------------------------------------------------- */ diff --git a/src/CG-DNA/atom_vec_oxdna.cpp b/src/CG-DNA/atom_vec_oxdna.cpp index e1c99d7ca5..120fe5d9ac 100644 --- a/src/CG-DNA/atom_vec_oxdna.cpp +++ b/src/CG-DNA/atom_vec_oxdna.cpp @@ -52,9 +52,6 @@ AtomVecOxdna::AtomVecOxdna(LAMMPS *lmp) : AtomVec(lmp) error->warning(FLERR, "Write_data command requires newton on to preserve 3'->5' bond polarity"); } -/* ---------------------------------------------------------------------- */ -AtomVecOxdna::~AtomVecOxdna() {} - /* ---------------------------------------------------------------------- set local copies of all grow ptrs used by this class, except defaults needed in replicate when 2 atom classes exist and it calls pack_restart() diff --git a/src/CG-DNA/atom_vec_oxdna.h b/src/CG-DNA/atom_vec_oxdna.h index f05f6d2013..c100abdfff 100644 --- a/src/CG-DNA/atom_vec_oxdna.h +++ b/src/CG-DNA/atom_vec_oxdna.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class AtomVecOxdna : public AtomVec { public: AtomVecOxdna(class LAMMPS *); - ~AtomVecOxdna(); + ~AtomVecOxdna() = default; void grow_pointers(); void data_atom_post(int); diff --git a/src/COLVARS/fix_colvars.cpp b/src/COLVARS/fix_colvars.cpp index 32211f7689..6d6799b43e 100644 --- a/src/COLVARS/fix_colvars.cpp +++ b/src/COLVARS/fix_colvars.cpp @@ -303,7 +303,7 @@ FixColvars::FixColvars(LAMMPS *lmp, int narg, char **arg) : me = comm->me; root2root = MPI_COMM_NULL; - conf_file = strdup(arg[3]); + conf_file = utils::strdup(arg[3]); rng_seed = 1966; unwrap_flag = 1; @@ -319,22 +319,22 @@ FixColvars::FixColvars(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Missing argument to keyword"); if (0 == strcmp(arg[iarg], "input")) { - inp_name = strdup(arg[iarg+1]); + inp_name = utils::strdup(arg[iarg+1]); } else if (0 == strcmp(arg[iarg], "output")) { - out_name = strdup(arg[iarg+1]); + out_name = utils::strdup(arg[iarg+1]); } else if (0 == strcmp(arg[iarg], "seed")) { rng_seed = utils::inumeric(FLERR,arg[iarg+1],false,lmp); } else if (0 == strcmp(arg[iarg], "unwrap")) { unwrap_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); } else if (0 == strcmp(arg[iarg], "tstat")) { - tmp_name = strdup(arg[iarg+1]); + tmp_name = utils::strdup(arg[iarg+1]); } else { error->all(FLERR,"Unknown fix colvars parameter"); } ++iarg; ++iarg; } - if (!out_name) out_name = strdup("out"); + if (!out_name) out_name = utils::strdup("out"); /* initialize various state variables. */ tstat_id = -1; @@ -359,10 +359,10 @@ FixColvars::FixColvars(LAMMPS *lmp, int narg, char **arg) : FixColvars::~FixColvars() { - memory->sfree(conf_file); - memory->sfree(inp_name); - memory->sfree(out_name); - memory->sfree(tmp_name); + delete[] conf_file; + delete[] inp_name; + delete[] out_name; + delete[] tmp_name; memory->sfree(comm_buf); if (proxy) { @@ -430,17 +430,15 @@ void FixColvars::one_time_init() // create and initialize the colvars proxy if (me == 0) { - if (screen) fputs("colvars: Creating proxy instance\n",screen); - if (logfile) fputs("colvars: Creating proxy instance\n",logfile); + utils::logmesg(lmp,"colvars: Creating proxy instance\n"); #ifdef LAMMPS_BIGBIG - if (screen) fputs("colvars: cannot handle atom ids > 2147483647\n",screen); - if (logfile) fputs("colvars: cannot handle atom ids > 2147483647\n",logfile); + utils::logmesg(lmp,"colvars: cannot handle atom ids > 2147483647\n"); #endif if (inp_name) { if (strcmp(inp_name,"NULL") == 0) { - memory->sfree(inp_name); + delete[] inp_name; inp_name = nullptr; } } @@ -458,8 +456,7 @@ void FixColvars::one_time_init() } } - proxy = new colvarproxy_lammps(lmp,inp_name,out_name, - rng_seed,t_target,root2root); + proxy = new colvarproxy_lammps(lmp,inp_name,out_name,rng_seed,t_target,root2root); proxy->init(conf_file); num_coords = (proxy->modify_atom_positions()->size()); diff --git a/src/COMPRESS/dump_atom_gz.cpp b/src/COMPRESS/dump_atom_gz.cpp index 38229a71bb..8bdc025436 100644 --- a/src/COMPRESS/dump_atom_gz.cpp +++ b/src/COMPRESS/dump_atom_gz.cpp @@ -27,13 +27,9 @@ DumpAtomGZ::DumpAtomGZ(LAMMPS *lmp, int narg, char **arg) : DumpAtom(lmp, narg, if (!compressed) error->all(FLERR, "Dump atom/gz only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpAtomGZ::~DumpAtomGZ() {} - /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ diff --git a/src/COMPRESS/dump_atom_gz.h b/src/COMPRESS/dump_atom_gz.h index 777c34345a..2b87e36f1d 100644 --- a/src/COMPRESS/dump_atom_gz.h +++ b/src/COMPRESS/dump_atom_gz.h @@ -28,7 +28,7 @@ namespace LAMMPS_NS { class DumpAtomGZ : public DumpAtom { public: DumpAtomGZ(class LAMMPS *, int, char **); - virtual ~DumpAtomGZ(); + virtual ~DumpAtomGZ() = default; protected: GzFileWriter writer; diff --git a/src/COMPRESS/dump_atom_zstd.cpp b/src/COMPRESS/dump_atom_zstd.cpp index a23ea2025b..aa1c161d73 100644 --- a/src/COMPRESS/dump_atom_zstd.cpp +++ b/src/COMPRESS/dump_atom_zstd.cpp @@ -33,10 +33,6 @@ DumpAtomZstd::DumpAtomZstd(LAMMPS *lmp, int narg, char **arg) : DumpAtom(lmp, na if (!compressed) error->all(FLERR, "Dump atom/zstd only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpAtomZstd::~DumpAtomZstd() {} - /* ---------------------------------------------------------------------- generic opening of a dump file ASCII or binary or compressed diff --git a/src/COMPRESS/dump_atom_zstd.h b/src/COMPRESS/dump_atom_zstd.h index 4a85089167..fb2da0c83b 100644 --- a/src/COMPRESS/dump_atom_zstd.h +++ b/src/COMPRESS/dump_atom_zstd.h @@ -34,7 +34,7 @@ namespace LAMMPS_NS { class DumpAtomZstd : public DumpAtom { public: DumpAtomZstd(class LAMMPS *, int, char **); - virtual ~DumpAtomZstd(); + virtual ~DumpAtomZstd() = default; protected: ZstdFileWriter writer; diff --git a/src/COMPRESS/dump_cfg_gz.cpp b/src/COMPRESS/dump_cfg_gz.cpp index ea51ce87c3..8d85e8cf83 100644 --- a/src/COMPRESS/dump_cfg_gz.cpp +++ b/src/COMPRESS/dump_cfg_gz.cpp @@ -29,13 +29,9 @@ DumpCFGGZ::DumpCFGGZ(LAMMPS *lmp, int narg, char **arg) : DumpCFG(lmp, narg, arg if (!compressed) error->all(FLERR, "Dump cfg/gz only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpCFGGZ::~DumpCFGGZ() {} - /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ diff --git a/src/COMPRESS/dump_cfg_gz.h b/src/COMPRESS/dump_cfg_gz.h index ccd40141eb..153a4490c6 100644 --- a/src/COMPRESS/dump_cfg_gz.h +++ b/src/COMPRESS/dump_cfg_gz.h @@ -28,7 +28,7 @@ namespace LAMMPS_NS { class DumpCFGGZ : public DumpCFG { public: DumpCFGGZ(class LAMMPS *, int, char **); - virtual ~DumpCFGGZ(); + virtual ~DumpCFGGZ() = default; protected: GzFileWriter writer; diff --git a/src/COMPRESS/dump_cfg_zstd.cpp b/src/COMPRESS/dump_cfg_zstd.cpp index 73ee3e7e11..6d70749479 100644 --- a/src/COMPRESS/dump_cfg_zstd.cpp +++ b/src/COMPRESS/dump_cfg_zstd.cpp @@ -35,10 +35,6 @@ DumpCFGZstd::DumpCFGZstd(LAMMPS *lmp, int narg, char **arg) : DumpCFG(lmp, narg, if (!compressed) error->all(FLERR, "Dump cfg/zstd only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpCFGZstd::~DumpCFGZstd() {} - /* ---------------------------------------------------------------------- generic opening of a dump file ASCII or binary or compressed diff --git a/src/COMPRESS/dump_cfg_zstd.h b/src/COMPRESS/dump_cfg_zstd.h index ddcb06f00e..32013b274e 100644 --- a/src/COMPRESS/dump_cfg_zstd.h +++ b/src/COMPRESS/dump_cfg_zstd.h @@ -33,7 +33,7 @@ namespace LAMMPS_NS { class DumpCFGZstd : public DumpCFG { public: DumpCFGZstd(class LAMMPS *, int, char **); - virtual ~DumpCFGZstd(); + virtual ~DumpCFGZstd() = default; protected: ZstdFileWriter writer; diff --git a/src/COMPRESS/dump_custom_gz.cpp b/src/COMPRESS/dump_custom_gz.cpp index 7cbab10cb4..a8ef1ffe7c 100644 --- a/src/COMPRESS/dump_custom_gz.cpp +++ b/src/COMPRESS/dump_custom_gz.cpp @@ -27,13 +27,9 @@ DumpCustomGZ::DumpCustomGZ(LAMMPS *lmp, int narg, char **arg) : DumpCustom(lmp, if (!compressed) error->all(FLERR, "Dump custom/gz only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpCustomGZ::~DumpCustomGZ() {} - /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ diff --git a/src/COMPRESS/dump_custom_gz.h b/src/COMPRESS/dump_custom_gz.h index 10455eb8db..660af8bfae 100644 --- a/src/COMPRESS/dump_custom_gz.h +++ b/src/COMPRESS/dump_custom_gz.h @@ -28,7 +28,7 @@ namespace LAMMPS_NS { class DumpCustomGZ : public DumpCustom { public: DumpCustomGZ(class LAMMPS *, int, char **); - virtual ~DumpCustomGZ(); + virtual ~DumpCustomGZ() = default; protected: GzFileWriter writer; diff --git a/src/COMPRESS/dump_custom_zstd.cpp b/src/COMPRESS/dump_custom_zstd.cpp index 8b7d153fc4..c6c7e3592e 100644 --- a/src/COMPRESS/dump_custom_zstd.cpp +++ b/src/COMPRESS/dump_custom_zstd.cpp @@ -37,15 +37,9 @@ DumpCustomZstd::DumpCustomZstd(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Dump custom/zstd only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpCustomZstd::~DumpCustomZstd() -{ -} - /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ diff --git a/src/COMPRESS/dump_custom_zstd.h b/src/COMPRESS/dump_custom_zstd.h index a687cfb928..f179223265 100644 --- a/src/COMPRESS/dump_custom_zstd.h +++ b/src/COMPRESS/dump_custom_zstd.h @@ -34,7 +34,7 @@ namespace LAMMPS_NS { class DumpCustomZstd : public DumpCustom { public: DumpCustomZstd(class LAMMPS *, int, char **); - virtual ~DumpCustomZstd(); + virtual ~DumpCustomZstd() = default; protected: ZstdFileWriter writer; diff --git a/src/COMPRESS/dump_local_gz.cpp b/src/COMPRESS/dump_local_gz.cpp index 206e2aeb09..c3669e6157 100644 --- a/src/COMPRESS/dump_local_gz.cpp +++ b/src/COMPRESS/dump_local_gz.cpp @@ -27,13 +27,9 @@ DumpLocalGZ::DumpLocalGZ(LAMMPS *lmp, int narg, char **arg) : DumpLocal(lmp, nar if (!compressed) error->all(FLERR, "Dump local/gz only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpLocalGZ::~DumpLocalGZ() {} - /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ diff --git a/src/COMPRESS/dump_local_gz.h b/src/COMPRESS/dump_local_gz.h index a6b1b118b7..e2e7a028aa 100644 --- a/src/COMPRESS/dump_local_gz.h +++ b/src/COMPRESS/dump_local_gz.h @@ -28,7 +28,7 @@ namespace LAMMPS_NS { class DumpLocalGZ : public DumpLocal { public: DumpLocalGZ(class LAMMPS *, int, char **); - virtual ~DumpLocalGZ(); + virtual ~DumpLocalGZ() = default; protected: GzFileWriter writer; diff --git a/src/COMPRESS/dump_local_zstd.cpp b/src/COMPRESS/dump_local_zstd.cpp index 91fb36bb6e..63af89afcc 100644 --- a/src/COMPRESS/dump_local_zstd.cpp +++ b/src/COMPRESS/dump_local_zstd.cpp @@ -33,13 +33,9 @@ DumpLocalZstd::DumpLocalZstd(LAMMPS *lmp, int narg, char **arg) : DumpLocal(lmp, if (!compressed) error->all(FLERR, "Dump local/zstd only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpLocalZstd::~DumpLocalZstd() {} - /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ diff --git a/src/COMPRESS/dump_local_zstd.h b/src/COMPRESS/dump_local_zstd.h index c14e58fd71..fb4f017b3d 100644 --- a/src/COMPRESS/dump_local_zstd.h +++ b/src/COMPRESS/dump_local_zstd.h @@ -34,7 +34,7 @@ namespace LAMMPS_NS { class DumpLocalZstd : public DumpLocal { public: DumpLocalZstd(class LAMMPS *, int, char **); - virtual ~DumpLocalZstd(); + virtual ~DumpLocalZstd() = default; protected: ZstdFileWriter writer; diff --git a/src/COMPRESS/dump_xyz_gz.cpp b/src/COMPRESS/dump_xyz_gz.cpp index a1acad7fc2..9d38c4673c 100644 --- a/src/COMPRESS/dump_xyz_gz.cpp +++ b/src/COMPRESS/dump_xyz_gz.cpp @@ -26,13 +26,9 @@ DumpXYZGZ::DumpXYZGZ(LAMMPS *lmp, int narg, char **arg) : DumpXYZ(lmp, narg, arg if (!compressed) error->all(FLERR, "Dump xyz/gz only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpXYZGZ::~DumpXYZGZ() {} - /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ diff --git a/src/COMPRESS/dump_xyz_gz.h b/src/COMPRESS/dump_xyz_gz.h index 5fe60ced6f..62a25cfc66 100644 --- a/src/COMPRESS/dump_xyz_gz.h +++ b/src/COMPRESS/dump_xyz_gz.h @@ -28,7 +28,7 @@ namespace LAMMPS_NS { class DumpXYZGZ : public DumpXYZ { public: DumpXYZGZ(class LAMMPS *, int, char **); - virtual ~DumpXYZGZ(); + virtual ~DumpXYZGZ() = default; protected: GzFileWriter writer; diff --git a/src/COMPRESS/dump_xyz_zstd.cpp b/src/COMPRESS/dump_xyz_zstd.cpp index 534bc0ee56..bcbdc08a24 100644 --- a/src/COMPRESS/dump_xyz_zstd.cpp +++ b/src/COMPRESS/dump_xyz_zstd.cpp @@ -32,13 +32,9 @@ DumpXYZZstd::DumpXYZZstd(LAMMPS *lmp, int narg, char **arg) : DumpXYZ(lmp, narg, if (!compressed) error->all(FLERR, "Dump xyz/zstd only writes compressed files"); } -/* ---------------------------------------------------------------------- */ - -DumpXYZZstd::~DumpXYZZstd() {} - /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ diff --git a/src/COMPRESS/dump_xyz_zstd.h b/src/COMPRESS/dump_xyz_zstd.h index add279c4e7..110e27ab8f 100644 --- a/src/COMPRESS/dump_xyz_zstd.h +++ b/src/COMPRESS/dump_xyz_zstd.h @@ -34,7 +34,7 @@ namespace LAMMPS_NS { class DumpXYZZstd : public DumpXYZ { public: DumpXYZZstd(class LAMMPS *, int, char **); - virtual ~DumpXYZZstd(); + virtual ~DumpXYZZstd() = default; protected: ZstdFileWriter writer; diff --git a/src/DIELECTRIC/fix_polarize_bem_icc.cpp b/src/DIELECTRIC/fix_polarize_bem_icc.cpp index 35171c0a19..7bd6ff25bd 100644 --- a/src/DIELECTRIC/fix_polarize_bem_icc.cpp +++ b/src/DIELECTRIC/fix_polarize_bem_icc.cpp @@ -93,10 +93,6 @@ FixPolarizeBEMICC::FixPolarizeBEMICC(LAMMPS *lmp, int narg, char **arg) : Fix(lm /* ---------------------------------------------------------------------- */ -FixPolarizeBEMICC::~FixPolarizeBEMICC() {} - -/* ---------------------------------------------------------------------- */ - int FixPolarizeBEMICC::setmask() { int mask = 0; diff --git a/src/DIELECTRIC/fix_polarize_bem_icc.h b/src/DIELECTRIC/fix_polarize_bem_icc.h index 6ba6acb1a0..df04b52fdf 100644 --- a/src/DIELECTRIC/fix_polarize_bem_icc.h +++ b/src/DIELECTRIC/fix_polarize_bem_icc.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class FixPolarizeBEMICC : public Fix { public: FixPolarizeBEMICC(class LAMMPS *, int, char **); - ~FixPolarizeBEMICC(); + ~FixPolarizeBEMICC() = default; virtual int setmask(); virtual void init(); virtual void setup(int); diff --git a/src/DIFFRACTION/compute_saed.cpp b/src/DIFFRACTION/compute_saed.cpp index e5af83ca92..e2df7fe3b8 100644 --- a/src/DIFFRACTION/compute_saed.cpp +++ b/src/DIFFRACTION/compute_saed.cpp @@ -31,7 +31,6 @@ #include #include -#include // for strcasecmp() #include "omp_compat.h" using namespace LAMMPS_NS; @@ -85,13 +84,13 @@ ComputeSAED::ComputeSAED(LAMMPS *lmp, int narg, char **arg) : ztype[i] = SAEDmaxType + 1; } for (int i=0; iall(FLERR,"Compute SAED: Invalid ASF atom type"); + } + if (ztype[i] == SAEDmaxType + 1) + error->all(FLERR,"Compute SAED: Invalid ASF atom type"); iarg++; } @@ -348,7 +347,7 @@ void ComputeSAED::compute_vector() if (me == 0 && echo) utils::logmesg(lmp,"-----\nComputing SAED intensities"); - double t0 = MPI_Wtime(); + double t0 = platform::walltime(); double *Fvec = new double[2*nRows]; // Strct factor (real & imaginary) // -- Note, vector entries correspond to different RELP @@ -491,7 +490,7 @@ void ComputeSAED::compute_vector() vector[i] = (scratch[2*i] * scratch[2*i] + scratch[2*i+1] * scratch[2*i+1]) / natoms; } - double t2 = MPI_Wtime(); + double t2 = platform::walltime(); // compute memory usage per processor double bytes = memory_usage(); diff --git a/src/DIFFRACTION/compute_xrd.cpp b/src/DIFFRACTION/compute_xrd.cpp index c6cf7be2ce..d798c2f4db 100644 --- a/src/DIFFRACTION/compute_xrd.cpp +++ b/src/DIFFRACTION/compute_xrd.cpp @@ -32,7 +32,6 @@ #include #include -#include // for strcasecmp() #include "omp_compat.h" using namespace LAMMPS_NS; @@ -87,7 +86,7 @@ ComputeXRD::ComputeXRD(LAMMPS *lmp, int narg, char **arg) : } for (int i = 0; i < ntypes; i++) { for (int j = 0; j < XRDmaxType; j++) { - if (strcasecmp(arg[iarg],XRDtypeList[j]) == 0) { + if (utils::lowercase(arg[iarg]) == utils::lowercase(XRDtypeList[j])) { ztype[i] = j; } } @@ -300,7 +299,7 @@ void ComputeXRD::compute_array() if (me == 0 && echo) utils::logmesg(lmp, "-----\nComputing XRD intensities"); - double t0 = MPI_Wtime(); + double t0 = platform::walltime(); double *Fvec = new double[2*size_array_rows]; // Strct factor (real & imaginary) // -- Note: array rows correspond to different RELP @@ -496,7 +495,7 @@ void ComputeXRD::compute_array() array[i][1] = (scratch[2*i] * scratch[2*i] + scratch[2*i+1] * scratch[2*i+1]) / natoms; } - double t2 = MPI_Wtime(); + double t2 = platform::walltime(); // compute memory usage per processor double bytes = memory_usage(); diff --git a/src/DIFFRACTION/fix_saed_vtk.cpp b/src/DIFFRACTION/fix_saed_vtk.cpp index 2e7d0897a6..89627b64ef 100644 --- a/src/DIFFRACTION/fix_saed_vtk.cpp +++ b/src/DIFFRACTION/fix_saed_vtk.cpp @@ -31,6 +31,7 @@ #include #include + using namespace LAMMPS_NS; using namespace FixConst; @@ -100,8 +101,6 @@ FixSAEDVTK::FixSAEDVTK(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Illegal fix saed/vtk command"); if (nfreq % nevery || nrepeat*nevery > nfreq) error->all(FLERR,"Illegal fix saed/vtk command"); - if (ave != RUNNING && overwrite) - error->all(FLERR,"Illegal fix saed/vtk command"); // allocate memory for averaging @@ -315,7 +314,7 @@ void FixSAEDVTK::invoke_vector(bigint ntimestep) if (irepeat == 0) for (int i = 0; i < nrows; i++) - vector[i] = 0.0; + vector[i] = 0.0; // accumulate results of computes,fixes,variables to local copy // compute/fix/variable may invoke computes so wrap with clear/add @@ -369,7 +368,7 @@ void FixSAEDVTK::invoke_vector(bigint ntimestep) for (int i = 0; i < nrows; i++) { vector_total[i] += vector[i]; if (window_limit) vector_total[i] -= vector_list[iwindow][i]; - vector_list[iwindow][i] = vector[i]; + vector_list[iwindow][i] = vector[i]; } iwindow++; @@ -391,8 +390,7 @@ void FixSAEDVTK::invoke_vector(bigint ntimestep) fp = fopen(nName.c_str(),"w"); if (fp == nullptr) - error->one(FLERR,"Cannot open fix saed/vtk file {}: {}", - nName,utils::getsyserror()); + error->one(FLERR,"Cannot open fix saed/vtk file {}: {}", nName,utils::getsyserror()); } fprintf(fp,"# vtk DataFile Version 3.0 c_%s\n",ids); @@ -406,71 +404,68 @@ void FixSAEDVTK::invoke_vector(bigint ntimestep) fprintf(fp,"SCALARS intensity float\n"); fprintf(fp,"LOOKUP_TABLE default\n"); - filepos = ftell(fp); - if (overwrite) fseek(fp,filepos,SEEK_SET); + // Finding the intersection of the reciprical space and Ewald sphere + int NROW1 = 0; + int NROW2 = 0; + double dinv2 = 0.0; + double r = 0.0; + double K[3]; - // Finding the intersection of the reciprical space and Ewald sphere - int NROW1 = 0; - int NROW2 = 0; - double dinv2 = 0.0; - double r = 0.0; - double K[3]; - - // Zone flag to capture entire recrocal space volume - if ((Zone[0] == 0) && (Zone[1] == 0) && (Zone[2] == 0)) { - for (int k = Knmin[2]; k <= Knmax[2]; k++) { - for (int j = Knmin[1]; j <= Knmax[1]; j++) { - for (int i = Knmin[0]; i <= Knmax[0]; i++) { - K[0] = i * dK[0]; - K[1] = j * dK[1]; - K[2] = k * dK[2]; - dinv2 = (K[0] * K[0] + K[1] * K[1] + K[2] * K[2]); - if (dinv2 < Kmax * Kmax) { - fprintf(fp,"%g\n",vector_total[NROW1]/norm); - fflush(fp); - NROW1++; - NROW2++; - } else { + // Zone flag to capture entire recrocal space volume + if ((Zone[0] == 0) && (Zone[1] == 0) && (Zone[2] == 0)) { + for (int k = Knmin[2]; k <= Knmax[2]; k++) { + for (int j = Knmin[1]; j <= Knmax[1]; j++) { + for (int i = Knmin[0]; i <= Knmax[0]; i++) { + K[0] = i * dK[0]; + K[1] = j * dK[1]; + K[2] = k * dK[2]; + dinv2 = (K[0] * K[0] + K[1] * K[1] + K[2] * K[2]); + if (dinv2 < Kmax * Kmax) { + fprintf(fp,"%g\n",vector_total[NROW1]/norm); + fflush(fp); + NROW1++; + NROW2++; + } else { fprintf(fp,"%d\n",-1); fflush(fp); NROW2++; - } } } } - } else { - for (int k = Knmin[2]; k <= Knmax[2]; k++) { - for (int j = Knmin[1]; j <= Knmax[1]; j++) { - for (int i = Knmin[0]; i <= Knmax[0]; i++) { - K[0] = i * dK[0]; - K[1] = j * dK[1]; - K[2] = k * dK[2]; - dinv2 = (K[0] * K[0] + K[1] * K[1] + K[2] * K[2]); - if (dinv2 < Kmax * Kmax) { - r=0.0; - for (int m=0; m<3; m++) r += pow(K[m] - Zone[m],2.0); - r = sqrt(r); - if ( (r > (R_Ewald - dR_Ewald) ) && (r < (R_Ewald + dR_Ewald) )) { - fprintf(fp,"%g\n",vector_total[NROW1]/norm); - fflush(fp); - NROW2++; - NROW1++; - } else { - fprintf(fp,"%d\n",-1); - fflush(fp); - NROW2++; - } + } + } else { + for (int k = Knmin[2]; k <= Knmax[2]; k++) { + for (int j = Knmin[1]; j <= Knmax[1]; j++) { + for (int i = Knmin[0]; i <= Knmax[0]; i++) { + K[0] = i * dK[0]; + K[1] = j * dK[1]; + K[2] = k * dK[2]; + dinv2 = (K[0] * K[0] + K[1] * K[1] + K[2] * K[2]); + if (dinv2 < Kmax * Kmax) { + r=0.0; + for (int m=0; m<3; m++) r += pow(K[m] - Zone[m],2.0); + r = sqrt(r); + if ( (r > (R_Ewald - dR_Ewald) ) && (r < (R_Ewald + dR_Ewald) )) { + fprintf(fp,"%g\n",vector_total[NROW1]/norm); + fflush(fp); + NROW2++; + NROW1++; } else { + fprintf(fp,"%d\n",-1); + fflush(fp); + NROW2++; + } + } else { fprintf(fp,"%d\n",-1); fflush(fp); NROW2++; - } } } } } } + } nOutput++; } @@ -497,7 +492,6 @@ void FixSAEDVTK::options(int narg, char **arg) fp = nullptr; ave = ONE; startstep = 0; - overwrite = 0; // optional args int iarg = 7; @@ -534,9 +528,6 @@ void FixSAEDVTK::options(int narg, char **arg) if (iarg+2 > narg) error->all(FLERR,"Illegal fix saed/vtk command"); startstep = utils::inumeric(FLERR,arg[iarg+1],false,lmp); iarg += 2; - } else if (strcmp(arg[iarg],"overwrite") == 0) { - overwrite = 1; - iarg += 1; } else error->all(FLERR,"Illegal fix saed/vtk command"); } } diff --git a/src/DIFFRACTION/fix_saed_vtk.h b/src/DIFFRACTION/fix_saed_vtk.h index 07aebce63d..a5691ea986 100644 --- a/src/DIFFRACTION/fix_saed_vtk.h +++ b/src/DIFFRACTION/fix_saed_vtk.h @@ -43,8 +43,6 @@ class FixSAEDVTK : public Fix { int nrows; int ave, nwindow, nsum, startstep; - int overwrite; - long filepos; int norm, iwindow, window_limit; double *vector; diff --git a/src/DPD-MESO/fix_edpd_source.cpp b/src/DPD-MESO/fix_edpd_source.cpp index 0ad303516a..83ff896ff9 100644 --- a/src/DPD-MESO/fix_edpd_source.cpp +++ b/src/DPD-MESO/fix_edpd_source.cpp @@ -61,12 +61,6 @@ FixEDPDSource::FixEDPDSource(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixEDPDSource::~FixEDPDSource() -{ -} - -/* ---------------------------------------------------------------------- */ - int FixEDPDSource::setmask() { int mask = 0; diff --git a/src/DPD-MESO/fix_edpd_source.h b/src/DPD-MESO/fix_edpd_source.h index 0d6fab1d9d..13eecc7c56 100644 --- a/src/DPD-MESO/fix_edpd_source.h +++ b/src/DPD-MESO/fix_edpd_source.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class FixEDPDSource : public Fix { public: FixEDPDSource(class LAMMPS *, int, char **); - ~FixEDPDSource(); + ~FixEDPDSource() = default; int setmask(); void init(); void post_force(int); diff --git a/src/DPD-MESO/fix_tdpd_source.cpp b/src/DPD-MESO/fix_tdpd_source.cpp index 5eb7416d5b..80848d553d 100644 --- a/src/DPD-MESO/fix_tdpd_source.cpp +++ b/src/DPD-MESO/fix_tdpd_source.cpp @@ -62,12 +62,6 @@ FixTDPDSource::FixTDPDSource(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixTDPDSource::~FixTDPDSource() -{ -} - -/* ---------------------------------------------------------------------- */ - int FixTDPDSource::setmask() { int mask = 0; diff --git a/src/DPD-MESO/fix_tdpd_source.h b/src/DPD-MESO/fix_tdpd_source.h index fe0a806ac2..8bd9778ed0 100644 --- a/src/DPD-MESO/fix_tdpd_source.h +++ b/src/DPD-MESO/fix_tdpd_source.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class FixTDPDSource : public Fix { public: FixTDPDSource(class LAMMPS *, int, char **); - ~FixTDPDSource(); + ~FixTDPDSource() = default; int setmask(); void init(); void post_force(int); diff --git a/src/DPD-MESO/pair_mdpd.cpp b/src/DPD-MESO/pair_mdpd.cpp index 9e704de2a7..53994800d0 100644 --- a/src/DPD-MESO/pair_mdpd.cpp +++ b/src/DPD-MESO/pair_mdpd.cpp @@ -19,19 +19,19 @@ #include "pair_mdpd.h" +#include "atom.h" +#include "citeme.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "memory.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "random_mars.h" +#include "update.h" + #include #include -#include "atom.h" -#include "comm.h" -#include "update.h" -#include "force.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "random_mars.h" -#include "citeme.h" -#include "memory.h" -#include "error.h" - using namespace LAMMPS_NS; @@ -217,12 +217,13 @@ void PairMDPD::settings(int narg, char **arg) seed = utils::inumeric(FLERR,arg[2],false,lmp); // initialize Marsaglia RNG with processor-unique seed + // create a positive seed based on the system clock, if requested. if (seed <= 0) { - struct timespec time; - clock_gettime( CLOCK_REALTIME, &time ); - seed = time.tv_nsec; // if seed is non-positive, get the current time as the seed + constexpr double LARGE_NUM = 2<<30; + seed = int(fmod(platform::walltime() * LARGE_NUM, LARGE_NUM)) + 1; } + delete random; random = new RanMars(lmp,(seed + comm->me) % 900000000); diff --git a/src/DPD-MESO/pair_tdpd.cpp b/src/DPD-MESO/pair_tdpd.cpp index e99edfa5ff..70168c0e2a 100644 --- a/src/DPD-MESO/pair_tdpd.cpp +++ b/src/DPD-MESO/pair_tdpd.cpp @@ -18,19 +18,19 @@ ------------------------------------------------------------------------- */ #include "pair_tdpd.h" -#include -#include -#include "atom.h" -#include "comm.h" -#include "update.h" -#include "force.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "random_mars.h" -#include "citeme.h" -#include "memory.h" -#include "error.h" +#include "atom.h" +#include "citeme.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "memory.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "random_mars.h" +#include "update.h" + +#include using namespace LAMMPS_NS; @@ -239,12 +239,13 @@ void PairTDPD::settings(int narg, char **arg) seed = utils::inumeric(FLERR,arg[2],false,lmp); // initialize Marsaglia RNG with processor-unique seed + // create a positive seed based on the system clock, if requested. if (seed <= 0) { - struct timespec time; - clock_gettime( CLOCK_REALTIME, &time ); - seed = time.tv_nsec; // if seed is non-positive, get the current time as the seed + constexpr double LARGE_NUM = 2<<30; + seed = int(fmod(platform::walltime() * LARGE_NUM, LARGE_NUM)) + 1; } + delete random; random = new RanMars(lmp,(seed + comm->me) % 900000000); diff --git a/src/DPD-REACT/fix_eos_table.cpp b/src/DPD-REACT/fix_eos_table.cpp index c9c23b51f8..61b4e7501a 100644 --- a/src/DPD-REACT/fix_eos_table.cpp +++ b/src/DPD-REACT/fix_eos_table.cpp @@ -207,7 +207,7 @@ void FixEOStable::read_table(Table *tb, Table *tb2, char *file, char *keyword) // loop until section found with matching keyword - while (1) { + while (true) { if (fgets(line,MAXLINE,fp) == nullptr) error->one(FLERR,"Did not find keyword in table file"); if (strspn(line," \t\n\r") == strlen(line)) continue; // blank line diff --git a/src/DPD-REACT/fix_eos_table_rx.cpp b/src/DPD-REACT/fix_eos_table_rx.cpp index b39e029c3e..5e950642d3 100644 --- a/src/DPD-REACT/fix_eos_table_rx.cpp +++ b/src/DPD-REACT/fix_eos_table_rx.cpp @@ -321,7 +321,7 @@ void FixEOStableRX::read_file(char *file) char line[MAXLINE],*ptr; int eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); if (ptr == nullptr) { @@ -427,7 +427,7 @@ void FixEOStableRX::read_table(Table *tb, Table *tb2, char *file, char *keyword) // loop until section found with matching keyword - while (1) { + while (true) { if (fgets(line,MAXLINE,fp) == nullptr) error->one(FLERR,"Did not find keyword in table file"); if (strspn(line," \t\n\r") == strlen(line)) continue; // blank line diff --git a/src/DPD-REACT/fix_rx.cpp b/src/DPD-REACT/fix_rx.cpp index 526c2d508f..165a3a6dbf 100644 --- a/src/DPD-REACT/fix_rx.cpp +++ b/src/DPD-REACT/fix_rx.cpp @@ -58,7 +58,7 @@ namespace /* anonymous */ { typedef double TimerType; -TimerType getTimeStamp() { return MPI_Wtime(); } +TimerType getTimeStamp() { return platform::walltime(); } double getElapsedTime( const TimerType &t0, const TimerType &t1) { return t1-t0; } } // end namespace @@ -84,7 +84,7 @@ FixRX::FixRX(LAMMPS *lmp, int narg, char **arg) : id_fix_species = nullptr; id_fix_species_old = nullptr; - const int Verbosity = 1; + constexpr int Verbosity = 1; // Keep track of the argument list. int iarg = 3; @@ -101,13 +101,10 @@ FixRX::FixRX(LAMMPS *lmp, int narg, char **arg) : if (strcmp(word,"none") == 0) { wtFlag = 0; localTempFlag = NONE; - } - else if (strcmp(word,"lucy") == 0) { + } else if (strcmp(word,"lucy") == 0) { wtFlag = LUCY; localTempFlag = HARMONIC; - } - else - error->all(FLERR,"Illegal fix rx local temperature weighting technique"); + } else error->all(FLERR,"Illegal fix rx local temperature weighting technique"); } // Select either sparse and dense matrix @@ -120,21 +117,11 @@ FixRX::FixRX(LAMMPS *lmp, int narg, char **arg) : useSparseKinetics = true; else if (strcmp(word,"dense") == 0) useSparseKinetics = false; - else { - std::string errmsg = "Illegal command " + std::string(word) - + " expected \"sparse\" or \"dense\"\n"; - error->all(FLERR, errmsg); - } + else error->all(FLERR, "Illegal command " + std::string(word) + + " expected \"sparse\" or \"dense\"\n"); - if (comm->me == 0 and Verbosity > 1) { - std::string msg = "FixRX: matrix format is "; - if (useSparseKinetics) - msg += std::string("sparse"); - else - msg += std::string("dense"); - - error->message(FLERR, msg); - } + if (comm->me == 0 && Verbosity > 1) + error->message(FLERR, fmt::format("FixRX: matrix format is {}",word)); } // Determine the ODE solver/stepper strategy in arg[6]. @@ -169,40 +156,32 @@ FixRX::FixRX(LAMMPS *lmp, int narg, char **arg) : } if (odeIntegrationFlag == ODE_LAMMPS_RK4 && narg==8) { - char *word = arg[iarg++]; - minSteps = atoi( word ); + minSteps = utils::inumeric(FLERR,arg[iarg++],false,lmp); - if (comm->me == 0 and Verbosity > 1) { - char msg[128]; - sprintf(msg, "FixRX: RK4 numSteps= %d", minSteps); - error->message(FLERR, msg); - } - } - else if (odeIntegrationFlag == ODE_LAMMPS_RK4 && narg>8) { + if (comm->me == 0 && Verbosity > 1) + error->message(FLERR,fmt::format("FixRX: RK4 numSteps= {}", minSteps)); + } else if (odeIntegrationFlag == ODE_LAMMPS_RK4 && narg>8) { error->all(FLERR,"Illegal fix rx command. Too many arguments for RK4 solver."); - } - else if (odeIntegrationFlag == ODE_LAMMPS_RKF45) { + } else if (odeIntegrationFlag == ODE_LAMMPS_RKF45) { // Must have four options. if (narg < 11) error->all(FLERR,"Illegal fix rx command. Too few arguments for RKF45 solver."); - minSteps = atoi( arg[iarg++] ); - maxIters = atoi( arg[iarg++] ); - relTol = strtod( arg[iarg++], nullptr); - absTol = strtod( arg[iarg++], nullptr); + minSteps = utils::inumeric(FLERR,arg[iarg++],false,lmp); + maxIters = utils::inumeric(FLERR,arg[iarg++],false,lmp); + relTol = utils::numeric(FLERR,arg[iarg++],false,lmp); + absTol = utils::numeric(FLERR,arg[iarg++],false,lmp); if (iarg < narg) - diagnosticFrequency = atoi( arg[iarg++] ); + diagnosticFrequency = utils::inumeric(FLERR,arg[iarg++],false,lmp); // maxIters must be at least minSteps. maxIters = std::max( minSteps, maxIters ); - if (comm->me == 0 and Verbosity > 1) { - //printf("FixRX: RKF45 minSteps= %d maxIters= %d absTol= %e relTol= %e\n", minSteps, maxIters, absTol, relTol); - char msg[128]; - sprintf(msg, "FixRX: RKF45 minSteps= %d maxIters= %d relTol= %.1e absTol= %.1e diagnosticFrequency= %d", minSteps, maxIters, relTol, absTol, diagnosticFrequency); - error->message(FLERR, msg); - } + if (comm->me == 0 && Verbosity > 1) + error->message(FLERR, fmt::format("FixRX: RKF45 minSteps= {} maxIters= {} " + "relTol= {:.1e} absTol= {:.1e} diagnosticFrequency= {}", + minSteps, maxIters, relTol, absTol, diagnosticFrequency)); } // Initialize/Create the sparse matrix database. @@ -265,11 +244,8 @@ void FixRX::post_constructor() fp = nullptr; if (comm->me == 0) { fp = utils::open_potential(kineticsFile,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open rx file %s",kineticsFile); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open rx file {}: {}",kineticsFile,utils::getsyserror()); } // Assign species names to tmpspecies array and determine the number of unique species @@ -279,7 +255,7 @@ void FixRX::post_constructor() int eof = 0; char * word; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); if (ptr == nullptr) { @@ -358,7 +334,7 @@ void FixRX::post_constructor() read_file( kineticsFile ); if (useSparseKinetics) - this->initSparse(); + initSparse(); // set comm size needed by this Pair comm_forward = nspecies*2; @@ -369,9 +345,9 @@ void FixRX::post_constructor() void FixRX::initSparse() { - const int Verbosity = 1; + constexpr int Verbosity = 1; - if (comm->me == 0 and Verbosity > 1) { + if (comm->me == 0 && Verbosity > 1) { for (int k = 0; k < nspecies; ++k) printf("atom->dvname[%d]= %s\n", k, atom->dvname[k]); @@ -421,7 +397,7 @@ void FixRX::initSparse() std::string pstr, rstr; bool allAreIntegral = true; for (int k = 0; k < nspecies; ++k) { - if (stoichReactants[i][k] == 0 and stoichProducts[i][k] == 0) + if (stoichReactants[i][k] == 0 && stoichProducts[i][k] == 0) nzeros++; if (stoichReactants[i][k] > 0.0) { @@ -448,8 +424,9 @@ void FixRX::initSparse() pstr += atom->dvname[k]; } } - if (comm->me == 0 and Verbosity > 1) - printf("rx%3d: %d %d %d ... %s %s %s\n", i, nreac_i, nprod_i, allAreIntegral, rstr.c_str(), /*reversible[i]*/ (false) ? "<=>" : "=", pstr.c_str()); + if (comm->me == 0 && Verbosity > 1) + utils::logmesg(lmp,"rx{:3d}: {} {} {} ... {} = {}\n", + i, nreac_i, nprod_i, allAreIntegral, rstr, pstr); mxreac = std::max( mxreac, nreac_i ); mxprod = std::max( mxprod, nprod_i ); @@ -457,9 +434,13 @@ void FixRX::initSparse() if (allAreIntegral) nIntegral++; } - if (comm->me == 0 and Verbosity > 1) { - char msg[256]; - sprintf(msg, "FixRX: Sparsity of Stoichiometric Matrix= %.1f%% non-zeros= %d nspecies= %d nreactions= %d maxReactants= %d maxProducts= %d maxSpecies= %d integralReactions= %d", 100*(double(nzeros) / (nspecies * nreactions)), nzeros, nspecies, nreactions, mxreac, mxprod, (mxreac + mxprod), SparseKinetics_enableIntegralReactions); + if (comm->me == 0 && Verbosity > 1) { + auto msg = fmt::format("FixRX: Sparsity of Stoichiometric Matrix= {:.1f}% non-zeros= {} " + "nspecies= {} nreactions= {} maxReactants= {} maxProducts= {} " + "maxSpecies= {} integralReactions= {}", + 100*(double(nzeros) / (nspecies * nreactions)), nzeros, nspecies, + nreactions, mxreac, mxprod, (mxreac + mxprod), + SparseKinetics_enableIntegralReactions); error->message(FLERR, msg); } @@ -539,7 +520,7 @@ void FixRX::initSparse() sparseKinetics_isIntegralReaction[i] = isIntegral_i; } - if (comm->me == 0 and Verbosity > 1) { + if (comm->me == 0 && Verbosity > 1) { for (int i = 1; i < nu_bin.size(); ++i) if (nu_bin[i] > 0) printf("nu_bin[%d] = %d\n", i, nu_bin[i]); @@ -554,7 +535,7 @@ void FixRX::initSparse() rstr += " + "; char digit[6]; - if (SparseKinetics_enableIntegralReactions and sparseKinetics_isIntegralReaction[i]) + if (SparseKinetics_enableIntegralReactions && sparseKinetics_isIntegralReaction[i]) sprintf(digit,"%d ", sparseKinetics_inu[i][kk]); else sprintf(digit,"%4.1f ", sparseKinetics_nu[i][kk]); @@ -570,7 +551,7 @@ void FixRX::initSparse() pstr += " + "; char digit[6]; - if (SparseKinetics_enableIntegralReactions and sparseKinetics_isIntegralReaction[i]) + if (SparseKinetics_enableIntegralReactions && sparseKinetics_isIntegralReaction[i]) sprintf(digit,"%d ", sparseKinetics_inu[i][kk]); else sprintf(digit,"%4.1f ", sparseKinetics_nu[i][kk]); @@ -578,7 +559,7 @@ void FixRX::initSparse() pstr += atom->dvname[k]; } } - if (comm->me == 0 and Verbosity > 1) + if (comm->me == 0 && Verbosity > 1) printf("rx%3d: %s %s %s\n", i, rstr.c_str(), /*reversible[i]*/ (false) ? "<=>" : "=", pstr.c_str()); } // end for nreactions @@ -774,18 +755,9 @@ void FixRX::pre_force(int /*vflag*/) double time_ODE = getElapsedTime(timer_localTemperature, timer_ODE); - //printf("me= %d total= %g temp= %g ode= %g comm= %g nlocal= %d nfc= %d %d\n", comm->me, - // getElapsedTime(timer_start, timer_stop), - // getElapsedTime(timer_start, timer_localTemperature), - // getElapsedTime(timer_localTemperature, timer_ODE), - // getElapsedTime(timer_ODE, timer_stop), nlocal, nFuncs, nSteps); - // Warn the user if a failure was detected in the ODE solver. - if (nFails > 0) { - char sbuf[128]; - sprintf(sbuf,"in FixRX::pre_force, ODE solver failed for %d atoms.", nFails); - error->warning(FLERR, sbuf); - } + if (nFails > 0) + error->warning(FLERR, fmt::format("FixRX::pre_force ODE solver failed for {} atoms.", nFails)); // Compute and report ODE diagnostics, if requested. if (odeIntegrationFlag == ODE_LAMMPS_RKF45 && diagnosticFrequency != 0) { @@ -832,7 +804,7 @@ void FixRX::read_file(char *file) char line[MAXLINE],*ptr; int eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); if (ptr == nullptr) { @@ -886,7 +858,7 @@ void FixRX::read_file(char *file) nreactions=0; sign = -1.0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); if (ptr == nullptr) { @@ -1183,7 +1155,7 @@ int FixRX::rkf45_h0 (const int neq, const double t, const double /*t_stop*/, // compute ydot at t=t0 rhs (t, y, ydot, v_params); - while (1) + while (true) { // Estimate y'' with finite-difference ... @@ -1282,7 +1254,7 @@ void FixRX::odeDiagnostics() double max_per_proc[numCounters]; double min_per_proc[numCounters]; - if (1) + if (true) { static bool firstStep = true; @@ -1313,7 +1285,7 @@ void FixRX::odeDiagnostics() printf("me= %d nst= %g nfc= %g time= %g nlocal= %g lmpnst= %g weight_idx= %d 1st= %d aveNeigh= %g\n", comm->me, this->diagnosticCounter[0], this->diagnosticCounter[1], this->diagnosticCounter[2], this->diagnosticCounter[3], this->diagnosticCounter[4], rx_weight_index, firstStep, averageNumNeighbors); - if (rx_weight_index != -1 && !firstStep && 0) + if (rx_weight_index != -1 && !firstStep && false) { double *rx_weight = atom->dvector[rx_weight_index]; @@ -1422,17 +1394,9 @@ void FixRX::odeDiagnostics() double time_local = getElapsedTime( timer_start, timer_stop ); if (comm->me == 0) { - char smesg[128]; - -#define print_mesg(smesg) {\ - if (screen) fprintf(screen,"%s\n", smesg); \ - if (logfile) fprintf(logfile,"%s\n", smesg); } - - sprintf(smesg, "FixRX::ODE Diagnostics: # of iters |# of rhs evals| run-time (sec) | # atoms"); - print_mesg(smesg); - - sprintf(smesg, " AVG per ODE : %-12.5g | %-12.5g | %-12.5g", avg_per_atom[0], avg_per_atom[1], avg_per_atom[2]); - print_mesg(smesg); + utils::logmesg(lmp,"FixRX::ODE Diagnostics: # of iters |# of rhs evals| run-time (sec) | # atoms\n"); + utils::logmesg(lmp," AVG per ODE : {:>12.5g} | {:>12.5g} | {:>12.5g}\n", + avg_per_atom[0], avg_per_atom[1], avg_per_atom[2]); // only valid for single time-step! if (diagnosticFrequency == 1) { @@ -1440,41 +1404,32 @@ void FixRX::odeDiagnostics() for (int i = 0; i < numCounters; ++i) rms_per_ODE[i] = sqrt( sum_sq[i+numCounters] / nODEs ); - sprintf(smesg, " RMS per ODE : %-12.5g | %-12.5g ", rms_per_ODE[0], rms_per_ODE[1]); - print_mesg(smesg); - - sprintf(smesg, " MAX per ODE : %-12.5g | %-12.5g ", max_per_ODE[0], max_per_ODE[1]); - print_mesg(smesg); - - sprintf(smesg, " MIN per ODE : %-12.5g | %-12.5g ", min_per_ODE[0], min_per_ODE[1]); - print_mesg(smesg); + utils::logmesg(lmp, " RMS per ODE : {:>12.5g} | {:>12.5g}\n", + rms_per_ODE[0], rms_per_ODE[1]); + utils::logmesg(lmp, " MAX per ODE : {:>12.5g} | {:>12.5g}\n", + max_per_ODE[0], max_per_ODE[1]); + utils::logmesg(lmp, " MIN per ODE : {:>12.5g} | {:>12.5g}\n", + min_per_ODE[0], min_per_ODE[1]); } - sprintf(smesg, " AVG per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", avg_per_proc[StepSum], avg_per_proc[FuncSum], avg_per_proc[TimeSum], avg_per_proc[AtomSum]); - print_mesg(smesg); + utils::logmesg(lmp," AVG per Proc : {:>12.5g} | {:>12.5g} | {:>12.5g} | {:>12.5g}\n", + avg_per_proc[StepSum], avg_per_proc[FuncSum], avg_per_proc[TimeSum], avg_per_proc[AtomSum]); if (comm->nprocs > 1) { double rms_per_proc[numCounters]; for (int i = 0; i < numCounters; ++i) rms_per_proc[i] = sqrt( sum_sq[i] / comm->nprocs ); - sprintf(smesg, " RMS per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", rms_per_proc[0], rms_per_proc[1], rms_per_proc[2], rms_per_proc[AtomSum]); - print_mesg(smesg); - - sprintf(smesg, " MAX per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", max_per_proc[0], max_per_proc[1], max_per_proc[2], max_per_proc[AtomSum]); - print_mesg(smesg); - - sprintf(smesg, " MIN per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", min_per_proc[0], min_per_proc[1], min_per_proc[2], min_per_proc[AtomSum]); - print_mesg(smesg); + utils::logmesg(lmp," RMS per Proc : {:>12.5g} | {:>12.5g} | {:>12.5g} | {:>12.5g}\n", + rms_per_proc[0], rms_per_proc[1], rms_per_proc[2], rms_per_proc[AtomSum]); + utils::logmesg(lmp," MAX per Proc : {:>12.5g} | {:>12.5g} | {:>12.5g} | {:>12.5g}\n", + max_per_proc[0], max_per_proc[1], max_per_proc[2], max_per_proc[AtomSum]); + utils::logmesg(lmp," MIN per Proc : {:>12.5g} | {:>12.5g} | {:>12.5g} | {:>12.5g}\n", + min_per_proc[0], min_per_proc[1], min_per_proc[2], min_per_proc[AtomSum]); } - sprintf(smesg, " AVG'd over %d time-steps", nTimes); - print_mesg(smesg); - sprintf(smesg, " AVG'ing took %g sec", time_local); - print_mesg(smesg); - -#undef print_mesg - + utils::logmesg(lmp, " AVG'd over {} time-steps\n", nTimes); + utils::logmesg(lmp, " AVG'ing took {} sec", time_local); } // Reset the counters. diff --git a/src/DPD-REACT/fix_rx.h b/src/DPD-REACT/fix_rx.h index 1d65c4c09e..bd3122e81d 100644 --- a/src/DPD-REACT/fix_rx.h +++ b/src/DPD-REACT/fix_rx.h @@ -97,7 +97,7 @@ class FixRX : public Fix { // Sparse stoichiometric matrix storage format and methods. bool useSparseKinetics; //SparseKinetics sparseKinetics; - void initSparse(void); + void initSparse(); int rhs_sparse(double, const double *, double *, void *) const; int sparseKinetics_maxReactants; //all(FLERR,"Fix shardlow does not yet support triclinic geometries"); if (rcut >= bbx || rcut >= bby || rcut>= bbz ) - { - char fmt[] = {"Shardlow algorithm requires sub-domain length > 2*(rcut+skin). Either reduce the number of processors requested, or change the cutoff/skin: rcut= %e bbx= %e bby= %e bbz= %e\n"}; - char *msg = (char *) malloc(sizeof(fmt) + 4*15); - sprintf(msg, fmt, rcut, bbx, bby, bbz); - error->one(FLERR, msg); - } + error->one(FLERR,"Shardlow algorithm requires sub-domain length > 2*(rcut+skin). " + "Either reduce the number of processors requested, or change the cutoff/skin: " + "rcut= {} bbx= {} bby= {} bbz= {}\n", rcut, bbx, bby, bbz); NPairHalfBinNewtonSSA *np_ssa = dynamic_cast(list->np); if (!np_ssa) error->one(FLERR, "NPair wasn't a NPairHalfBinNewtonSSA object"); diff --git a/src/DPD-REACT/nbin_ssa.cpp b/src/DPD-REACT/nbin_ssa.cpp index 993a41b356..c6ef22fe7d 100644 --- a/src/DPD-REACT/nbin_ssa.cpp +++ b/src/DPD-REACT/nbin_ssa.cpp @@ -34,10 +34,6 @@ NBinSSA::NBinSSA(LAMMPS *lmp) : NBinStandard(lmp) } } -NBinSSA::~NBinSSA() -{ -} - /* ---------------------------------------------------------------------- bin owned and ghost atoms for the Shardlow Splitting Algorithm (SSA) local atoms are in distinct bins (binhead[]) from the ghosts diff --git a/src/DPD-REACT/nbin_ssa.h b/src/DPD-REACT/nbin_ssa.h index c09ef7b692..5285c5b44d 100644 --- a/src/DPD-REACT/nbin_ssa.h +++ b/src/DPD-REACT/nbin_ssa.h @@ -41,7 +41,7 @@ class NBinSSA : public NBinStandard { int lbinzhi; // highest local bin z-dim coordinate NBinSSA(class LAMMPS *); - ~NBinSSA(); + virtual ~NBinSSA() = default; void bin_atoms_setup(int); void bin_atoms(); diff --git a/src/DPD-REACT/pair_exp6_rx.cpp b/src/DPD-REACT/pair_exp6_rx.cpp index 1d242de90b..313e9f2583 100644 --- a/src/DPD-REACT/pair_exp6_rx.cpp +++ b/src/DPD-REACT/pair_exp6_rx.cpp @@ -58,7 +58,7 @@ struct PairExp6ParamDataType *epsilonOld2, *alphaOld2, *rmOld2, *mixWtSite2old; // Default constructor -- nullify everything. - PairExp6ParamDataType(void) + PairExp6ParamDataType() : n(0), epsilon1(nullptr), alpha1(nullptr), rm1(nullptr), mixWtSite1(nullptr), epsilon2(nullptr), alpha2(nullptr), rm2(nullptr), mixWtSite2(nullptr), epsilonOld1(nullptr), alphaOld1(nullptr), rmOld1(nullptr), mixWtSite1old(nullptr), @@ -731,7 +731,7 @@ void PairExp6rx::read_file(char *file) char line[MAXLINE],*ptr; int eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); if (ptr == nullptr) { @@ -838,7 +838,7 @@ void PairExp6rx::read_file2(char *file) char line[MAXLINE],*ptr; int eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); if (ptr == nullptr) { diff --git a/src/DPD-REACT/pair_multi_lucy.cpp b/src/DPD-REACT/pair_multi_lucy.cpp index 9f5e494991..4aaea3f81b 100644 --- a/src/DPD-REACT/pair_multi_lucy.cpp +++ b/src/DPD-REACT/pair_multi_lucy.cpp @@ -356,7 +356,7 @@ void PairMultiLucy::read_table(Table *tb, char *file, char *keyword) // loop until section found with matching keyword - while (1) { + while (true) { if (fgets(line,MAXLINE,fp) == nullptr) error->one(FLERR,"Did not find keyword in table file"); if (strspn(line," \t\n\r") == strlen(line)) continue; // blank line diff --git a/src/DPD-REACT/pair_multi_lucy_rx.cpp b/src/DPD-REACT/pair_multi_lucy_rx.cpp index c386abded4..eac047d9f7 100644 --- a/src/DPD-REACT/pair_multi_lucy_rx.cpp +++ b/src/DPD-REACT/pair_multi_lucy_rx.cpp @@ -496,7 +496,7 @@ void PairMultiLucyRX::read_table(Table *tb, char *file, char *keyword) // loop until section found with matching keyword - while (1) { + while (true) { if (fgets(line,MAXLINE,fp) == nullptr) error->one(FLERR,"Did not find keyword in table file"); if (strspn(line," \t\n\r") == strlen(line)) continue; // blank line diff --git a/src/DPD-REACT/random_external_state.h b/src/DPD-REACT/random_external_state.h index 503118f0bf..9a69392a3b 100644 --- a/src/DPD-REACT/random_external_state.h +++ b/src/DPD-REACT/random_external_state.h @@ -78,8 +78,8 @@ namespace random_external_state { typedef uint64_t es_RNG_t; -enum { MAX_URAND = 0xffffffffU }; -enum { MAX_URAND64 = 0xffffffffffffffffULL - 1 }; +constexpr uint32_t MAX_URAND = 0xffffffffU; +constexpr uint64_t MAX_URAND64 = 0xffffffffffffffffULL - 1; LAMMPS_INLINE uint32_t es_urand(es_RNG_t &state_) diff --git a/src/DRUDE/fix_tgnh_drude.cpp b/src/DRUDE/fix_tgnh_drude.cpp index eb8922d4cc..700f9669d8 100644 --- a/src/DRUDE/fix_tgnh_drude.cpp +++ b/src/DRUDE/fix_tgnh_drude.cpp @@ -761,7 +761,7 @@ void FixTGNHDrude::setup_mol_mass_dof() { dof_mol, dof_int, dof_drude); } } - if (dof_mol <=0 or dof_int <=0 or dof_drude <=0) + if (dof_mol <=0 || dof_int <=0 || dof_drude <=0) error->all(FLERR, "TGNHC thermostat requires DOFs of molecules, atoms and dipoles larger than 0"); } diff --git a/src/EFF/compute_temp_deform_eff.h b/src/EFF/compute_temp_deform_eff.h index 1bd6768847..e90ba0465e 100644 --- a/src/EFF/compute_temp_deform_eff.h +++ b/src/EFF/compute_temp_deform_eff.h @@ -29,7 +29,7 @@ class ComputeTempDeformEff : public Compute { ComputeTempDeformEff(class LAMMPS *, int, char **); virtual ~ComputeTempDeformEff(); void init(); - void setup(void); + void setup(); virtual double compute_scalar(); virtual void compute_vector(); diff --git a/src/EFF/compute_temp_region_eff.h b/src/EFF/compute_temp_region_eff.h index 8ab10dd39a..08211c63c8 100644 --- a/src/EFF/compute_temp_region_eff.h +++ b/src/EFF/compute_temp_region_eff.h @@ -33,7 +33,7 @@ class ComputeTempRegionEff : public Compute { virtual double compute_scalar(); virtual void compute_vector(); - void dof_remove_pre(void); + void dof_remove_pre(); int dof_remove(int); void remove_bias(int, double *); void remove_bias_all(); diff --git a/src/EXTRA-DUMP/xdr_compat.cpp b/src/EXTRA-DUMP/xdr_compat.cpp index 04807a60cc..f2302f3ce7 100644 --- a/src/EXTRA-DUMP/xdr_compat.cpp +++ b/src/EXTRA-DUMP/xdr_compat.cpp @@ -604,7 +604,7 @@ xdrstdio_create (XDR *xdrs, FILE *file, enum xdr_op op) xdrs->x_ops = (struct xdr_ops *) &xdrstdio_ops; xdrs->x_private = (char *) file; xdrs->x_handy = 0; - xdrs->x_base = 0; + xdrs->x_base = nullptr; } /* diff --git a/src/EXTRA-DUMP/xdr_compat.h b/src/EXTRA-DUMP/xdr_compat.h index 30aecbcb62..6557a60a53 100644 --- a/src/EXTRA-DUMP/xdr_compat.h +++ b/src/EXTRA-DUMP/xdr_compat.h @@ -59,8 +59,8 @@ extern "C" { typedef int bool_t; -#if defined(__MINGW32__) || defined(__APPLE__) || defined(__FreeBSD__) || \ - defined(__DragonFly__) || defined(__OpenBSD__) || defined(__NetBSD__) +#if defined(_WIN32) || defined(__APPLE__) || defined(__FreeBSD__) || \ + defined(__DragonFly__) || defined(__OpenBSD__) || defined(__NetBSD__) typedef char *caddr_t; typedef unsigned int u_int; #endif diff --git a/src/EXTRA-FIX/fix_ave_correlate_long.cpp b/src/EXTRA-FIX/fix_ave_correlate_long.cpp index 6e4e26754f..1746c7f6f5 100644 --- a/src/EXTRA-FIX/fix_ave_correlate_long.cpp +++ b/src/EXTRA-FIX/fix_ave_correlate_long.cpp @@ -36,7 +36,6 @@ #include #include -#include using namespace LAMMPS_NS; using namespace FixConst; @@ -260,11 +259,11 @@ FixAveCorrelateLong::FixAveCorrelateLong(LAMMPS * lmp, int narg, char **arg): fprintf(fp," %s*%s",arg[5+i],arg[5+j]); fprintf(fp,"\n"); } - filepos = ftell(fp); + filepos = platform::ftell(fp); } - delete [] title1; - delete [] title2; + delete[] title1; + delete[] title2; // allocate and initialize memory for calculated values and correlators @@ -319,11 +318,11 @@ FixAveCorrelateLong::FixAveCorrelateLong(LAMMPS * lmp, int narg, char **arg): FixAveCorrelateLong::~FixAveCorrelateLong() { - delete [] which; - delete [] argindex; - delete [] value2index; - for (int i = 0; i < nvalues; i++) delete [] ids[i]; - delete [] ids; + delete[] which; + delete[] argindex; + delete[] value2index; + for (int i = 0; i < nvalues; i++) delete[] ids[i]; + delete[] ids; memory->destroy(values); memory->destroy(shift); @@ -467,7 +466,7 @@ void FixAveCorrelateLong::end_of_step() evaluate(); if (fp && me == 0) { - if (overwrite) fseek(fp,filepos,SEEK_SET); + if (overwrite) platform::fseek(fp,filepos); fprintf(fp,"# Timestep: " BIGINT_FORMAT "\n", ntimestep); for (unsigned int i=0;idt*nevery); @@ -478,9 +477,9 @@ void FixAveCorrelateLong::end_of_step() } fflush(fp); if (overwrite) { - long fileend = ftell(fp); - if ((fileend > 0) && (ftruncate(fileno(fp),fileend))) - perror("Error while tuncating output"); + bigint fileend = platform::ftell(fp); + if ((fileend > 0) && (platform::ftruncate(fp,fileend))) + error->warning(FLERR,"Error while tuncating output: {}", utils::getsyserror()); } } diff --git a/src/EXTRA-FIX/fix_ave_correlate_long.h b/src/EXTRA-FIX/fix_ave_correlate_long.h index b62c6aefcb..a31ae78217 100644 --- a/src/EXTRA-FIX/fix_ave_correlate_long.h +++ b/src/EXTRA-FIX/fix_ave_correlate_long.h @@ -66,7 +66,7 @@ class FixAveCorrelateLong : public Fix { FILE *fp; int type, startstep, overwrite; - long filepos; + bigint filepos; int npair; // number of correlation pairs to calculate double *values; diff --git a/src/EXTRA-FIX/fix_gle.cpp b/src/EXTRA-FIX/fix_gle.cpp index 8f31613188..de225c6980 100644 --- a/src/EXTRA-FIX/fix_gle.cpp +++ b/src/EXTRA-FIX/fix_gle.cpp @@ -234,7 +234,7 @@ FixGLE::FixGLE(LAMMPS *lmp, int narg, char **arg) : char line[MAXLINE],*ptr; int n,nwords,ndone=0,eof=0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fgle); if (ptr == nullptr) { @@ -300,7 +300,7 @@ FixGLE::FixGLE(LAMMPS *lmp, int narg, char **arg) : ndone = eof = 0; const double cfac = force->boltz / force->mvv2e; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fgle); if (ptr == nullptr) { diff --git a/src/EXTRA-FIX/fix_tmd.cpp b/src/EXTRA-FIX/fix_tmd.cpp index a46eb89713..4d85687e4d 100644 --- a/src/EXTRA-FIX/fix_tmd.cpp +++ b/src/EXTRA-FIX/fix_tmd.cpp @@ -123,7 +123,10 @@ nfileevery(0), fp(nullptr), xf(nullptr), xold(nullptr) FixTMD::~FixTMD() { - if (nfileevery && me == 0) fclose(fp); + if (nfileevery && me == 0) { + if (compressed) platform::pclose(fp); + else fclose(fp); + } // unregister callbacks to this fix from Atom class @@ -492,7 +495,7 @@ void FixTMD::readfile(char *file) delete [] buffer; if (me == 0) { - if (compressed) pclose(fp); + if (compressed) platform::pclose(fp); else fclose(fp); } @@ -514,33 +517,21 @@ void FixTMD::readfile(char *file) /* ---------------------------------------------------------------------- proc 0 opens TMD data file - test if gzipped + test if compressed ------------------------------------------------------------------------- */ -void FixTMD::open(char *file) +void FixTMD::open(const std::string &file) { - if (utils::strmatch(file,"\\.gz$")) { + if (platform::has_compress_extension(file)) { compressed = 1; - -#ifdef LAMMPS_GZIP - auto gunzip = fmt::format("gzip -c -d {}",file); - -#ifdef _WIN32 - fp = _popen(gunzip.c_str(),"rb"); -#else - fp = popen(gunzip.c_str(),"r"); -#endif - -#else - error->one(FLERR,"Cannot open gzipped file without gzip support"); -#endif + fp = platform::compressed_read(file); + if (!fp) error->one(FLERR,"Cannot open compressed file for reading"); } else { compressed = 0; - fp = fopen(file,"r"); + fp = fopen(file.c_str(),"r"); } - if (fp == nullptr) - error->one(FLERR,"Cannot open file {}: {}",file, utils::getsyserror()); + if (!fp) error->one(FLERR,"Cannot open file {}: {}", file, utils::getsyserror()); } /* ---------------------------------------------------------------------- */ diff --git a/src/EXTRA-FIX/fix_tmd.h b/src/EXTRA-FIX/fix_tmd.h index fd818eb583..b85869930a 100644 --- a/src/EXTRA-FIX/fix_tmd.h +++ b/src/EXTRA-FIX/fix_tmd.h @@ -52,7 +52,7 @@ class FixTMD : public Fix { double **xf, **xold; void readfile(char *); - void open(char *); + void open(const std::string &); }; } // namespace LAMMPS_NS diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp index abcbd2ba1e..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 @@ -77,7 +76,7 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : nzgrid = utils::inumeric(FLERR,arg[12],false,lmp); tinit = 0.0; - infile = outfile = NULL; + infile = outfile = nullptr; int iarg = 13; while (iarg < narg) { @@ -491,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.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..8890750818 100644 --- a/src/EXTRA-FIX/fix_ttm_grid.cpp +++ b/src/EXTRA-FIX/fix_ttm_grid.cpp @@ -306,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) { @@ -314,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 0aef2ec4ff..233f877e8c 100644 --- a/src/EXTRA-FIX/fix_ttm_mod.cpp +++ b/src/EXTRA-FIX/fix_ttm_mod.cpp @@ -584,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/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/EXTRA-FIX/fix_wall_ees.cpp b/src/EXTRA-FIX/fix_wall_ees.cpp index c224e59d12..26ed4f52f1 100644 --- a/src/EXTRA-FIX/fix_wall_ees.cpp +++ b/src/EXTRA-FIX/fix_wall_ees.cpp @@ -121,8 +121,10 @@ void FixWallEES::wall_particle(int m, int which, double coord) double* shape = bonus[ellipsoid[i]].shape;; MathExtra::quat_to_mat(bonus[ellipsoid[i]].quat,A); MathExtra::transpose_matvec(A,nhat,tempvec); - for (int k = 0; k<3; k++) tempvec[k] *= shape[k]; - for (int k = 0; k<3 ; k++) sigman2 += tempvec[k]*tempvec[k]; + for (int k = 0; k<3; k++) { + tempvec[k] *= shape[k]; + sigman2 += tempvec[k]*tempvec[k]; + } sigman = sqrt(sigman2); if (delta <= sigman) { diff --git a/src/EXTRA-FIX/fix_wall_region_ees.cpp b/src/EXTRA-FIX/fix_wall_region_ees.cpp index 81a67e8e58..261036333e 100644 --- a/src/EXTRA-FIX/fix_wall_region_ees.cpp +++ b/src/EXTRA-FIX/fix_wall_region_ees.cpp @@ -194,8 +194,10 @@ void FixWallRegionEES::post_force(int /*vflag*/) nhat[(which+2)%3] = 0 ; sn2 = 0 ; MathExtra::transpose_matvec(A,nhat,tempvec); - for (int k = 0; k<3; k++) tempvec[k] *= shape[k]; - for (int k = 0; k<3 ; k++) sn2 += tempvec[k]*tempvec[k]; + for (int k = 0; k<3; k++) { + tempvec[k] *= shape[k]; + sn2 += tempvec[k]*tempvec[k]; + } sn = sqrt(sn2); tooclose[which] = sn; } @@ -321,9 +323,11 @@ void FixWallRegionEES::ees(int m, int i) sigman2 = 0.0; MathExtra::transpose_matvec(A,nhat,tempvec); - for (int k = 0; k<3; k++) tempvec[k] *= shape[k]; - for (int k = 0; k<3; k++) sigman2 += tempvec[k]*tempvec[k]; - for (int k = 0; k<3; k++) SAn[k] = tempvec[k]; + for (int k = 0; k<3; k++) { + tempvec[k] *= shape[k]; + sigman2 += tempvec[k]*tempvec[k]; + SAn[k] = tempvec[k]; + } sigman = sqrt(sigman2); delta = fabs(region->contact[m].r); diff --git a/src/EXTRA-MOLECULE/angle_gaussian.cpp b/src/EXTRA-MOLECULE/angle_gaussian.cpp index e4310e0a22..54c2aa1880 100644 --- a/src/EXTRA-MOLECULE/angle_gaussian.cpp +++ b/src/EXTRA-MOLECULE/angle_gaussian.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -34,9 +33,9 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -AngleGaussian::AngleGaussian(LAMMPS *lmp) - : Angle(lmp), nterms(nullptr), angle_temperature(nullptr), - alpha(nullptr), width(nullptr), theta0(nullptr) +AngleGaussian::AngleGaussian(LAMMPS *lmp) : + Angle(lmp), nterms(nullptr), angle_temperature(nullptr), alpha(nullptr), width(nullptr), + theta0(nullptr) { } @@ -49,13 +48,13 @@ AngleGaussian::~AngleGaussian() memory->destroy(nterms); memory->destroy(angle_temperature); for (int i = 1; i <= atom->nangletypes; i++) { - delete [] alpha[i]; - delete [] width[i]; - delete [] theta0[i]; + delete[] alpha[i]; + delete[] width[i]; + delete[] theta0[i]; } - delete [] alpha; - delete [] width; - delete [] theta0; + delete[] alpha; + delete[] width; + delete[] theta0; } } @@ -63,15 +62,15 @@ AngleGaussian::~AngleGaussian() void AngleGaussian::compute(int eflag, int vflag) { - int i1,i2,i3,n,type; - double delx1,dely1,delz1,delx2,dely2,delz2; - double eangle,f1[3],f3[3]; + int i1, i2, i3, n, type; + double delx1, dely1, delz1, delx2, dely2, delz2; + double eangle, f1[3], f3[3]; double dtheta; - double rsq1,rsq2,r1,r2,c,s,a,a11,a12,a22; + double rsq1, rsq2, r1, r2, c, s, a, a11, a12, a22; double prefactor, exponent, g_i, sum_g_i, sum_numerator; eangle = 0.0; - ev_init(eflag,vflag); + ev_init(eflag, vflag); double **x = atom->x; double **f = atom->f; @@ -92,7 +91,7 @@ void AngleGaussian::compute(int eflag, int vflag) dely1 = x[i1][1] - x[i2][1]; delz1 = x[i1][2] - x[i2][2]; - rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; + rsq1 = delx1 * delx1 + dely1 * dely1 + delz1 * delz1; r1 = sqrt(rsq1); // 2nd bond @@ -101,20 +100,20 @@ void AngleGaussian::compute(int eflag, int vflag) dely2 = x[i3][1] - x[i2][1]; delz2 = x[i3][2] - x[i2][2]; - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + rsq2 = delx2 * delx2 + dely2 * dely2 + delz2 * delz2; r2 = sqrt(rsq2); // angle (cos and sin) - c = delx1*delx2 + dely1*dely2 + delz1*delz2; - c /= r1*r2; + c = delx1 * delx2 + dely1 * dely2 + delz1 * delz2; + c /= r1 * r2; if (c > 1.0) c = 1.0; if (c < -1.0) c = -1.0; - s = sqrt(1.0 - c*c); + s = sqrt(1.0 - c * c); if (s < SMAL) s = SMAL; - s = 1.0/s; + s = 1.0 / s; // force & energy double theta = acos(c); @@ -123,28 +122,28 @@ void AngleGaussian::compute(int eflag, int vflag) sum_numerator = 0.0; for (int i = 0; i < nterms[type]; i++) { dtheta = theta - theta0[type][i]; - prefactor = (alpha[type][i]/(width[type][i]*sqrt(MY_PI2))); - exponent = -2*dtheta*dtheta/(width[type][i]*width[type][i]); - g_i = prefactor*exp(exponent); + prefactor = (alpha[type][i] / (width[type][i] * sqrt(MY_PI2))); + exponent = -2 * dtheta * dtheta / (width[type][i] * width[type][i]); + g_i = prefactor * exp(exponent); sum_g_i += g_i; - sum_numerator += g_i*dtheta/(width[type][i]*width[type][i]); + sum_numerator += g_i * dtheta / (width[type][i] * width[type][i]); } if (sum_g_i < SMALL) sum_g_i = SMALL; - if (eflag) eangle = -(force->boltz*angle_temperature[type])*log(sum_g_i); + if (eflag) eangle = -(force->boltz * angle_temperature[type]) * log(sum_g_i); // I should check about the sign of this expression - a = -4.0*(force->boltz*angle_temperature[type])*(sum_numerator/sum_g_i)*s; - a11 = a*c / rsq1; - a12 = -a / (r1*r2); - a22 = a*c / rsq2; + a = -4.0 * (force->boltz * angle_temperature[type]) * (sum_numerator / sum_g_i) * s; + a11 = a * c / rsq1; + a12 = -a / (r1 * r2); + a22 = a * c / rsq2; - f1[0] = a11*delx1 + a12*delx2; - f1[1] = a11*dely1 + a12*dely2; - f1[2] = a11*delz1 + a12*delz2; - f3[0] = a22*delx2 + a12*delx1; - f3[1] = a22*dely2 + a12*dely1; - f3[2] = a22*delz2 + a12*delz1; + f1[0] = a11 * delx1 + a12 * delx2; + f1[1] = a11 * dely1 + a12 * dely2; + f1[2] = a11 * delz1 + a12 * delz2; + f3[0] = a22 * delx2 + a12 * delx1; + f3[1] = a22 * dely2 + a12 * dely1; + f3[2] = a22 * delz2 + a12 * delz1; // apply force to each of 3 atoms @@ -166,8 +165,9 @@ void AngleGaussian::compute(int eflag, int vflag) f[i3][2] += f3[2]; } - if (evflag) ev_tally(i1,i2,i3,nlocal,newton_bond,eangle,f1,f3, - delx1,dely1,delz1,delx2,dely2,delz2); + if (evflag) + ev_tally(i1, i2, i3, nlocal, newton_bond, eangle, f1, f3, delx1, dely1, delz1, delx2, dely2, + delz2); } } @@ -176,20 +176,20 @@ void AngleGaussian::compute(int eflag, int vflag) void AngleGaussian::allocate() { allocated = 1; - int n = atom->nangletypes; + int n = atom->nangletypes + 1; - memory->create(nterms,n+1,"angle:nterms"); - memory->create(angle_temperature,n+1,"angle:angle_temperature"); + memory->create(nterms, n, "angle:nterms"); + memory->create(angle_temperature, n, "angle:angle_temperature"); - alpha = new double *[n+1]; - width = new double *[n+1]; - theta0 = new double *[n+1]; - memset(alpha,0,sizeof(double)*(n+1)); - memset(width,0,sizeof(double)*(n+1)); - memset(theta0,0,sizeof(double)*(n+1)); + alpha = new double *[n]; + width = new double *[n]; + theta0 = new double *[n]; + memset(alpha, 0, sizeof(double *) * n); + memset(width, 0, sizeof(double *) * n); + memset(theta0, 0, sizeof(double *) * n); - memory->create(setflag,n+1,"angle:setflag"); - for (int i = 1; i <= n; i++) setflag[i] = 0; + memory->create(setflag, n, "angle:setflag"); + memset(setflag, 0, sizeof(int) * n); } /* ---------------------------------------------------------------------- @@ -198,15 +198,14 @@ void AngleGaussian::allocate() void AngleGaussian::coeff(int narg, char **arg) { - if (narg < 6) error->all(FLERR,"Incorrect args for angle coefficients"); + if (narg < 6) error->all(FLERR, "Incorrect args for angle coefficients"); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->nangletypes,ilo,ihi,error); + int ilo, ihi; + utils::bounds(FLERR, arg[0], 1, atom->nangletypes, ilo, ihi, error); - double angle_temperature_one = utils::numeric(FLERR,arg[1],false,lmp); - int n = utils::inumeric(FLERR,arg[2],false,lmp); - if (narg != 3*n + 3) - error->all(FLERR,"Incorrect args for angle coefficients"); + double angle_temperature_one = utils::numeric(FLERR, arg[1], false, lmp); + int n = utils::inumeric(FLERR, arg[2], false, lmp); + if (narg != 3 * n + 3) error->all(FLERR, "Incorrect args for angle coefficients"); if (!allocated) allocate(); @@ -217,21 +216,21 @@ void AngleGaussian::coeff(int narg, char **arg) angle_temperature[i] = angle_temperature_one; nterms[i] = n; delete[] alpha[i]; - alpha[i] = new double [n]; + alpha[i] = new double[n]; delete[] width[i]; - width[i] = new double [n]; + width[i] = new double[n]; delete[] theta0[i]; - theta0[i] = new double [n]; + theta0[i] = new double[n]; for (int j = 0; j < n; j++) { - alpha[i][j] = utils::numeric(FLERR,arg[3+3*j],false,lmp); - width[i][j] = utils::numeric(FLERR,arg[4+3*j],false,lmp); - theta0[i][j] = utils::numeric(FLERR,arg[5+3*j],false,lmp)* MY_PI / 180.0; + alpha[i][j] = utils::numeric(FLERR, arg[3 + 3 * j], false, lmp); + width[i][j] = utils::numeric(FLERR, arg[4 + 3 * j], false, lmp); + theta0[i][j] = utils::numeric(FLERR, arg[5 + 3 * j], false, lmp) * MY_PI / 180.0; setflag[i] = 1; } count++; } - if (count == 0) error->all(FLERR,"Incorrect args for angle coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for angle coefficients"); } /* ---------------------------------------------------------------------- */ @@ -247,12 +246,12 @@ double AngleGaussian::equilibrium_angle(int i) void AngleGaussian::write_restart(FILE *fp) { - fwrite(&angle_temperature[1],sizeof(double),atom->nangletypes,fp); - fwrite(&nterms[1],sizeof(int),atom->nangletypes,fp); + fwrite(&angle_temperature[1], sizeof(double), atom->nangletypes, fp); + fwrite(&nterms[1], sizeof(int), atom->nangletypes, fp); for (int i = 1; i <= atom->nangletypes; i++) { - fwrite(alpha[i],sizeof(double),nterms[i],fp); - fwrite(width[i],sizeof(double),nterms[i],fp); - fwrite(theta0[i],sizeof(double),nterms[i],fp); + fwrite(alpha[i], sizeof(double), nterms[i], fp); + fwrite(width[i], sizeof(double), nterms[i], fp); + fwrite(theta0[i], sizeof(double), nterms[i], fp); } } @@ -265,31 +264,32 @@ void AngleGaussian::read_restart(FILE *fp) allocate(); if (comm->me == 0) { - utils::sfread(FLERR,&angle_temperature[1],sizeof(double),atom->nangletypes,fp,nullptr,error); - utils::sfread(FLERR,&nterms[1],sizeof(int),atom->nangletypes,fp,nullptr,error); + utils::sfread(FLERR, &angle_temperature[1], sizeof(double), atom->nangletypes, fp, nullptr, + error); + utils::sfread(FLERR, &nterms[1], sizeof(int), atom->nangletypes, fp, nullptr, error); } - MPI_Bcast(&angle_temperature[1],atom->nangletypes,MPI_DOUBLE,0,world); - MPI_Bcast(&nterms[1],atom->nangletypes,MPI_INT,0,world); + MPI_Bcast(&angle_temperature[1], atom->nangletypes, MPI_DOUBLE, 0, world); + MPI_Bcast(&nterms[1], atom->nangletypes, MPI_INT, 0, world); // allocate for (int i = 1; i <= atom->nangletypes; i++) { - alpha[i] = new double [nterms[i]]; - width[i] = new double [nterms[i]]; - theta0[i] = new double [nterms[i]]; + alpha[i] = new double[nterms[i]]; + width[i] = new double[nterms[i]]; + theta0[i] = new double[nterms[i]]; } if (comm->me == 0) { for (int i = 1; i <= atom->nangletypes; i++) { - utils::sfread(FLERR,alpha[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,width[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,theta0[i],sizeof(double),nterms[i],fp,nullptr,error); + utils::sfread(FLERR, alpha[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, width[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, theta0[i], sizeof(double), nterms[i], fp, nullptr, error); } } for (int i = 1; i <= atom->nangletypes; i++) { - MPI_Bcast(alpha[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(width[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(theta0[i],nterms[i],MPI_DOUBLE,0,world); + MPI_Bcast(alpha[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(width[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(theta0[i], nterms[i], MPI_DOUBLE, 0, world); } for (int i = 1; i <= atom->nangletypes; i++) setflag[i] = 1; @@ -302,13 +302,12 @@ void AngleGaussian::read_restart(FILE *fp) void AngleGaussian::write_data(FILE *fp) { for (int i = 1; i <= atom->nangletypes; i++) { - fprintf(fp,"%d %g %d",i,angle_temperature[i],nterms[i]); + fprintf(fp, "%d %g %d", i, angle_temperature[i], nterms[i]); for (int j = 0; j < nterms[i]; j++) { - fprintf(fp," %g %g %g",alpha[i][j],width[i][j],(theta0[i][j]/MY_PI)*180.0); + fprintf(fp, " %g %g %g", alpha[i][j], width[i][j], (theta0[i][j] / MY_PI) * 180.0); } fprintf(fp, "\n"); } - } /* ---------------------------------------------------------------------- */ @@ -320,30 +319,30 @@ double AngleGaussian::single(int type, int i1, int i2, int i3) double delx1 = x[i1][0] - x[i2][0]; double dely1 = x[i1][1] - x[i2][1]; double delz1 = x[i1][2] - x[i2][2]; - domain->minimum_image(delx1,dely1,delz1); - double r1 = sqrt(delx1*delx1 + dely1*dely1 + delz1*delz1); + domain->minimum_image(delx1, dely1, delz1); + double r1 = sqrt(delx1 * delx1 + dely1 * dely1 + delz1 * delz1); double delx2 = x[i3][0] - x[i2][0]; double dely2 = x[i3][1] - x[i2][1]; double delz2 = x[i3][2] - x[i2][2]; - domain->minimum_image(delx2,dely2,delz2); - double r2 = sqrt(delx2*delx2 + dely2*dely2 + delz2*delz2); + domain->minimum_image(delx2, dely2, delz2); + double r2 = sqrt(delx2 * delx2 + dely2 * dely2 + delz2 * delz2); - double c = delx1*delx2 + dely1*dely2 + delz1*delz2; - c /= r1*r2; + double c = delx1 * delx2 + dely1 * dely2 + delz1 * delz2; + c /= r1 * r2; if (c > 1.0) c = 1.0; if (c < -1.0) c = -1.0; - double theta = acos(c) ; + double theta = acos(c); double sum_g_i = 0.0; for (int i = 0; i < nterms[type]; i++) { double dtheta = theta - theta0[type][i]; - double prefactor = (alpha[type][i]/(width[type][i]*sqrt(MY_PI2))); - double exponent = -2*dtheta*dtheta/(width[type][i]*width[type][i]); - double g_i = prefactor*exp(exponent); + double prefactor = (alpha[type][i] / (width[type][i] * sqrt(MY_PI2))); + double exponent = -2 * dtheta * dtheta / (width[type][i] * width[type][i]); + double g_i = prefactor * exp(exponent); sum_g_i += g_i; } if (sum_g_i < SMALL) sum_g_i = SMALL; - return -(force->boltz*angle_temperature[type])*log(sum_g_i); + return -(force->boltz * angle_temperature[type]) * log(sum_g_i); } diff --git a/src/EXTRA-MOLECULE/bond_gaussian.cpp b/src/EXTRA-MOLECULE/bond_gaussian.cpp index ca0bd13df8..c2ab00dfde 100644 --- a/src/EXTRA-MOLECULE/bond_gaussian.cpp +++ b/src/EXTRA-MOLECULE/bond_gaussian.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -14,16 +13,16 @@ #include "bond_gaussian.h" -#include -#include #include "atom.h" -#include "neighbor.h" #include "comm.h" +#include "error.h" #include "force.h" #include "math_const.h" #include "memory.h" -#include "error.h" +#include "neighbor.h" +#include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -32,9 +31,9 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -BondGaussian::BondGaussian(LAMMPS *lmp) - : Bond(lmp), nterms(nullptr), bond_temperature(nullptr), - alpha(nullptr), width(nullptr), r0(nullptr) +BondGaussian::BondGaussian(LAMMPS *lmp) : + Bond(lmp), nterms(nullptr), bond_temperature(nullptr), alpha(nullptr), width(nullptr), + r0(nullptr) { reinitflag = 1; } @@ -48,13 +47,13 @@ BondGaussian::~BondGaussian() memory->destroy(nterms); memory->destroy(bond_temperature); for (int i = 1; i <= atom->nbondtypes; i++) { - delete [] alpha[i]; - delete [] width[i]; - delete [] r0[i]; + delete[] alpha[i]; + delete[] width[i]; + delete[] r0[i]; } - delete [] alpha; - delete [] width; - delete [] r0; + delete[] alpha; + delete[] width; + delete[] r0; } } @@ -62,13 +61,13 @@ BondGaussian::~BondGaussian() void BondGaussian::compute(int eflag, int vflag) { - int i1,i2,n,type; - double delx,dely,delz,ebond,fbond; - double rsq,r,dr; + int i1, i2, n, type; + double delx, dely, delz, ebond, fbond; + double rsq, r, dr; double prefactor, exponent, g_i, sum_g_i, sum_numerator; ebond = 0.0; - ev_init(eflag,vflag); + ev_init(eflag, vflag); double **x = atom->x; double **f = atom->f; @@ -86,43 +85,45 @@ void BondGaussian::compute(int eflag, int vflag) dely = x[i1][1] - x[i2][1]; delz = x[i1][2] - x[i2][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; r = sqrt(rsq); sum_g_i = 0.0; sum_numerator = 0.0; for (int i = 0; i < nterms[type]; i++) { dr = r - r0[type][i]; - prefactor = (alpha[type][i]/(width[type][i]*sqrt(MY_PI2))); - exponent = -2*dr*dr/(width[type][i]*width[type][i]); - g_i = prefactor*exp(exponent); + prefactor = (alpha[type][i] / (width[type][i] * sqrt(MY_PI2))); + exponent = -2 * dr * dr / (width[type][i] * width[type][i]); + g_i = prefactor * exp(exponent); sum_g_i += g_i; - sum_numerator += g_i*dr/(width[type][i]*width[type][i]); + sum_numerator += g_i * dr / (width[type][i] * width[type][i]); } // force & energy if (sum_g_i < SMALL) sum_g_i = SMALL; - if (r > 0.0) fbond = -4.0*(force->boltz*bond_temperature[type])*(sum_numerator/sum_g_i)/r; - else fbond = 0.0; + if (r > 0.0) + fbond = -4.0 * (force->boltz * bond_temperature[type]) * (sum_numerator / sum_g_i) / r; + else + fbond = 0.0; - if (eflag) ebond = -(force->boltz*bond_temperature[type])*log(sum_g_i); + if (eflag) ebond = -(force->boltz * bond_temperature[type]) * log(sum_g_i); // apply force to each of 2 atoms if (newton_bond || i1 < nlocal) { - f[i1][0] += delx*fbond; - f[i1][1] += dely*fbond; - f[i1][2] += delz*fbond; + f[i1][0] += delx * fbond; + f[i1][1] += dely * fbond; + f[i1][2] += delz * fbond; } if (newton_bond || i2 < nlocal) { - f[i2][0] -= delx*fbond; - f[i2][1] -= dely*fbond; - f[i2][2] -= delz*fbond; + f[i2][0] -= delx * fbond; + f[i2][1] -= dely * fbond; + f[i2][2] -= delz * fbond; } - if (evflag) ev_tally(i1,i2,nlocal,newton_bond,ebond,fbond,delx,dely,delz); + if (evflag) ev_tally(i1, i2, nlocal, newton_bond, ebond, fbond, delx, dely, delz); } } @@ -131,20 +132,20 @@ void BondGaussian::compute(int eflag, int vflag) void BondGaussian::allocate() { allocated = 1; - int n = atom->nbondtypes; + int n = atom->nbondtypes + 1; - memory->create(nterms,n+1,"bond:nterms"); - memory->create(bond_temperature,n+1,"bond:bond_temperature"); + memory->create(nterms, n, "bond:nterms"); + memory->create(bond_temperature, n, "bond:bond_temperature"); - alpha = new double *[n+1]; - width = new double *[n+1]; - r0 = new double *[n+1]; - memset(alpha,0,sizeof(double)*(n+1)); - memset(width,0,sizeof(double)*(n+1)); - memset(r0,0,sizeof(double)*(n+1)); + alpha = new double *[n]; + width = new double *[n]; + r0 = new double *[n]; + memset(alpha, 0, sizeof(double *) * n); + memset(width, 0, sizeof(double *) * n); + memset(r0, 0, sizeof(double *) * n); - memory->create(setflag,n+1,"bond:setflag"); - for (int i = 1; i <= n; i++) setflag[i] = 0; + memory->create(setflag, n, "bond:setflag"); + memset(setflag, 0, sizeof(int) * n); } /* ---------------------------------------------------------------------- @@ -153,15 +154,14 @@ void BondGaussian::allocate() void BondGaussian::coeff(int narg, char **arg) { - if (narg < 6) error->all(FLERR,"Incorrect args for bond coefficients"); + if (narg < 6) error->all(FLERR, "Incorrect args for bond coefficients"); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->nbondtypes,ilo,ihi,error); + int ilo, ihi; + utils::bounds(FLERR, arg[0], 1, atom->nbondtypes, ilo, ihi, error); - double bond_temp_one = utils::numeric(FLERR,arg[1],false,lmp); - int n = utils::inumeric(FLERR,arg[2],false,lmp); - if (narg != 3*n + 3) - error->all(FLERR,"Incorrect args for bond coefficients"); + double bond_temp_one = utils::numeric(FLERR, arg[1], false, lmp); + int n = utils::inumeric(FLERR, arg[2], false, lmp); + if (narg != 3 * n + 3) error->all(FLERR, "Incorrect args for bond coefficients"); if (!allocated) allocate(); @@ -170,21 +170,21 @@ void BondGaussian::coeff(int narg, char **arg) bond_temperature[i] = bond_temp_one; nterms[i] = n; delete[] alpha[i]; - alpha[i] = new double [n]; + alpha[i] = new double[n]; delete[] width[i]; - width[i] = new double [n]; + width[i] = new double[n]; delete[] r0[i]; - r0[i] = new double [n]; + r0[i] = new double[n]; for (int j = 0; j < n; j++) { - alpha[i][j] = utils::numeric(FLERR,arg[3+3*j],false,lmp); - width[i][j] = utils::numeric(FLERR,arg[4+3*j],false,lmp); - r0[i][j] = utils::numeric(FLERR,arg[5+3*j],false,lmp); + alpha[i][j] = utils::numeric(FLERR, arg[3 + 3 * j], false, lmp); + width[i][j] = utils::numeric(FLERR, arg[4 + 3 * j], false, lmp); + r0[i][j] = utils::numeric(FLERR, arg[5 + 3 * j], false, lmp); setflag[i] = 1; } count++; } - if (count == 0) error->all(FLERR,"Incorrect args for bond coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for bond coefficients"); } /* ---------------------------------------------------------------------- @@ -202,12 +202,12 @@ double BondGaussian::equilibrium_distance(int i) void BondGaussian::write_restart(FILE *fp) { - fwrite(&bond_temperature[1],sizeof(double),atom->nbondtypes,fp); - fwrite(&nterms[1],sizeof(int),atom->nbondtypes,fp); + fwrite(&bond_temperature[1], sizeof(double), atom->nbondtypes, fp); + fwrite(&nterms[1], sizeof(int), atom->nbondtypes, fp); for (int i = 1; i <= atom->nbondtypes; i++) { - fwrite(alpha[i],sizeof(double),nterms[i],fp); - fwrite(width[i],sizeof(double),nterms[i],fp); - fwrite(r0[i],sizeof(double),nterms[i],fp); + fwrite(alpha[i], sizeof(double), nterms[i], fp); + fwrite(width[i], sizeof(double), nterms[i], fp); + fwrite(r0[i], sizeof(double), nterms[i], fp); } } @@ -220,31 +220,32 @@ void BondGaussian::read_restart(FILE *fp) allocate(); if (comm->me == 0) { - utils::sfread(FLERR,&bond_temperature[1],sizeof(double),atom->nbondtypes,fp,nullptr,error); - utils::sfread(FLERR,&nterms[1],sizeof(int),atom->nbondtypes,fp,nullptr,error); + utils::sfread(FLERR, &bond_temperature[1], sizeof(double), atom->nbondtypes, fp, nullptr, + error); + utils::sfread(FLERR, &nterms[1], sizeof(int), atom->nbondtypes, fp, nullptr, error); } - MPI_Bcast(&bond_temperature[1],atom->nbondtypes,MPI_DOUBLE,0,world); - MPI_Bcast(&nterms[1],atom->nbondtypes,MPI_INT,0,world); + MPI_Bcast(&bond_temperature[1], atom->nbondtypes, MPI_DOUBLE, 0, world); + MPI_Bcast(&nterms[1], atom->nbondtypes, MPI_INT, 0, world); // allocate for (int i = 1; i <= atom->nbondtypes; i++) { - alpha[i] = new double [nterms[i]]; - width[i] = new double [nterms[i]]; - r0[i] = new double [nterms[i]]; + alpha[i] = new double[nterms[i]]; + width[i] = new double[nterms[i]]; + r0[i] = new double[nterms[i]]; } if (comm->me == 0) { for (int i = 1; i <= atom->nbondtypes; i++) { - utils::sfread(FLERR,alpha[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,width[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,r0[i],sizeof(double),nterms[i],fp,nullptr,error); + utils::sfread(FLERR, alpha[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, width[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, r0[i], sizeof(double), nterms[i], fp, nullptr, error); } } for (int i = 1; i <= atom->nbondtypes; i++) { - MPI_Bcast(alpha[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(width[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(r0[i],nterms[i],MPI_DOUBLE,0,world); + MPI_Bcast(alpha[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(width[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(r0[i], nterms[i], MPI_DOUBLE, 0, world); } for (int i = 1; i <= atom->nbondtypes; i++) setflag[i] = 1; @@ -257,9 +258,9 @@ void BondGaussian::read_restart(FILE *fp) void BondGaussian::write_data(FILE *fp) { for (int i = 1; i <= atom->nbondtypes; i++) { - fprintf(fp,"%d %g %d",i,bond_temperature[i],nterms[i]); + fprintf(fp, "%d %g %d", i, bond_temperature[i], nterms[i]); for (int j = 0; j < nterms[i]; j++) { - fprintf(fp," %g %g %g",alpha[i][j],width[i][j],r0[i][j]); + fprintf(fp, " %g %g %g", alpha[i][j], width[i][j], r0[i][j]); } fprintf(fp, "\n"); } @@ -267,26 +268,25 @@ void BondGaussian::write_data(FILE *fp) /* ---------------------------------------------------------------------- */ -double BondGaussian::single(int type, double rsq, int /*i*/, int /*j*/, - double &fforce) +double BondGaussian::single(int type, double rsq, int /*i*/, int /*j*/, double &fforce) { double r = sqrt(rsq); fforce = 0; double sum_g_i = 0.0; double sum_numerator = 0.0; - for (int i = 0; i < nterms[type]; i++) { - double dr = r - r0[type][i]; - double prefactor = (alpha[type][i]/(width[type][i]*sqrt(MY_PI2))); - double exponent = -2*dr*dr/(width[type][i]*width[type][i]); - double g_i = prefactor*exp(exponent); - sum_g_i += g_i; - sum_numerator += g_i*dr/(width[type][i]*width[type][i]); - } + for (int i = 0; i < nterms[type]; i++) { + double dr = r - r0[type][i]; + double prefactor = (alpha[type][i] / (width[type][i] * sqrt(MY_PI2))); + double exponent = -2 * dr * dr / (width[type][i] * width[type][i]); + double g_i = prefactor * exp(exponent); + sum_g_i += g_i; + sum_numerator += g_i * dr / (width[type][i] * width[type][i]); + } if (sum_g_i < SMALL) sum_g_i = SMALL; - if (r > 0.0) fforce = -4.0*(force->boltz*bond_temperature[type])*(sum_numerator/sum_g_i)/r; + if (r > 0.0) + fforce = -4.0 * (force->boltz * bond_temperature[type]) * (sum_numerator / sum_g_i) / r; - return -(force->boltz*bond_temperature[type])*log(sum_g_i); + return -(force->boltz * bond_temperature[type]) * log(sum_g_i); } - diff --git a/src/EXTRA-PAIR/pair_e3b.cpp b/src/EXTRA-PAIR/pair_e3b.cpp index a904939e42..7e865ac6f8 100644 --- a/src/EXTRA-PAIR/pair_e3b.cpp +++ b/src/EXTRA-PAIR/pair_e3b.cpp @@ -643,7 +643,7 @@ void PairE3B::checkInputs(const double &bondL) if (k2 == NOT_SET) error->all(FLERR, "K2 keyword missing"); //now test that values are within acceptable ranges - if (k2 < 0.0 or k3 < 0.0) error->all(FLERR, "exponential decay is negative"); + if (k2 < 0.0 || k3 < 0.0) error->all(FLERR, "exponential decay is negative"); if (bondL < 0.0) error->all(FLERR, "OH bond length is negative"); if (rc2 < 0.0 || rc3 < 0.0 || rs < 0.0) error->all(FLERR, "potential cutoff is negative"); if (rs > rc3) error->all(FLERR, "potential switching distance is larger than cutoff"); diff --git a/src/GPU/pair_beck_gpu.cpp b/src/GPU/pair_beck_gpu.cpp index a2a3133a24..e3dfda428f 100644 --- a/src/GPU/pair_beck_gpu.cpp +++ b/src/GPU/pair_beck_gpu.cpp @@ -120,9 +120,9 @@ void PairBeckGPU::compute(int eflag, int vflag) error->one(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_start < inum) { - cpu_time = MPI_Wtime(); + cpu_time = platform::walltime(); cpu_compute(host_start, inum, eflag, vflag, ilist, numneigh, firstneigh); - cpu_time = MPI_Wtime() - cpu_time; + cpu_time = platform::walltime() - cpu_time; } } diff --git a/src/GPU/pair_lj96_cut_gpu.cpp b/src/GPU/pair_lj96_cut_gpu.cpp index f03fbc9d7f..546c31a94e 100644 --- a/src/GPU/pair_lj96_cut_gpu.cpp +++ b/src/GPU/pair_lj96_cut_gpu.cpp @@ -117,9 +117,9 @@ void PairLJ96CutGPU::compute(int eflag, int vflag) error->one(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); // if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_start(host_start, inum, ilist, numneigh, firstneigh); else cpu_compute<1,0>(host_start, inum, ilist, numneigh, firstneigh); } else cpu_compute<0,0>(host_start, inum, ilist, numneigh, firstneigh); - cpu_time = MPI_Wtime() - cpu_time; + cpu_time = platform::walltime() - cpu_time; } } diff --git a/src/GPU/pair_lj_sdk_gpu.cpp b/src/GPU/pair_lj_sdk_gpu.cpp index 9f925d0250..938ee83e4a 100644 --- a/src/GPU/pair_lj_sdk_gpu.cpp +++ b/src/GPU/pair_lj_sdk_gpu.cpp @@ -122,12 +122,12 @@ void PairLJSDKGPU::compute(int eflag, int vflag) error->one(FLERR,"Insufficient memory on accelerator"); if (host_start(host_start, inum, ilist, numneigh, firstneigh); else cpu_compute<1,0>(host_start, inum, ilist, numneigh, firstneigh); } else cpu_compute<0,0>(host_start, inum, ilist, numneigh, firstneigh); - cpu_time = MPI_Wtime() - cpu_time; + cpu_time = platform::walltime() - cpu_time; } } diff --git a/src/GPU/pair_lj_sf_dipole_sf_gpu.cpp b/src/GPU/pair_lj_sf_dipole_sf_gpu.cpp index bd40f855dc..0bb0e66d92 100644 --- a/src/GPU/pair_lj_sf_dipole_sf_gpu.cpp +++ b/src/GPU/pair_lj_sf_dipole_sf_gpu.cpp @@ -127,9 +127,9 @@ void PairLJSFDipoleSFGPU::compute(int eflag, int vflag) error->one(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR, "Insufficient memory on accelerator"); if (host_start < inum) { - cpu_time = MPI_Wtime(); + cpu_time = platform::walltime(); cpu_compute(host_start, inum, eflag, vflag, ilist, numneigh, firstneigh); - cpu_time = MPI_Wtime() - cpu_time; + cpu_time = platform::walltime() - cpu_time; } //fprintf("LJ_SMOOTH_GPU"); } diff --git a/src/GPU/pair_mie_cut_gpu.cpp b/src/GPU/pair_mie_cut_gpu.cpp index 568b4dbc18..a059607880 100644 --- a/src/GPU/pair_mie_cut_gpu.cpp +++ b/src/GPU/pair_mie_cut_gpu.cpp @@ -118,9 +118,9 @@ void PairMIECutGPU::compute(int eflag, int vflag) error->one(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_start < inum) { - cpu_time = MPI_Wtime(); + cpu_time = platform::walltime(); cpu_compute(host_start, inum, eflag, vflag, ilist, numneigh, firstneigh); - cpu_time = MPI_Wtime() - cpu_time; + cpu_time = platform::walltime() - cpu_time; } } diff --git a/src/GPU/pair_soft_gpu.cpp b/src/GPU/pair_soft_gpu.cpp index 9b6fc6a39a..654e2e603b 100644 --- a/src/GPU/pair_soft_gpu.cpp +++ b/src/GPU/pair_soft_gpu.cpp @@ -121,9 +121,9 @@ void PairSoftGPU::compute(int eflag, int vflag) error->one(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startone(FLERR,"Insufficient memory on accelerator"); if (host_startuniform() - 0.5; r2 = random->uniform() - 0.5; if (r1*r1 + r2*r2 < 0.25) break; diff --git a/src/INTEL/fix_intel.cpp b/src/INTEL/fix_intel.cpp index de17c02864..519181be52 100644 --- a/src/INTEL/fix_intel.cpp +++ b/src/INTEL/fix_intel.cpp @@ -911,7 +911,7 @@ template void FixIntel::add_off_results(const ft * _noalias const f_in, const acc_t * _noalias const ev_global) { if (_offload_balance < 0.0) - _balance_other_time = MPI_Wtime() - _balance_other_time; + _balance_other_time = platform::walltime() - _balance_other_time; start_watch(TIME_OFFLOAD_WAIT); #ifdef _LMP_INTEL_OFFLOAD diff --git a/src/INTERLAYER/pair_drip.cpp b/src/INTERLAYER/pair_drip.cpp index e9d32bdb8b..85b50ba170 100644 --- a/src/INTERLAYER/pair_drip.cpp +++ b/src/INTERLAYER/pair_drip.cpp @@ -31,7 +31,6 @@ #include "neigh_request.h" #include "neighbor.h" #include "potential_file_reader.h" -#include "tokenizer.h" #include #include @@ -59,6 +58,7 @@ PairDRIP::PairDRIP(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; restartinfo = 0; + one_coeff = 1; manybody_flag = 1; centroidstressflag = CENTROID_NOTAVAIL; unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); @@ -241,17 +241,17 @@ void PairDRIP::read_file(char *filename) nparams++; } - - MPI_Bcast(&nparams, 1, MPI_INT, 0, world); - MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); - - if (comm->me != 0) { - params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); - } - - MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); } + MPI_Bcast(&nparams, 1, MPI_INT, 0, world); + MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); + + if (comm->me != 0) { + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); + } + + MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); + memory->destroy(elem2param); memory->create(elem2param, nelements, nelements, "pair:elem2param"); for (int i = 0; i < nelements; i++) { @@ -259,7 +259,7 @@ void PairDRIP::read_file(char *filename) int n = -1; for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR, "Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR, "DRIP potential file has duplicate entry"); n = m; } } diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index 6f07d1dc1c..632bb6ae70 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -142,8 +142,8 @@ void PairILPGrapheneHBN::allocate() void PairILPGrapheneHBN::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR, "Illegal pair_style command"); - if (strcmp(force->pair_style, "hybrid/overlay") != 0) - error->all(FLERR, "ERROR: requires hybrid/overlay pair_style"); + if (!utils::strmatch(force->pair_style, "^hybrid/overlay")) + error->all(FLERR, "Pair style ilp/graphene/hbn must be used as sub-style with hybrid/overlay"); cut_global = utils::numeric(FLERR, arg[0], false, lmp); if (narg == 2) tap_flag = utils::numeric(FLERR, arg[1], false, lmp); @@ -273,16 +273,17 @@ void PairILPGrapheneHBN::read_file(char *filename) nparams++; } - - MPI_Bcast(&nparams, 1, MPI_INT, 0, world); - MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); - - if (comm->me != 0) { - params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); - } - - MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); } + + MPI_Bcast(&nparams, 1, MPI_INT, 0, world); + MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); + + if (comm->me != 0) { + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); + } + + MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); + memory->destroy(elem2param); memory->destroy(cutILPsq); memory->create(elem2param, nelements, nelements, "pair:elem2param"); @@ -292,7 +293,7 @@ void PairILPGrapheneHBN::read_file(char *filename) int n = -1; for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR, "ILP Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR, "ILP potential file has duplicate entry"); n = m; } } diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index f724b4d819..a107ed29a0 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -34,7 +34,6 @@ #include "neigh_request.h" #include "neighbor.h" #include "potential_file_reader.h" -#include "tokenizer.h" #include #include @@ -142,8 +141,8 @@ void PairKolmogorovCrespiFull::allocate() void PairKolmogorovCrespiFull::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR, "Illegal pair_style command"); - if (strcmp(force->pair_style, "hybrid/overlay") != 0) - error->all(FLERR, "ERROR: requires hybrid/overlay pair_style"); + if (!utils::strmatch(force->pair_style, "^hybrid/overlay")) + error->all(FLERR, "Pair style kolmogorov/crespi/full must be used as sub-style with hybrid/overlay"); cut_global = utils::numeric(FLERR, arg[0], false, lmp); if (narg == 2) tap_flag = utils::numeric(FLERR, arg[1], false, lmp); @@ -270,17 +269,17 @@ void PairKolmogorovCrespiFull::read_file(char *filename) nparams++; } - - MPI_Bcast(&nparams, 1, MPI_INT, 0, world); - MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); - - if (comm->me != 0) { - params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); - } - - MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); } + MPI_Bcast(&nparams, 1, MPI_INT, 0, world); + MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); + + if (comm->me != 0) { + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); + } + + MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); + memory->destroy(elem2param); memory->destroy(cutKCsq); memory->create(elem2param, nelements, nelements, "pair:elem2param"); @@ -290,7 +289,7 @@ void PairKolmogorovCrespiFull::read_file(char *filename) int n = -1; for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR, "KC Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR, "KC potential file has duplicate entry"); n = m; } } diff --git a/src/KIM/kim_init.cpp b/src/KIM/kim_init.cpp index a4003b7510..2c8a19251f 100644 --- a/src/KIM/kim_init.cpp +++ b/src/KIM/kim_init.cpp @@ -251,17 +251,15 @@ void KimInit::determine_model_type_and_units(char *model_name, char *user_units, return; } else if (unit_conversion_mode) { KIM_Model_Destroy(&pkim); - int const num_systems = 5; - char const *const systems[num_systems] = {"metal", "real", "si", "cgs", "electron"}; - for (int i = 0; i < num_systems; ++i) { - get_kim_unit_names(systems[i], lengthUnit, energyUnit, chargeUnit, temperatureUnit, - timeUnit, error); + const char * unit_systems[] = {"metal", "real", "si", "cgs", "electron"}; + for (auto units : unit_systems) { + get_kim_unit_names(units, lengthUnit, energyUnit, chargeUnit, temperatureUnit, timeUnit, error); kim_error = KIM_Model_Create(KIM_NUMBERING_zeroBased, lengthUnit, energyUnit, chargeUnit, temperatureUnit, timeUnit, model_name, &units_accepted, &pkim); if (units_accepted) { logID = fmt::format("{}_Model", comm->me); KIM_Model_SetLogID(pkim, logID.c_str()); - *model_units = utils::strdup(systems[i]); + *model_units = utils::strdup(units); return; } KIM_Model_Destroy(&pkim); diff --git a/src/KIM/kim_interactions.cpp b/src/KIM/kim_interactions.cpp index 9a3aee87c0..74ac40198c 100644 --- a/src/KIM/kim_interactions.cpp +++ b/src/KIM/kim_interactions.cpp @@ -293,7 +293,7 @@ void KimInteractions::KIM_SET_TYPE_PARAMETERS(const std::string &input_line) con char line[MAXLINE], *ptr; int n, eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line, MAXLINE,fp); if (ptr == nullptr) { diff --git a/src/KIM/kim_query.cpp b/src/KIM/kim_query.cpp index c1669650cc..3e891468a6 100644 --- a/src/KIM/kim_query.cpp +++ b/src/KIM/kim_query.cpp @@ -377,7 +377,7 @@ char *do_query(const std::string &qfunction, const std::string &mname, } auto user_agent = fmt::format("kim query--LAMMPS/{} ({})", - LAMMPS_VERSION, Info::get_os_info()); + LAMMPS_VERSION, platform::os_info()); curl_easy_setopt(handle, CURLOPT_USERAGENT, user_agent.c_str()); curl_easy_setopt(handle, CURLOPT_URL, url.c_str()); diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index be52d98183..49aea4eeb6 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -148,7 +148,7 @@ PairKIM::PairKIM(LAMMPS *lmp) : PairKIM::~PairKIM() { // clean up kim_modelname - if (kim_modelname != 0) delete [] kim_modelname; + if (kim_modelname != nullptr) delete [] kim_modelname; // clean up lammps atom species number to unique particle names mapping if (lmps_unique_elements) @@ -169,7 +169,7 @@ PairKIM::~PairKIM() // clean up lmps_stripped_neigh_ptr if (lmps_stripped_neigh_ptr) { delete [] lmps_stripped_neigh_ptr; - lmps_stripped_neigh_ptr = 0; + lmps_stripped_neigh_ptr = nullptr; } // clean up allocated memory for standard Pair class usage @@ -184,7 +184,7 @@ PairKIM::~PairKIM() // clean up neighborlist pointers if (neighborLists) { delete [] neighborLists; - neighborLists = 0; + neighborLists = nullptr; } // clean up KIM interface (if necessary) @@ -330,9 +330,9 @@ void PairKIM::settings(int narg, char **arg) set_lmps_flags(); // set KIM Model name - if (kim_modelname != 0) { + if (kim_modelname != nullptr) { delete [] kim_modelname; - kim_modelname = 0; + kim_modelname = nullptr; } kim_modelname = utils::strdup(arg[0]); @@ -385,7 +385,7 @@ void PairKIM::coeff(int narg, char **arg) delete [] lmps_unique_elements; } lmps_unique_elements = new char*[atom->ntypes]; - for (i = 0; i < atom->ntypes; i++) lmps_unique_elements[i] = 0; + for (i = 0; i < atom->ntypes; i++) lmps_unique_elements[i] = nullptr; // Assume all species arguments are valid // errors will be detected by below diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index 9d8674d0e8..04bf84ed31 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -109,6 +109,8 @@ action domain_kokkos.h action fftdata_kokkos.h fft3d.h action fft3d_kokkos.cpp fft3d.cpp action fft3d_kokkos.h fft3d.h +action fix_acks2_reaxff_kokkos.cpp fix_acks2_reaxff.cpp +action fix_acks2_reaxff_kokkos.h fix_acks2_reaxff.h action fix_deform_kokkos.cpp action fix_deform_kokkos.h action fix_enforce2d_kokkos.cpp diff --git a/src/KOKKOS/bond_class2_kokkos.cpp b/src/KOKKOS/bond_class2_kokkos.cpp index e538c8e045..b4e87b4119 100644 --- a/src/KOKKOS/bond_class2_kokkos.cpp +++ b/src/KOKKOS/bond_class2_kokkos.cpp @@ -68,14 +68,14 @@ void BondClass2Kokkos::compute(int eflag_in, int vflag_in) //if(k_eatom.extent(0)destroy_kokkos(k_eatom,eatom); memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); - d_eatom = k_eatom.template view(); + d_eatom = k_eatom.template view(); //} } if (vflag_atom) { //if(k_vatom.extent(0)destroy_kokkos(k_vatom,vatom); memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"improper:vatom"); - d_vatom = k_vatom.template view(); + d_vatom = k_vatom.template view(); //} } @@ -210,10 +210,10 @@ void BondClass2Kokkos::coeff(int narg, char **arg) BondClass2::coeff(narg, arg); int n = atom->nbondtypes; - Kokkos::DualView k_k2("BondClass2::k2",n+1); - Kokkos::DualView k_k3("BondClass2::k3",n+1); - Kokkos::DualView k_k4("BondClass2::k4",n+1); - Kokkos::DualView k_r0("BondClass2::r0",n+1); + typename AT::tdual_ffloat_1d k_k2("BondClass2::k2",n+1); + typename AT::tdual_ffloat_1d k_k3("BondClass2::k3",n+1); + typename AT::tdual_ffloat_1d k_k4("BondClass2::k4",n+1); + typename AT::tdual_ffloat_1d k_r0("BondClass2::r0",n+1); d_k2 = k_k2.template view(); d_k3 = k_k3.template view(); @@ -247,10 +247,10 @@ void BondClass2Kokkos::read_restart(FILE *fp) BondClass2::read_restart(fp); int n = atom->nbondtypes; - Kokkos::DualView k_k2("BondClass2::k2",n+1); - Kokkos::DualView k_k3("BondClass2::k3",n+1); - Kokkos::DualView k_k4("BondClass2::k4",n+1); - Kokkos::DualView k_r0("BondClass2::r0",n+1); + typename AT::tdual_ffloat_1d k_k2("BondClass2::k2",n+1); + typename AT::tdual_ffloat_1d k_k3("BondClass2::k3",n+1); + typename AT::tdual_ffloat_1d k_k4("BondClass2::k4",n+1); + typename AT::tdual_ffloat_1d k_r0("BondClass2::r0",n+1); d_k2 = k_k2.template view(); d_k3 = k_k3.template view(); diff --git a/src/KOKKOS/bond_class2_kokkos.h b/src/KOKKOS/bond_class2_kokkos.h index 52136030aa..529046845f 100644 --- a/src/KOKKOS/bond_class2_kokkos.h +++ b/src/KOKKOS/bond_class2_kokkos.h @@ -67,10 +67,11 @@ class BondClass2Kokkos : public BondClass2 { typename Kokkos::View::value,Kokkos::MemoryTraits > f; typename AT::t_int_2d bondlist; - Kokkos::DualView k_eatom; - Kokkos::DualView k_vatom; - Kokkos::View::value,Kokkos::MemoryTraits > d_eatom; - Kokkos::View::value,Kokkos::MemoryTraits > d_vatom; + typedef typename KKDevice::value KKDeviceType; + Kokkos::DualView k_eatom; + Kokkos::DualView k_vatom; + Kokkos::View > d_eatom; + Kokkos::View > d_vatom; int nlocal,newton_bond; int eflag,vflag; diff --git a/src/KOKKOS/compute_orientorder_atom_kokkos.cpp b/src/KOKKOS/compute_orientorder_atom_kokkos.cpp index 131e9933e8..f7ec879e3c 100644 --- a/src/KOKKOS/compute_orientorder_atom_kokkos.cpp +++ b/src/KOKKOS/compute_orientorder_atom_kokkos.cpp @@ -173,8 +173,6 @@ void ComputeOrientOrderAtomKokkos::compute_peratom() x = atomKK->k_x.view(); mask = atomKK->k_mask.view(); - Kokkos::deep_copy(d_qnm,{0.0,0.0}); - int vector_length_default = 1; int team_size_default = 1; if (!host_flag) @@ -185,6 +183,8 @@ void ComputeOrientOrderAtomKokkos::compute_peratom() if (chunk_size > inum - chunk_offset) chunk_size = inum - chunk_offset; + Kokkos::deep_copy(d_qnm,{0.0,0.0}); + //Neigh { int vector_length = vector_length_default; @@ -286,7 +286,7 @@ void ComputeOrientOrderAtomKokkos::operator() (TagComputeOrientOrder const int i = d_ilist[ii + chunk_offset]; const int ncount = d_ncount(ii); - // if not nnn neighbors, order parameter = 0; + // if not nnn neighbors, order parameter = 0 if ((ncount == 0) || (ncount < nnn)) { for (int jj = 0; jj < ncol; jj++) @@ -316,7 +316,7 @@ void ComputeOrientOrderAtomKokkos::operator() (TagComputeOrientOrder const int ncount = d_ncount(ii); if (jj >= ncount) return; - // if not nnn neighbors, order parameter = 0; + // if not nnn neighbors, order parameter = 0 if ((ncount == 0) || (ncount < nnn)) return; @@ -328,6 +328,12 @@ template KOKKOS_INLINE_FUNCTION void ComputeOrientOrderAtomKokkos::operator() (TagComputeOrientOrderAtomBOOP2,const int& ii) const { const int ncount = d_ncount(ii); + + // if not nnn neighbors, order parameter = 0 + + if ((ncount == 0) || (ncount < nnn)) + return; + calc_boop2(ncount, ii); } diff --git a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp new file mode 100644 index 0000000000..8379dc8f46 --- /dev/null +++ b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp @@ -0,0 +1,1972 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include "fix_acks2_reaxff_kokkos.h" + +#include "atom.h" +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "integrate.h" +#include "kokkos.h" +#include "memory_kokkos.h" +#include "neigh_list_kokkos.h" +#include "neigh_request.h" +#include "neighbor.h" +#include "pair_reaxff_kokkos.h" +#include "update.h" + +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +#define SMALL 0.0001 +#define EV_TO_KCAL_PER_MOL 14.4 + +/* ---------------------------------------------------------------------- */ + +template +FixACKS2ReaxFFKokkos:: +FixACKS2ReaxFFKokkos(LAMMPS *lmp, int narg, char **arg) : + FixACKS2ReaxFF(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + + datamask_read = X_MASK | V_MASK | F_MASK | MASK_MASK | Q_MASK | TYPE_MASK | TAG_MASK; + datamask_modify = Q_MASK | X_MASK; + + nmax = m_cap = 0; + allocated_flag = 0; + nprev = 4; + + memory->destroy(s_hist); + memory->destroy(s_hist_X); + memory->destroy(s_hist_last); + grow_arrays(atom->nmax); + memoryKK->create_kokkos(k_s_hist_last,s_hist_last,2,nprev,"acks2/reax:s_hist_last"); + d_s_hist_last = k_s_hist_last.template view(); + buf = new double[2*nprev]; + prev_last_rows_rank = 0; + + d_mfill_offset = typename AT::t_int_scalar("acks2/kk:mfill_offset"); +} + +/* ---------------------------------------------------------------------- */ + +template +FixACKS2ReaxFFKokkos::~FixACKS2ReaxFFKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_s_hist,s_hist); + memoryKK->destroy_kokkos(k_s_hist_X,s_hist_X); + memoryKK->destroy_kokkos(k_s_hist_last,s_hist_last); + delete [] buf; + + deallocate_array(); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::init() +{ + atomKK->k_q.modify(); + atomKK->k_q.sync(); + + FixACKS2ReaxFF::init(); + + neighflag = lmp->kokkos->neighflag_qeq; + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = std::is_same::value && + !std::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = std::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->fix = 1; + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else { //if (neighflag == HALF || neighflag == HALFTHREAD) + neighbor->requests[irequest]->fix = 1; + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + neighbor->requests[irequest]->ghost = 1; + } + + int ntypes = atom->ntypes; + k_params = Kokkos::DualView + ("FixACKS2ReaxFF::params",ntypes+1); + params = k_params.template view(); + + for (int n = 1; n <= ntypes; n++) { + k_params.h_view(n).chi = chi[n]; + k_params.h_view(n).eta = eta[n]; + k_params.h_view(n).gamma = gamma[n]; + k_params.h_view(n).bcut_acks2 = bcut_acks2[n]; + } + k_params.template modify(); + + cutsq = swb * swb; + + init_shielding_k(); + init_hist(); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::init_shielding_k() +{ + int i,j; + int ntypes = atom->ntypes; + + k_shield = DAT::tdual_ffloat_2d("acks2/kk:shield",ntypes+1,ntypes+1); + d_shield = k_shield.template view(); + + for( i = 1; i <= ntypes; ++i ) + for( j = 1; j <= ntypes; ++j ) + k_shield.h_view(i,j) = pow( gamma[i] * gamma[j], -1.5 ); + + k_shield.template modify(); + k_shield.template sync(); + + k_bcut = DAT::tdual_ffloat_2d("acks2/kk:bcut",ntypes+1,ntypes+1); + d_bcut = k_bcut.template view(); + + for( i = 1; i <= ntypes; ++i ) + for( j = 1; j <= ntypes; ++j ) + k_bcut.h_view(i,j) = 0.5*(bcut_acks2[i] + bcut_acks2[j]); + + k_bcut.template modify(); + k_bcut.template sync(); + + k_tap = DAT::tdual_ffloat_1d("acks2/kk:tap",8); + d_tap = k_tap.template view(); + + for (i = 0; i < 8; i ++) + k_tap.h_view(i) = Tap[i]; + + k_tap.template modify(); + k_tap.template sync(); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::init_hist() +{ + k_s_hist.clear_sync_state(); + k_s_hist_X.clear_sync_state(); + k_s_hist_last.clear_sync_state(); + + Kokkos::deep_copy(d_s_hist,0.0); + Kokkos::deep_copy(d_s_hist_X,0.0); + Kokkos::deep_copy(d_s_hist_last,0.0); + + k_s_hist.template modify(); + k_s_hist_X.template modify(); + k_s_hist_last.template modify(); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::setup_pre_force(int vflag) +{ + pre_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::pre_force(int vflag) +{ + if (update->ntimestep % nevery) return; + + atomKK->sync(execution_space,datamask_read); + + x = atomKK->k_x.view(); + v = atomKK->k_v.view(); + f = atomKK->k_f.view(); + q = atomKK->k_q.view(); + tag = atomKK->k_tag.view(); + type = atomKK->k_type.view(); + mask = atomKK->k_mask.view(); + nlocal = atomKK->nlocal; + nall = atom->nlocal + atom->nghost; + newton_pair = force->newton_pair; + + k_params.template sync(); + k_shield.template sync(); + k_bcut.template sync(); + k_tap.template sync(); + + NeighListKokkos* k_list = static_cast*>(list); + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + + nn = list->inum; + NN = list->inum + list->gnum; + + copymode = 1; + + // allocate + + allocate_array(); + + if (!allocated_flag || last_allocate < neighbor->lastcall) { + + // get max number of neighbor + + allocate_matrix(); + + // last_rows_rank proc must not own zero atoms (unless no atoms total) + // otherwise some loops are no-ops and last rows contribution won't + // be computed correctly + + int flag = comm->me; + if (nn == 0) flag = MAXSMALLINT; + MPI_Allreduce(&flag, &last_rows_rank, 1, MPI_INT, MPI_MIN, world); + last_rows_flag = (comm->me == last_rows_rank); + + // pass along "s" array history if necessary + + if (prev_last_rows_rank != last_rows_rank) { + + MPI_Request request; + if (comm->me == last_rows_rank) + MPI_Irecv(buf,2*nprev,MPI_DOUBLE, + prev_last_rows_rank,0,world,&request); + + if (comm->me == prev_last_rows_rank) { + + // pack buffer + k_s_hist_last.template sync(); + auto h_s_hist_last = k_s_hist_last.h_view; + int n = 0; + for (int k = 0; k < nprev; k++) { + buf[n++] = h_s_hist_last(0,k); + buf[n++] = h_s_hist_last(1,k); + } + + MPI_Send(buf,2*nprev,MPI_DOUBLE,last_rows_rank,0,world); + } + + if (comm->me == last_rows_rank) { + MPI_Wait(&request,MPI_STATUS_IGNORE); + + // unpack buffer + k_s_hist_last.template sync(); + auto h_s_hist_last = k_s_hist_last.h_view; + int n = 0; + for (int k = 0; k < nprev; k++) { + h_s_hist_last(0,k) = buf[n++]; + h_s_hist_last(1,k) = buf[n++]; + } + k_s_hist_last.template modify(); + } + } + + prev_last_rows_rank = last_rows_rank; + + last_allocate = update->ntimestep; + } + + // compute_H + + if (execution_space == Host) { // CPU + if (neighflag == FULL) { + FixACKS2ReaxFFKokkosComputeHFunctor computeH_functor(this); + Kokkos::parallel_scan(nn,computeH_functor); + } else { // HALF and HALFTHREAD are the same + FixACKS2ReaxFFKokkosComputeHFunctor computeH_functor(this); + Kokkos::parallel_scan(nn,computeH_functor); + } + } else { // GPU, use teams + Kokkos::deep_copy(d_mfill_offset,0); + + int vector_length = 32; + int atoms_per_team = 4; + int num_teams = nn / atoms_per_team + (nn % atoms_per_team ? 1 : 0); + + Kokkos::TeamPolicy policy(num_teams, atoms_per_team, + vector_length); + + if (neighflag == FULL) { + FixACKS2ReaxFFKokkosComputeHFunctor computeH_functor( + this, atoms_per_team, vector_length); + Kokkos::parallel_for(policy, computeH_functor); + } else { // HALF and HALFTHREAD are the same + FixACKS2ReaxFFKokkosComputeHFunctor computeH_functor( + this, atoms_per_team, vector_length); + Kokkos::parallel_for(policy, computeH_functor); + } + } + + need_dup = lmp->kokkos->need_dup(1); + + if (need_dup) + dup_X_diag = Kokkos::Experimental::create_scatter_view (d_X_diag); // allocate duplicated memory + else + ndup_X_diag = Kokkos::Experimental::create_scatter_view (d_X_diag); + + // compute_X + + Kokkos::deep_copy(d_X_diag,0.0); + + if (execution_space == Host || 1) { // CPU + if (neighflag == FULL) { + FixACKS2ReaxFFKokkosComputeXFunctor computeX_functor(this); + Kokkos::parallel_scan(nn,computeX_functor); + } else if (neighflag == HALFTHREAD) { + FixACKS2ReaxFFKokkosComputeXFunctor computeX_functor(this); + Kokkos::parallel_scan(nn,computeX_functor); + } else { + FixACKS2ReaxFFKokkosComputeXFunctor computeX_functor(this); + Kokkos::parallel_scan(nn,computeX_functor); + } + } else { // GPU, use teams + Kokkos::deep_copy(d_mfill_offset,0); + + int vector_length = 32; + int atoms_per_team = 4; + int num_teams = nn / atoms_per_team + (nn % atoms_per_team ? 1 : 0); + + Kokkos::TeamPolicy policy(num_teams, atoms_per_team, + vector_length); + if (neighflag == FULL) { + FixACKS2ReaxFFKokkosComputeXFunctor computeX_functor( + this, atoms_per_team, vector_length); + Kokkos::parallel_for(policy, computeX_functor); + } else if (neighflag == HALFTHREAD) { + FixACKS2ReaxFFKokkosComputeXFunctor computeX_functor( + this, atoms_per_team, vector_length); + Kokkos::parallel_for(policy, computeX_functor); + } else { + FixACKS2ReaxFFKokkosComputeXFunctor computeX_functor( + this, atoms_per_team, vector_length); + Kokkos::parallel_for(policy, computeX_functor); + } + } + + if (need_dup) { + Kokkos::Experimental::contribute(d_X_diag, dup_X_diag); + + // free duplicated memory + + dup_X_diag = decltype(dup_X_diag)(); + } + + if (neighflag != FULL) { + pack_flag = 4; + //comm->reverse_comm_fix(this); //Coll_Vector( X_diag ); + k_X_diag.template modify(); + k_X_diag.template sync(); + comm->reverse_comm_fix(this); + k_X_diag.template modify(); + k_X_diag.template sync(); + } + + if (efield) get_chi_field(); + + // init_matvec + + k_s_hist.template sync(); + k_s_hist_X.template sync(); + k_s_hist_last.template sync(); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); + + pack_flag = 2; + // comm->forward_comm_fix(this); //Dist_vector( s ); + k_s.template modify(); + k_s.template sync(); + comm->forward_comm_fix(this); + more_forward_comm(k_s.h_view.data()); + k_s.template modify(); + k_s.template sync(); + + // bicgstab solve over b_s, s + + bicgstab_solve(); + + calculate_Q(); + + k_s_hist.template modify(); + k_s_hist_X.template modify(); + k_s_hist_last.template modify(); + + copymode = 0; + + if (!allocated_flag) + allocated_flag = 1; + + atomKK->modified(execution_space,datamask_modify); + k_s.modify(); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::num_neigh_item(int ii, int &maxneigh) const +{ + const int i = d_ilist[ii]; + maxneigh += d_numneigh[i]; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::allocate_matrix() +{ + nmax = atom->nmax; + + // determine the total space for the H matrix + + m_cap = 0; + FixACKS2ReaxFFKokkosNumNeighFunctor neigh_functor(this); + Kokkos::parallel_reduce(nn,neigh_functor,m_cap); + + // H matrix + + d_firstnbr = typename AT::t_int_1d("acks2/kk:firstnbr",nmax); + d_numnbrs = typename AT::t_int_1d("acks2/kk:numnbrs",nmax); + d_jlist = typename AT::t_int_1d("acks2/kk:jlist",m_cap); + d_val = typename AT::t_ffloat_1d("acks2/kk:val",m_cap); + + // X matrix + + d_firstnbr_X = typename AT::t_int_1d("acks2/kk:firstnbr_X",nmax); + d_numnbrs_X = typename AT::t_int_1d("acks2/kk:numnbrs_X",nmax); + d_jlist_X = typename AT::t_int_1d("acks2/kk:jlist_X",m_cap); + d_val_X = typename AT::t_ffloat_1d("acks2/kk:val_X",m_cap); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::allocate_array() +{ + // 0 to nn-1: owned atoms related to H matrix + // nn to NN-1: ghost atoms related to H matrix + // NN to NN+nn-1: owned atoms related to X matrix + // NN+nn to 2*NN-1: ghost atoms related X matrix + // 2*NN to 2*NN+1: last two rows, owned by proc 0 + + if (atom->nmax > nmax) { + nmax = atom->nmax; + int size = nmax*2 + 2; + + d_q = typename AT::t_ffloat_1d("acks2/kk:q",size); + + memoryKK->create_kokkos(k_s,s,size,"acks2/kk:s"); + d_s = k_s.template view(); + + d_b_s = typename AT::t_ffloat_1d("acks2/kk:b_s",size); + + d_Hdia_inv = typename AT::t_ffloat_1d("acks2/kk:Hdia_inv",nmax); + + memoryKK->create_kokkos(k_chi_field,chi_field,nmax,"acks2/kk:chi_field"); + d_chi_field = k_chi_field.template view(); + + memoryKK->create_kokkos(k_X_diag,X_diag,nmax,"acks2/kk:X_diag"); + d_X_diag = k_X_diag.template view(); + + d_Xdia_inv = typename AT::t_ffloat_1d("acks2/kk:Xdia_inv",nmax); + + d_p = typename AT::t_ffloat_1d("acks2/kk:p",size); + d_r = typename AT::t_ffloat_1d("acks2/kk:r",size); + + memoryKK->create_kokkos(k_d,d,size,"acks2/kk:d"); + d_d = k_d.template view(); + + d_g = typename AT::t_ffloat_1d("acks2/kk:g",size); + + memoryKK->create_kokkos(k_q_hat,q_hat,size,"acks2/kk:q_hat"); + d_q_hat = k_q_hat.template view(); + + d_r_hat = typename AT::t_ffloat_1d("acks2/kk:r_hat",size); + + memoryKK->create_kokkos(k_y,y,size,"acks2/kk:y"); + d_y = k_y.template view(); + + memoryKK->create_kokkos(k_z,z,size,"acks2/kk:z"); + d_z = k_z.template view(); + } + + if (efield) get_chi_field(); + + // init_storage + Kokkos::parallel_for(Kokkos::RangePolicy(0,NN),*this); + +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::deallocate_array() +{ + memoryKK->destroy_kokkos(k_s,s); + memoryKK->destroy_kokkos(k_chi_field,chi_field); + memoryKK->destroy_kokkos(X_diag); + memoryKK->destroy_kokkos(k_d,d); + memoryKK->destroy_kokkos(k_q_hat,q_hat); + memoryKK->destroy_kokkos(k_y,y); + memoryKK->destroy_kokkos(k_z,z); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Zero, const int &ii) const +{ + const int i = d_ilist[ii]; + const int itype = type(i); + + if (mask[i] & groupbit) { + d_Hdia_inv[i] = 1.0 / params(itype).eta; + d_b_s[i] = -params(itype).chi - d_chi_field[i]; + d_s[i] = 0.0; + d_p[i] = 0.0; + d_r[i] = 0.0; + d_d[i] = 0.0; + } + +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::compute_h_item(int ii, int &m_fill, const bool &final) const +{ + const int i = d_ilist[ii]; + int j,jj,jtype; + + if (mask[i] & groupbit) { + + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + const int itype = type(i); + const tagint itag = tag(i); + const int jnum = d_numneigh[i]; + if (final) + d_firstnbr[i] = m_fill; + + for (jj = 0; jj < jnum; jj++) { + j = d_neighbors(i,jj); + j &= NEIGHMASK; + jtype = type(j); + + const X_FLOAT delx = x(j,0) - xtmp; + const X_FLOAT dely = x(j,1) - ytmp; + const X_FLOAT delz = x(j,2) - ztmp; + + if (NEIGHFLAG != FULL) { + // skip half of the interactions + const tagint jtag = tag(j); + if (j >= nlocal) { + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (x(j,2) < ztmp) continue; + if (x(j,2) == ztmp && x(j,1) < ytmp) continue; + if (x(j,2) == ztmp && x(j,1) == ytmp && x(j,0) < xtmp) continue; + } + } + } + + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + if (rsq > cutsq) continue; + + if (final) { + const F_FLOAT r = sqrt(rsq); + d_jlist(m_fill) = j; + const F_FLOAT shldij = d_shield(itype,jtype); + d_val(m_fill) = calculate_H_k(r,shldij); + } + m_fill++; + } + if (final) + d_numnbrs[i] = m_fill - d_firstnbr[i]; + } +} + +/* ---------------------------------------------------------------------- */ + +// Calculate Qeq matrix H where H is a sparse matrix and H[i][j] represents the electrostatic interaction coefficients on atom-i with atom-j +// d_val - contains the non-zero entries of sparse matrix H +// d_numnbrs - d_numnbrs[i] contains the # of non-zero entries in the i-th row of H (which also represents the # of neighbor atoms with electrostatic interaction coefficients with atom-i) +// d_firstnbr- d_firstnbr[i] contains the beginning index from where the H matrix entries corresponding to row-i is stored in d_val +// d_jlist - contains the column index corresponding to each entry in d_val + +template +template +void FixACKS2ReaxFFKokkos::compute_h_team( + const typename Kokkos::TeamPolicy::member_type &team, + int atoms_per_team, int vector_length) const { + + // scratch space setup + Kokkos::View, + Kokkos::MemoryTraits> + s_ilist(team.team_shmem(), atoms_per_team); + Kokkos::View, + Kokkos::MemoryTraits> + s_numnbrs(team.team_shmem(), atoms_per_team); + Kokkos::View, + Kokkos::MemoryTraits> + s_firstnbr(team.team_shmem(), atoms_per_team); + + Kokkos::View, + Kokkos::MemoryTraits> + s_jtype(team.team_shmem(), atoms_per_team, vector_length); + Kokkos::View, + Kokkos::MemoryTraits> + s_jlist(team.team_shmem(), atoms_per_team, vector_length); + Kokkos::View, + Kokkos::MemoryTraits> + s_r(team.team_shmem(), atoms_per_team, vector_length); + + // team of threads work on atoms with index in [firstatom, lastatom) + int firstatom = team.league_rank() * atoms_per_team; + int lastatom = + (firstatom + atoms_per_team < nn) ? (firstatom + atoms_per_team) : nn; + + // kokkos-thread-0 is used to load info from global memory into scratch space + if (team.team_rank() == 0) { + + // copy atom indices from d_ilist[firstatom:lastatom] to scratch space s_ilist[0:atoms_per_team] + // copy # of neighbor atoms for all the atoms with indices in d_ilist[firstatom:lastatom] from d_numneigh to scratch space s_numneigh[0:atoms_per_team] + // calculate total number of neighbor atoms for all atoms assigned to the current team of threads (Note - Total # of neighbor atoms here provides the + // upper bound space requirement to store the H matrix values corresponding to the atoms with indices in d_ilist[firstatom:lastatom]) + + Kokkos::parallel_scan(Kokkos::ThreadVectorRange(team, atoms_per_team), + [&](const int &idx, int &totalnbrs, bool final) { + int ii = firstatom + idx; + + if (ii < nn) { + const int i = d_ilist[ii]; + int jnum = d_numneigh[i]; + + if (final) { + s_ilist[idx] = i; + s_numnbrs[idx] = jnum; + s_firstnbr[idx] = totalnbrs; + } + totalnbrs += jnum; + } else { + s_numnbrs[idx] = 0; + } + }); + } + + // barrier ensures that the data moved to scratch space is visible to all the + // threads of the corresponding team + team.team_barrier(); + + // calculate the global memory offset from where the H matrix values to be + // calculated by the current team will be stored in d_val + int team_firstnbr_idx = 0; + Kokkos::single(Kokkos::PerTeam(team), + [=](int &val) { + int totalnbrs = s_firstnbr[lastatom - firstatom - 1] + + s_numnbrs[lastatom - firstatom - 1]; + val = Kokkos::atomic_fetch_add(&d_mfill_offset(), totalnbrs); + }, + team_firstnbr_idx); + + // map the H matrix computation of each atom to kokkos-thread (one atom per + // kokkos-thread) neighbor computation for each atom is assigned to vector + // lanes of the corresponding thread + Kokkos::parallel_for( + Kokkos::TeamThreadRange(team, atoms_per_team), [&](const int &idx) { + int ii = firstatom + idx; + + if (ii < nn) { + const int i = s_ilist[idx]; + + if (mask[i] & groupbit) { + const X_FLOAT xtmp = x(i, 0); + const X_FLOAT ytmp = x(i, 1); + const X_FLOAT ztmp = x(i, 2); + const int itype = type(i); + tagint itag = tag(i); + int jnum = s_numnbrs[idx]; + + // calculate the write-offset for atom-i's first neighbor + int atomi_firstnbr_idx = team_firstnbr_idx + s_firstnbr[idx]; + Kokkos::single(Kokkos::PerThread(team), + [&]() { d_firstnbr[i] = atomi_firstnbr_idx; }); + + // current # of neighbor atoms with non-zero electrostatic + // interaction coefficients with atom-i which represents the # of + // non-zero elements in row-i of H matrix + int atomi_nbrs_inH = 0; + + // calculate H matrix values corresponding to atom-i where neighbors + // are processed in batches and the batch size is vector_length + for (int jj_start = 0; jj_start < jnum; jj_start += vector_length) { + + int atomi_nbr_writeIdx = atomi_firstnbr_idx + atomi_nbrs_inH; + + // count the # of neighbor atoms with non-zero electrostatic + // interaction coefficients with atom-i in the current batch + int atomi_nbrs_curbatch = 0; + + // compute rsq, jtype, j and store in scratch space which is + // reused later + Kokkos::parallel_reduce( + Kokkos::ThreadVectorRange(team, vector_length), + [&](const int &idx, int &m_fill) { + const int jj = jj_start + idx; + + // initialize: -1 represents no interaction with atom-j + // where j = d_neighbors(i,jj) + s_jlist(team.team_rank(), idx) = -1; + + if (jj < jnum) { + int j = d_neighbors(i, jj); + j &= NEIGHMASK; + const int jtype = type(j); + + const X_FLOAT delx = x(j, 0) - xtmp; + const X_FLOAT dely = x(j, 1) - ytmp; + const X_FLOAT delz = x(j, 2) - ztmp; + + // valid nbr interaction + bool valid = true; + if (NEIGHFLAG != FULL) { + // skip half of the interactions + const tagint jtag = tag(j); + if (j >= nlocal) { + if (itag > jtag) { + if ((itag + jtag) % 2 == 0) + valid = false; + } else if (itag < jtag) { + if ((itag + jtag) % 2 == 1) + valid = false; + } else { + if (x(j, 2) < ztmp) + valid = false; + if (x(j, 2) == ztmp && x(j, 1) < ytmp) + valid = false; + if (x(j, 2) == ztmp && x(j, 1) == ytmp && x(j, 0) < xtmp) + valid = false; + } + } + } + + const F_FLOAT rsq = + delx * delx + dely * dely + delz * delz; + if (rsq > cutsq) + valid = false; + + if (valid) { + s_jlist(team.team_rank(), idx) = j; + s_jtype(team.team_rank(), idx) = jtype; + s_r(team.team_rank(), idx) = sqrt(rsq); + m_fill++; + } + } + }, + atomi_nbrs_curbatch); + + // write non-zero entries of H to global memory + Kokkos::parallel_scan( + Kokkos::ThreadVectorRange(team, vector_length), + [&](const int &idx, int &m_fill, bool final) { + int j = s_jlist(team.team_rank(), idx); + if (final) { + if (j != -1) { + const int jtype = s_jtype(team.team_rank(), idx); + const F_FLOAT r = s_r(team.team_rank(), idx); + const F_FLOAT shldij = d_shield(itype, jtype); + + d_jlist[atomi_nbr_writeIdx + m_fill] = j; + d_val[atomi_nbr_writeIdx + m_fill] = + calculate_H_k(r, shldij); + } + } + + if (j != -1) { + m_fill++; + } + }); + atomi_nbrs_inH += atomi_nbrs_curbatch; + } + + Kokkos::single(Kokkos::PerThread(team), + [&]() { d_numnbrs[i] = atomi_nbrs_inH; }); + } + } + }); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixACKS2ReaxFFKokkos::calculate_H_k(const F_FLOAT &r, const F_FLOAT &shld) const +{ + F_FLOAT taper, denom; + + taper = d_tap[7] * r + d_tap[6]; + taper = taper * r + d_tap[5]; + taper = taper * r + d_tap[4]; + taper = taper * r + d_tap[3]; + taper = taper * r + d_tap[2]; + taper = taper * r + d_tap[1]; + taper = taper * r + d_tap[0]; + + denom = r * r * r + shld; + denom = pow(denom,1.0/3.0); + + return taper * EV_TO_KCAL_PER_MOL / denom; +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::compute_x_item(int ii, int &m_fill, const bool &final) const +{ + // The X_diag array is duplicated for OpenMP, atomic for CUDA, and neither for Serial + auto v_X_diag = ScatterViewHelper::value,decltype(dup_X_diag),decltype(ndup_X_diag)>::get(dup_X_diag,ndup_X_diag); + auto a_X_diag = v_X_diag.template access::value>(); + + const int i = d_ilist[ii]; + int j,jj,jtype; + F_FLOAT tmp = 0.0; + + if (mask[i] & groupbit) { + + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + const int itype = type(i); + const tagint itag = tag(i); + const int jnum = d_numneigh[i]; + if (final) + d_firstnbr_X[i] = m_fill; + + for (jj = 0; jj < jnum; jj++) { + j = d_neighbors(i,jj); + j &= NEIGHMASK; + jtype = type(j); + + const X_FLOAT delx = x(j,0) - xtmp; + const X_FLOAT dely = x(j,1) - ytmp; + const X_FLOAT delz = x(j,2) - ztmp; + + if (NEIGHFLAG != FULL) { + // skip half of the interactions + const tagint jtag = tag(j); + if (j >= nlocal) { + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (x(j,2) < ztmp) continue; + if (x(j,2) == ztmp && x(j,1) < ytmp) continue; + if (x(j,2) == ztmp && x(j,1) == ytmp && x(j,0) < xtmp) continue; + } + } + } + + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + if (rsq > cutsq) continue; + + const F_FLOAT bcutoff = d_bcut(itype,jtype); + const F_FLOAT bcutoff2 = bcutoff*bcutoff; + if (rsq > bcutoff2) continue; + + if (final) { + const F_FLOAT r = sqrt(rsq); + d_jlist_X(m_fill) = j; + const F_FLOAT X_val = calculate_X_k(r,bcutoff); + d_val_X(m_fill) = X_val; + tmp -= X_val; + if (NEIGHFLAG != FULL) + a_X_diag[j] -= X_val; + } + m_fill++; + } + if (final) { + a_X_diag[i] += tmp; + d_numnbrs_X[i] = m_fill - d_firstnbr_X[i]; + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +template +void FixACKS2ReaxFFKokkos::compute_x_team( + const typename Kokkos::TeamPolicy::member_type &team, + int atoms_per_team, int vector_length) const { + + // The X_diag array is duplicated for OpenMP, atomic for CUDA, and neither for Serial + auto v_X_diag = ScatterViewHelper::value,decltype(dup_X_diag),decltype(ndup_X_diag)>::get(dup_X_diag,ndup_X_diag); + auto a_X_diag = v_X_diag.template access::value>(); + + // scratch space setup + Kokkos::View, + Kokkos::MemoryTraits> + s_ilist(team.team_shmem(), atoms_per_team); + Kokkos::View, + Kokkos::MemoryTraits> + s_numnbrs(team.team_shmem(), atoms_per_team); + Kokkos::View, + Kokkos::MemoryTraits> + s_firstnbr(team.team_shmem(), atoms_per_team); + + Kokkos::View, + Kokkos::MemoryTraits> + s_jtype(team.team_shmem(), atoms_per_team, vector_length); + Kokkos::View, + Kokkos::MemoryTraits> + s_jlist(team.team_shmem(), atoms_per_team, vector_length); + Kokkos::View, + Kokkos::MemoryTraits> + s_r(team.team_shmem(), atoms_per_team, vector_length); + + // team of threads work on atoms with index in [firstatom, lastatom) + int firstatom = team.league_rank() * atoms_per_team; + int lastatom = + (firstatom + atoms_per_team < nn) ? (firstatom + atoms_per_team) : nn; + + // kokkos-thread-0 is used to load info from global memory into scratch space + if (team.team_rank() == 0) { + + // copy atom indices from d_ilist[firstatom:lastatom] to scratch space s_ilist[0:atoms_per_team] + // copy # of neighbor atoms for all the atoms with indices in d_ilist[firstatom:lastatom] from d_numneigh to scratch space s_numneigh[0:atoms_per_team] + // calculate total number of neighbor atoms for all atoms assigned to the current team of threads (Note - Total # of neighbor atoms here provides the + // upper bound space requirement to store the H matrix values corresponding to the atoms with indices in d_ilist[firstatom:lastatom]) + + Kokkos::parallel_scan(Kokkos::ThreadVectorRange(team, atoms_per_team), + [&](const int &idx, int &totalnbrs, bool final) { + int ii = firstatom + idx; + + if (ii < nn) { + const int i = d_ilist[ii]; + int jnum = d_numneigh[i]; + + if (final) { + s_ilist[idx] = i; + s_numnbrs[idx] = jnum; + s_firstnbr[idx] = totalnbrs; + } + totalnbrs += jnum; + } else { + s_numnbrs[idx] = 0; + } + }); + } + + // barrier ensures that the data moved to scratch space is visible to all the + // threads of the corresponding team + team.team_barrier(); + + // calculate the global memory offset from where the H matrix values to be + // calculated by the current team will be stored in d_val_X + int team_firstnbr_idx = 0; + Kokkos::single(Kokkos::PerTeam(team), + [=](int &val) { + int totalnbrs = s_firstnbr[lastatom - firstatom - 1] + + s_numnbrs[lastatom - firstatom - 1]; + val = Kokkos::atomic_fetch_add(&d_mfill_offset(), totalnbrs); + }, + team_firstnbr_idx); + + // map the H matrix computation of each atom to kokkos-thread (one atom per + // kokkos-thread) neighbor computation for each atom is assigned to vector + // lanes of the corresponding thread + Kokkos::parallel_for( + Kokkos::TeamThreadRange(team, atoms_per_team), [&](const int &idx) { + int ii = firstatom + idx; + + if (ii < nn) { + const int i = s_ilist[idx]; + + if (mask[i] & groupbit) { + const X_FLOAT xtmp = x(i, 0); + const X_FLOAT ytmp = x(i, 1); + const X_FLOAT ztmp = x(i, 2); + const int itype = type(i); + tagint itag = tag(i); + int jnum = s_numnbrs[idx]; + + // calculate the write-offset for atom-i's first neighbor + int atomi_firstnbr_idx = team_firstnbr_idx + s_firstnbr[idx]; + Kokkos::single(Kokkos::PerThread(team), + [&]() { d_firstnbr_X[i] = atomi_firstnbr_idx; }); + + // current # of neighbor atoms with non-zero electrostatic + // interaction coefficients with atom-i which represents the # of + // non-zero elements in row-i of H matrix + int atomi_nbrs_inH = 0; + + // calculate H matrix values corresponding to atom-i where neighbors + // are processed in batches and the batch size is vector_length + for (int jj_start = 0; jj_start < jnum; jj_start += vector_length) { + + int atomi_nbr_writeIdx = atomi_firstnbr_idx + atomi_nbrs_inH; + + // count the # of neighbor atoms with non-zero electrostatic + // interaction coefficients with atom-i in the current batch + int atomi_nbrs_curbatch = 0; + + // compute rsq, jtype, j and store in scratch space which is + // reused later + Kokkos::parallel_reduce( + Kokkos::ThreadVectorRange(team, vector_length), + [&](const int &idx, int &m_fill) { + const int jj = jj_start + idx; + + // initialize: -1 represents no interaction with atom-j + // where j = d_neighbors(i,jj) + s_jlist(team.team_rank(), idx) = -1; + + if (jj < jnum) { + int j = d_neighbors(i, jj); + j &= NEIGHMASK; + const int jtype = type(j); + + const X_FLOAT delx = x(j, 0) - xtmp; + const X_FLOAT dely = x(j, 1) - ytmp; + const X_FLOAT delz = x(j, 2) - ztmp; + + // valid nbr interaction + bool valid = true; + if (NEIGHFLAG != FULL) { + // skip half of the interactions + const tagint jtag = tag(j); + if (j >= nlocal) { + if (itag > jtag) { + if ((itag + jtag) % 2 == 0) + valid = false; + } else if (itag < jtag) { + if ((itag + jtag) % 2 == 1) + valid = false; + } else { + if (x(j, 2) < ztmp) + valid = false; + if (x(j, 2) == ztmp && x(j, 1) < ytmp) + valid = false; + if (x(j, 2) == ztmp && x(j, 1) == ytmp && + x(j, 0) < xtmp) + valid = false; + } + } + } + + const F_FLOAT rsq = + delx * delx + dely * dely + delz * delz; + if (rsq > cutsq) + valid = false; + + const F_FLOAT bcutoff = d_bcut(itype,jtype); + const F_FLOAT bcutoff2 = bcutoff*bcutoff; + if (rsq > bcutoff2) + valid = false; + + if (valid) { + s_jlist(team.team_rank(), idx) = j; + s_jtype(team.team_rank(), idx) = jtype; + s_r(team.team_rank(), idx) = sqrt(rsq); + m_fill++; + } + } + }, + atomi_nbrs_curbatch); + + // write non-zero entries of H to global memory + Kokkos::parallel_scan( + Kokkos::ThreadVectorRange(team, vector_length), + [&](const int &idx, int &m_fill, bool final) { + int j = s_jlist(team.team_rank(), idx); + if (final) { + if (j != -1) { + const int jtype = s_jtype(team.team_rank(), idx); + const F_FLOAT r = s_r(team.team_rank(), idx); + const F_FLOAT bcutoff = d_bcut(itype, jtype); + + d_jlist_X[atomi_nbr_writeIdx + m_fill] = j; + const F_FLOAT X_val = calculate_X_k(r, bcutoff); + d_val_X[atomi_nbr_writeIdx + m_fill] = + X_val; + a_X_diag[i] -= X_val; + if (NEIGHFLAG != FULL) + a_X_diag[j] -= X_val; + } + } + + if (j != -1) { + m_fill++; + } + }); + atomi_nbrs_inH += atomi_nbrs_curbatch; + } + + Kokkos::single(Kokkos::PerThread(team), + [&]() { d_numnbrs_X[i] = atomi_nbrs_inH; }); + } + } + }); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixACKS2ReaxFFKokkos::calculate_X_k( const double &r, const double &bcut) const +{ + const F_FLOAT d = r/bcut; + const F_FLOAT d3 = d*d*d; + const F_FLOAT omd = 1.0 - d; + const F_FLOAT omd2 = omd*omd; + const F_FLOAT omd6 = omd2*omd2*omd2; + + return bond_softness*d3*omd6; +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2InitMatvec, const int &ii) const +{ + if (d_X_diag[ii] == 0.0) + d_Xdia_inv[ii] = 1.0; + else + d_Xdia_inv[ii] = 1.0 / d_X_diag[ii]; + + const int i = d_ilist[ii]; + const int itype = type(i); + + if (mask[i] & groupbit) { + d_Hdia_inv[i] = 1.0 / params(itype).eta; + d_b_s[i] = -params(itype).chi - d_chi_field[i]; + d_b_s[NN+i] = 0.0; + + d_s[i] = 4*(d_s_hist(i,0)+d_s_hist(i,2))-(6*d_s_hist(i,1)+d_s_hist(i,3)); + d_s[NN+i] = 4*(d_s_hist_X(i,0)+d_s_hist_X(i,2))-(6*d_s_hist_X(i,1)+d_s_hist_X(i,3)); + } + + // last two rows + if (last_rows_flag && ii == 0) { + for (int k = 0; k < 2; k++) { + d_b_s[2*NN+k] = 0.0; + d_s[2*NN+k] = 4*(d_s_hist_last(k,0)+d_s_hist_last(k,2))-(6*d_s_hist_last(k,1)+d_s_hist_last(k,3)); + } + } + +} + +/* ---------------------------------------------------------------------- */ + +template +int FixACKS2ReaxFFKokkos::bicgstab_solve() +{ + int i; + F_FLOAT my_norm,norm_sqr,my_dot,dot_sqr; + double tmp, sigma, rho, rho_old, rnorm, bnorm; + + // sparse_matvec( &H, &X, x, d ); + sparse_matvec_acks2(d_s, d_d); + + pack_flag = 1; + k_d.template modify(); + k_d.template sync(); + if (neighflag != FULL) + comm->reverse_comm_fix(this); //Coll_vector( d ); + more_reverse_comm(k_d.h_view.data()); + k_d.template modify(); + k_d.template sync(); + + // vector_sum( r , 1., b, -1., d, nn ); + // bnorm = parallel_norm( b, nn ); + my_norm = 0.0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nn),*this,my_norm); + norm_sqr = 0.0; + MPI_Allreduce( &my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + bnorm = sqrt(norm_sqr); + + // rnorm = parallel_norm( r, nn); + my_norm = 0.0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nn),*this,my_norm); + norm_sqr = 0.0; + MPI_Allreduce( &my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + rnorm = sqrt(norm_sqr); + + if (bnorm == 0.0 ) bnorm = 1.0; + deep_copy(d_r_hat,d_r); + omega = 1.0; + rho = 1.0; + + for (i = 1; i < imax && rnorm / bnorm > tolerance; ++i) { + // rho = parallel_dot( r_hat, r, nn); + my_dot = 0.0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nn),*this,my_dot); + dot_sqr = 0.0; + MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + rho = dot_sqr; + if (rho == 0.0) break; + + if (i > 1) { + beta = (rho / rho_old) * (alpha / omega); + + // vector_sum( p , 1., r, beta, q, nn); + // vector_sum( q , 1., p, -omega, z, nn); + // pre-conditioning + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); + } else { + + // vector_copy( p , r nn); + // pre-conditioning + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); + } + + pack_flag = 1; + // comm->forward_comm_fix(this); //Dist_vector( d ); + k_d.template modify(); + k_d.template sync(); + comm->forward_comm_fix(this); + more_forward_comm(k_d.h_view.data()); + k_d.template modify(); + k_d.template sync(); + + // sparse_matvec( &H, &X, d, z ); + sparse_matvec_acks2(d_d, d_z); + + pack_flag = 2; + k_z.template modify(); + k_z.template sync(); + if (neighflag != FULL) + comm->reverse_comm_fix(this); //Coll_vector( z ); + more_reverse_comm(k_z.h_view.data()); + k_z.template modify(); + k_z.template sync(); + + // tmp = parallel_dot( r_hat, z, nn); + my_dot = dot_sqr = 0.0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nn),*this,my_dot); + MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + tmp = dot_sqr; + alpha = rho / tmp; + + // vector_sum( q, 1., r, -alpha, z, nn); + // tmp = parallel_dot( q, q, nn); + my_dot = dot_sqr = 0.0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nn),*this,my_dot); + MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + tmp = dot_sqr; + + // early convergence check + if (tmp < tolerance) { + // vector_add( x, alpha, d, nn); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); + break; + } + + // pre-conditioning + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); + + // sparse_matvec( &H, &X, q_hat, y ); + pack_flag = 3; + // comm->forward_comm_fix(this); //Dist_vector( q_hat ); + k_q_hat.template modify(); + k_q_hat.template sync(); + comm->forward_comm_fix(this); + more_forward_comm(k_q_hat.h_view.data()); + k_q_hat.template modify(); + k_q_hat.template sync(); + + sparse_matvec_acks2(d_q_hat, d_y); + + pack_flag = 3; + k_y.template modify(); + k_y.template sync(); + if (neighflag != FULL) + comm->reverse_comm_fix(this); //Coll_vector( y ); + more_reverse_comm(k_y.h_view.data()); + k_y.template modify(); + k_y.template sync(); + + // sigma = parallel_dot( y, q, nn); + my_dot = dot_sqr = 0.0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nn),*this,my_dot); + MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + sigma = dot_sqr; + + // tmp = parallel_dot( y, y, nn); + my_dot = dot_sqr = 0.0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nn),*this,my_dot); + MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + tmp = dot_sqr; + + omega = sigma / tmp; + + // vector_sum( g , alpha, d, omega, q_hat, nn); + // vector_add( x, 1., g, nn); + // vector_sum( r , 1., q, -omega, y, nn); + // rnorm = parallel_norm( r, nn); + my_dot = dot_sqr = 0.0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nn),*this,my_dot); + MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + rnorm = sqrt(dot_sqr); + + if (omega == 0) break; + rho_old = rho; + } + + if (comm->me == 0) { + if (omega == 0 || rho == 0) { + error->warning(FLERR,"Fix acks2/reaxff/kk BiCGStab numerical breakdown, omega = {:.8}, rho = {:.8}", + omega,rho); + } else if (i >= imax) { + error->warning(FLERR,"Fix acks2/reaxff/kk BiCGStab convergence failed after {} iterations " + "at step {}", i, update->ntimestep); + } + } + + return i; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::calculate_Q() +{ + + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); + + pack_flag = 2; + //comm->forward_comm_fix( this ); //Dist_vector( s ); + k_s.modify(); + k_s.sync(); + comm->forward_comm_fix(this); + k_s.modify(); + k_s.sync(); + + Kokkos::parallel_for(Kokkos::RangePolicy(0,NN),*this); + +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::sparse_matvec_acks2(typename AT::t_ffloat_1d &d_xx_in, typename AT::t_ffloat_1d &d_bb_in) +{ + d_xx = d_xx_in; + d_bb = d_bb_in; + + if (need_dup) + dup_bb = Kokkos::Experimental::create_scatter_view (d_bb); // allocate duplicated memory + else + ndup_bb = Kokkos::Experimental::create_scatter_view (d_bb); + + Kokkos::deep_copy(d_bb,0.0); // can make more efficient? + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); + + if (neighflag == FULL) { + int teamsize; + if (execution_space == Host) teamsize = 1; + else teamsize = 128; + + Kokkos::parallel_for(Kokkos::TeamPolicy(nn,teamsize),*this); + } else if (neighflag == HALFTHREAD) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,nn),*this); + else if (neighflag == HALF) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,nn),*this); + + if (need_dup) { + Kokkos::Experimental::contribute(d_bb, dup_bb); + + // free duplicated memory + + dup_bb = decltype(dup_bb)(); + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2SparseMatvec1, const int &ii) const +{ + const int i = d_ilist[ii]; + const int itype = type(i); + if (mask[i] & groupbit) { + d_bb[i] = params(itype).eta * d_xx[i]; + d_bb[NN + i] = d_X_diag[i] * d_xx[NN + i]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2SparseMatvec2, const int &ii) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + d_bb[i] = 0.0; + d_bb[NN + i] = 0.0; + } +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2SparseMatvec3_Half, const int &ii) const +{ + // The bb array is duplicated for OpenMP, atomic for CUDA, and neither for Serial + auto v_bb = ScatterViewHelper::value,decltype(dup_bb),decltype(ndup_bb)>::get(dup_bb,ndup_bb); + auto a_bb = v_bb.template access::value>(); + + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + F_FLOAT tmp = 0.0; + + // H Matrix + for(int jj = d_firstnbr[i]; jj < d_firstnbr[i] + d_numnbrs[i]; jj++) { + const int j = d_jlist(jj); + tmp += d_val(jj) * d_xx[j]; + a_bb[j] += d_val(jj) * d_xx[i]; + } + a_bb[i] += tmp; + + // X Matrix + tmp = 0.0; + for(int jj = d_firstnbr_X[i]; jj < d_firstnbr_X[i] + d_numnbrs_X[i]; jj++) { + const int j = d_jlist_X(jj); + tmp += d_val_X(jj) * d_xx[NN + j]; + a_bb[NN + j] += d_val_X(jj) * d_xx[NN + i]; + } + a_bb[NN + i] += tmp; + + // Identity Matrix + a_bb[NN + i] += d_xx[i]; + a_bb[i] += d_xx[NN + i]; + + // Second-to-last row/column + a_bb[2*NN] += d_xx[NN + i]; + a_bb[NN + i] += d_xx[2*NN]; + + // Last row/column + a_bb[2*NN + 1] += d_xx[i]; + a_bb[i] += d_xx[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2SparseMatvec3_Full, const membertype &team) const +{ + int i = d_ilist[team.league_rank()]; + if (mask[i] & groupbit) { + F_FLOAT sum; + F_FLOAT sum2; + + Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team, d_firstnbr[i], d_firstnbr[i] + d_numnbrs[i]), [&] (const int &jj, F_FLOAT &sum) { + const int j = d_jlist(jj); + sum += d_val(jj) * d_xx[j]; + }, sum); + team.team_barrier(); + + Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team, d_firstnbr_X[i], d_firstnbr_X[i] + d_numnbrs_X[i]), [&] (const int &jj, F_FLOAT &sum2) { + const int j = d_jlist_X(jj); + sum2 += d_val_X(jj) * d_xx[NN + j]; + }, sum2); + + Kokkos::single(Kokkos::PerTeam(team), [&] () { + d_bb[i] += sum; + d_bb[NN + i] += sum2; + + // Identity Matrix + d_bb[NN + i] += d_xx[i]; + d_bb[i] += d_xx[NN + i]; + + // Second-to-last row/column + Kokkos::atomic_add(&(d_bb[2*NN]),d_xx[NN + i]); + d_bb[NN + i] += d_xx[2*NN]; + + // Last row/column + Kokkos::atomic_add(&(d_bb[2*NN + 1]),d_xx[i]); + d_bb[i] += d_xx[2*NN + 1]; + }); + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Norm1, const int &ii, double &lsum) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + d_r[i] = d_b_s[i] - d_d[i]; + d_r[NN+i] = d_b_s[NN+i] - d_d[NN+i]; + + lsum += d_b_s[i] * d_b_s[i]; + lsum += d_b_s[NN+i] * d_b_s[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + d_r[2*NN] = d_b_s[2*NN] - d_d[2*NN]; + d_r[2*NN + 1] = d_b_s[2*NN + 1] - d_d[2*NN + 1]; + + lsum += d_b_s[2*NN] * d_b_s[2*NN]; + lsum += d_b_s[2*NN + 1] * d_b_s[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Norm2, const int &ii, double &lsum) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + lsum += d_r[i] * d_r[i]; + lsum += d_r[NN + i] * d_r[NN + i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + lsum += d_r[2*NN] * d_r[2*NN]; + lsum += d_r[2*NN + 1] * d_r[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Dot1, const int &ii, double &lsum) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + lsum += d_r_hat[i] * d_r[i]; + lsum += d_r_hat[NN+i] * d_r[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + lsum += d_r_hat[2*NN] * d_r[2*NN]; + lsum += d_r_hat[2*NN + 1] * d_r[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Precon1A, const int &ii) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + d_q[i] = d_p[i] - omega*d_z[i]; + d_q[NN+i] = d_p[NN+i] - omega*d_z[NN+i]; + + d_p[i] = d_r[i] + beta*d_q[i]; + d_p[NN+i] = d_r[NN+i] + beta*d_q[NN+i]; + + d_d[i] = d_p[i]*d_Hdia_inv[i]; + d_d[NN+i] = d_p[NN+i]*d_Xdia_inv[i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + d_q[2*NN] = d_p[2*NN] - omega*d_z[2*NN]; + d_q[2*NN + 1] = d_p[2*NN + 1] - omega*d_z[2*NN + 1]; + + d_p[2*NN] = d_r[2*NN] + beta*d_q[2*NN]; + d_p[2*NN + 1] = d_r[2*NN + 1] + beta*d_q[2*NN + 1]; + + d_d[2*NN] = d_p[2*NN]; + d_d[2*NN + 1] = d_p[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Precon1B, const int &ii) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + d_p[i] = d_r[i] ; + d_p[NN+i] = d_r[NN+i]; + + d_d[i] = d_p[i]*d_Hdia_inv[i]; + d_d[NN+i] = d_p[NN+i]*d_Xdia_inv[i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + d_p[2*NN] = d_r[2*NN]; + d_p[2*NN + 1] = d_r[2*NN + 1]; + + d_d[2*NN] = d_p[2*NN]; + d_d[2*NN + 1] = d_p[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Dot2, const int &ii, double &lsum) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + lsum += d_r_hat[i] * d_z[i]; + lsum += d_r_hat[NN+i] * d_z[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + lsum += d_r_hat[2*NN] * d_z[2*NN]; + lsum += d_r_hat[2*NN + 1] * d_z[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Dot3, const int &ii, double &lsum) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + d_q[i] = d_r[i] - alpha*d_z[i]; + d_q[NN+i] = d_r[NN+i] - alpha*d_z[NN+i]; + + lsum += d_q[i] * d_q[i]; + lsum += d_q[NN+i] * d_q[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + d_q[2*NN] = d_r[2*NN] - alpha*d_z[2*NN]; + d_q[2*NN + 1] = d_r[2*NN + 1] - alpha*d_z[2*NN + 1]; + + lsum += d_q[2*NN] * d_q[2*NN]; + lsum += d_q[2*NN + 1] * d_q[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Dot4, const int &ii, double &lsum) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + lsum += d_y[i] * d_q[i]; + lsum += d_y[NN+i] * d_q[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + lsum += d_y[2*NN] * d_q[2*NN]; + lsum += d_y[2*NN + 1] * d_q[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Dot5, const int &ii, double &lsum) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + lsum += d_y[i] * d_y[i]; + lsum += d_y[NN+i] * d_y[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + lsum += d_y[2*NN] * d_y[2*NN]; + lsum += d_y[2*NN + 1] * d_y[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Add, const int &ii) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + d_s[i] += alpha * d_d[i]; + d_s[NN+i] += alpha * d_d[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + d_s[2*NN] += alpha*d_d[2*NN]; + d_s[2*NN + 1] += alpha*d_d[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Precon2, const int &ii) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + d_q_hat[i] = d_q[i]*d_Hdia_inv[i]; + d_q_hat[NN+i] = d_q[NN+i]*d_Xdia_inv[i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + d_q_hat[2*NN] = d_q[2*NN]; + d_q_hat[2*NN + 1] = d_q[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2Norm3, const int &ii, double &lsum) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + d_g[i] = alpha*d_d[i] + omega*d_q_hat[i]; + d_g[NN+i] = alpha*d_d[NN+i] + omega*d_q_hat[NN+i]; + + d_s[i] += d_g[i]; + d_s[NN+i] += d_g[NN+i]; + + d_r[i] = d_q[i] - omega*d_y[i]; + d_r[NN+i] = d_q[NN+i] - omega*d_y[NN+i]; + + lsum += d_r[i] * d_r[i]; + lsum += d_r[NN+i] * d_r[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + d_g[2*NN] = alpha*d_d[2*NN] + omega*d_q_hat[2*NN]; + d_g[2*NN + 1] = alpha*d_d[2*NN + 1] + omega*d_q_hat[2*NN + 1]; + + d_s[2*NN] += d_g[2*NN]; + d_s[2*NN + 1] += d_g[2*NN + 1]; + + d_r[2*NN] = d_q[2*NN] - omega*d_y[2*NN]; + d_r[2*NN + 1] = d_q[2*NN + 1] - omega*d_y[2*NN + 1]; + + lsum += d_r[2*NN] * d_r[2*NN]; + lsum += d_r[2*NN + 1] * d_r[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2CalculateQ1, const int &ii) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) { + + /* backup s */ + for (int k = nprev-1; k > 0; --k) { + d_s_hist(i,k) = d_s_hist(i,k-1); + d_s_hist_X(i,k) = d_s_hist_X(i,k-1); + } + d_s_hist(i,0) = d_s[i]; + d_s_hist_X(i,0) = d_s[NN+i]; + } + + // last two rows + if (last_rows_flag && ii == 0) { + for (int i = 0; i < 2; ++i) { + for (int k = nprev-1; k > 0; --k) + d_s_hist_last(i,k) = d_s_hist_last(i,k-1); + d_s_hist_last(i,0) = d_s[2*NN+i]; + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixACKS2ReaxFFKokkos::operator() (TagACKS2CalculateQ2, const int &ii) const +{ + const int i = d_ilist[ii]; + if (mask[i] & groupbit) + q(i) = d_s(i); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::cleanup_copy() +{ + id = style = NULL; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ + +template +double FixACKS2ReaxFFKokkos::memory_usage() +{ + double bytes; + + int size = 2*nmax + 2; + + bytes = size*nprev * sizeof(double); // s_hist + bytes += nmax*4 * sizeof(double); // storage + bytes += size*11 * sizeof(double); // storage + bytes += n_cap*4 * sizeof(int); // matrix... + bytes += m_cap*2 * sizeof(int); + bytes += m_cap*2 * sizeof(double); + + return bytes; +} + +/* ---------------------------------------------------------------------- + allocate fictitious charge arrays +------------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::grow_arrays(int nmax) +{ + k_s_hist.template sync(); + k_s_hist_X.template sync(); + + k_s_hist.template modify(); // force reallocation on host + k_s_hist_X.template modify(); + + memoryKK->grow_kokkos(k_s_hist,s_hist,nmax,nprev,"acks2:s_hist"); + memoryKK->grow_kokkos(k_s_hist_X,s_hist_X,nmax,nprev,"acks2:s_hist_X"); + + d_s_hist = k_s_hist.template view(); + d_s_hist_X = k_s_hist_X.template view(); + + k_s_hist.template modify(); + k_s_hist_X.template modify(); +} + +/* ---------------------------------------------------------------------- + copy values within fictitious charge arrays +------------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::copy_arrays(int i, int j, int delflag) +{ + k_s_hist.template sync(); + k_s_hist_X.template sync(); + + FixACKS2ReaxFF::copy_arrays(i,j,delflag); + + k_s_hist.template modify(); + k_s_hist_X.template modify(); +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixACKS2ReaxFFKokkos::pack_exchange(int i, double *buf) +{ + k_s_hist.template sync(); + k_s_hist_X.template sync(); + + return FixACKS2ReaxFF::pack_exchange(i,buf); +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixACKS2ReaxFFKokkos::unpack_exchange(int nlocal, double *buf) +{ + k_s_hist.template sync(); + k_s_hist_X.template sync(); + + int n = FixACKS2ReaxFF::unpack_exchange(nlocal,buf); + + k_s_hist.template modify(); + k_s_hist_X.template modify(); + + return n; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixACKS2ReaxFFKokkos::get_chi_field() +{ + atomKK->sync(Host,X_MASK|MASK_MASK|IMAGE_MASK); + FixQEqReaxFF::get_chi_field(); + k_chi_field.modify_host(); + k_chi_field.sync_device(); +} + +/* ---------------------------------------------------------------------- */ + +namespace LAMMPS_NS { +template class FixACKS2ReaxFFKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixACKS2ReaxFFKokkos; +#endif +} diff --git a/src/KOKKOS/fix_acks2_reaxff_kokkos.h b/src/KOKKOS/fix_acks2_reaxff_kokkos.h new file mode 100644 index 0000000000..bce90e97a3 --- /dev/null +++ b/src/KOKKOS/fix_acks2_reaxff_kokkos.h @@ -0,0 +1,372 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(acks2/reaxff/kk,FixACKS2ReaxFFKokkos); +FixStyle(acks2/reaxff/kk/device,FixACKS2ReaxFFKokkos); +FixStyle(acks2/reaxff/kk/host,FixACKS2ReaxFFKokkos); +FixStyle(acks2/reax/kk,FixACKS2ReaxFFKokkos); +FixStyle(acks2/reax/kk/device,FixACKS2ReaxFFKokkos); +FixStyle(acks2/reax/kk/host,FixACKS2ReaxFFKokkos); +// clang-format on +#else +// clang-format off +#ifndef LMP_FIX_ACKS2_REAXFF_KOKKOS_H +#define LMP_FIX_ACKS2_REAXFF_KOKKOS_H + +#include "fix_acks2_reaxff.h" +#include "kokkos_type.h" +#include "neigh_list.h" +#include "neigh_list_kokkos.h" + +namespace LAMMPS_NS { + +struct TagACKS2Zero{}; +struct TagACKS2InitMatvec{}; +struct TagACKS2SparseMatvec1{}; +struct TagACKS2SparseMatvec2{}; + +template +struct TagACKS2SparseMatvec3_Half{}; + +struct TagACKS2SparseMatvec3_Full{}; +struct TagACKS2Norm1{}; +struct TagACKS2Norm2{}; +struct TagACKS2Norm3{}; +struct TagACKS2Dot1{}; +struct TagACKS2Dot2{}; +struct TagACKS2Dot3{}; +struct TagACKS2Dot4{}; +struct TagACKS2Dot5{}; +struct TagACKS2Precon1A{}; +struct TagACKS2Precon1B{}; +struct TagACKS2Precon2{}; +struct TagACKS2Add{}; +struct TagACKS2ZeroQGhosts{}; +struct TagACKS2CalculateQ1{}; +struct TagACKS2CalculateQ2{}; + +template +class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF { + public: + typedef DeviceType device_type; + typedef double value_type; + typedef ArrayTypes AT; + FixACKS2ReaxFFKokkos(class LAMMPS *, int, char **); + ~FixACKS2ReaxFFKokkos(); + + void cleanup_copy(); + void init(); + void setup_pre_force(int); + void pre_force(int); + + DAT::tdual_ffloat_1d get_s() {return k_s;} + + KOKKOS_INLINE_FUNCTION + void num_neigh_item(int, int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Zero, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2InitMatvec, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void compute_h_item(int, int &, const bool &) const; + + template + KOKKOS_INLINE_FUNCTION + void compute_h_team(const typename Kokkos::TeamPolicy ::member_type &team, int, int) const; + + template + KOKKOS_INLINE_FUNCTION + void compute_x_item(int, int &, const bool &) const; + + template + KOKKOS_INLINE_FUNCTION + void compute_x_team(const typename Kokkos::TeamPolicy ::member_type &team, int, int) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2SparseMatvec1, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2SparseMatvec2, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2SparseMatvec3_Half, const int&) const; + + typedef typename Kokkos::TeamPolicy::member_type membertype; + KOKKOS_INLINE_FUNCTION + void operator() (TagACKS2SparseMatvec3_Full, const membertype &team) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Norm1, const int&, double&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Norm2, const int&, double&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Norm3, const int&, double&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Dot1, const int&, double&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Dot2, const int&, double&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Dot3, const int&, double&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Dot4, const int&, double&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Dot5, const int&, double&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Precon1A, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Precon1B, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Precon2, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2Add, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2ZeroQGhosts, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2CalculateQ1, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagACKS2CalculateQ2, const int&) const; + + KOKKOS_INLINE_FUNCTION + double calculate_H_k(const F_FLOAT &r, const F_FLOAT &shld) const; + + KOKKOS_INLINE_FUNCTION + double calculate_X_k(const F_FLOAT &r, const F_FLOAT &bcut) const; + + struct params_acks2{ + KOKKOS_INLINE_FUNCTION + params_acks2(){chi=0;eta=0;gamma=0;bcut_acks2=0;}; + KOKKOS_INLINE_FUNCTION + params_acks2(int i){chi=0;eta=0;gamma=0;bcut_acks2=0;}; + F_FLOAT chi, eta, gamma, bcut_acks2; + }; + + private: + int inum; + int allocated_flag, last_allocate; + int need_dup,prev_last_rows_rank; + double* buf; + + typename AT::t_int_scalar d_mfill_offset; + + typedef Kokkos::DualView tdual_int_1d; + Kokkos::DualView k_params; + typename Kokkos::DualView::t_dev_const params; + + typename ArrayTypes::t_x_array x; + typename ArrayTypes::t_v_array v; + typename ArrayTypes::t_f_array_const f; + typename ArrayTypes::t_ffloat_1d_randomread mass; + typename ArrayTypes::t_ffloat_1d q; + typename ArrayTypes::t_int_1d type, mask; + typename ArrayTypes::t_tagint_1d tag; + + typename ArrayTypes::t_neighbors_2d d_neighbors; + typename ArrayTypes::t_int_1d_randomread d_ilist, d_numneigh; + + DAT::tdual_ffloat_1d k_tap; + typename AT::t_ffloat_1d d_tap; + + DAT::tdual_ffloat_2d k_bcut; + typename AT::t_ffloat_2d d_bcut; + + typename AT::t_int_1d d_firstnbr; + typename AT::t_int_1d d_numnbrs; + typename AT::t_int_1d d_jlist; + typename AT::t_ffloat_1d d_val; + + typename AT::t_int_1d d_firstnbr_X; + typename AT::t_int_1d d_numnbrs_X; + typename AT::t_int_1d d_jlist_X; + typename AT::t_ffloat_1d d_val_X; + + DAT::tdual_ffloat_1d k_s, k_X_diag, k_chi_field; + typename AT::t_ffloat_1d d_Hdia_inv,d_Xdia_inv, d_X_diag, d_chi_field, d_b_s, d_s; + typename AT::t_ffloat_1d_randomread r_b_s, r_s; + + DAT::tdual_ffloat_1d k_d, k_q_hat, k_z, k_y; + typename AT::t_ffloat_1d d_p, d_q, d_r, d_d, d_g, d_q_hat, d_r_hat, d_y, d_z, d_bb, d_xx; + typename AT::t_ffloat_1d_randomread r_p, r_r, r_d; + + DAT::tdual_ffloat_2d k_shield, k_s_hist, k_s_hist_X, k_s_hist_last; + typename AT::t_ffloat_2d d_shield, d_s_hist, d_s_hist_X, d_s_hist_last; + typename AT::t_ffloat_2d_randomread r_s_hist, r_s_hist_X, r_s_hist_last; + + Kokkos::Experimental::ScatterView::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterDuplicated> dup_X_diag; + Kokkos::Experimental::ScatterView::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterNonDuplicated> ndup_X_diag; + + Kokkos::Experimental::ScatterView::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterDuplicated> dup_bb; + Kokkos::Experimental::ScatterView::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterNonDuplicated> ndup_bb; + + void init_shielding_k(); + void init_hist(); + void allocate_matrix(); + void allocate_array(); + void deallocate_array(); + int bicgstab_solve(); + void calculate_Q(); + + int neighflag; + int nlocal,nall,nmax,newton_pair; + int count, isuccess; + double alpha, beta, omega, cutsq; + + int iswap; + int first; + typename AT::t_int_2d d_sendlist; + typename AT::t_xfloat_1d_um v_buf; + + void grow_arrays(int); + void copy_arrays(int, int, int); + int pack_exchange(int, double *); + int unpack_exchange(int, double *); + void get_chi_field(); + double memory_usage(); + + void sparse_matvec_acks2(typename AT::t_ffloat_1d &, typename AT::t_ffloat_1d &); +}; + +template +struct FixACKS2ReaxFFKokkosNumNeighFunctor { + typedef DeviceType device_type; + typedef int value_type; + FixACKS2ReaxFFKokkos c; + FixACKS2ReaxFFKokkosNumNeighFunctor(FixACKS2ReaxFFKokkos* c_ptr):c(*c_ptr) { + c.cleanup_copy(); + }; + KOKKOS_INLINE_FUNCTION + void operator()(const int ii, int &maxneigh) const { + c.num_neigh_item(ii, maxneigh); + } +}; + +template +struct FixACKS2ReaxFFKokkosComputeHFunctor { + int atoms_per_team, vector_length; + typedef int value_type; + typedef Kokkos::ScratchMemorySpace scratch_space; + FixACKS2ReaxFFKokkos c; + + FixACKS2ReaxFFKokkosComputeHFunctor(FixACKS2ReaxFFKokkos* c_ptr):c(*c_ptr) { + c.cleanup_copy(); + }; + + FixACKS2ReaxFFKokkosComputeHFunctor(FixACKS2ReaxFFKokkos *c_ptr, + int _atoms_per_team, int _vector_length) + : c(*c_ptr), atoms_per_team(_atoms_per_team), + vector_length(_vector_length) { + c.cleanup_copy(); + }; + + KOKKOS_INLINE_FUNCTION + void operator()(const int ii, int &m_fill, const bool &final) const { + c.template compute_h_item(ii,m_fill,final); + } + + KOKKOS_INLINE_FUNCTION + void operator()( + const typename Kokkos::TeamPolicy::member_type &team) const { + c.template compute_h_team(team, atoms_per_team, vector_length); + } + + size_t team_shmem_size(int /*team_size*/) const { + size_t shmem_size = + Kokkos::View::shmem_size( + atoms_per_team) + // s_ilist + Kokkos::View::shmem_size( + atoms_per_team) + // s_numnbrs + Kokkos::View::shmem_size( + atoms_per_team) + // s_firstnbr + Kokkos::View:: + shmem_size(atoms_per_team, vector_length) + // s_jtype + Kokkos::View:: + shmem_size(atoms_per_team, vector_length) + // s_j + Kokkos::View::shmem_size(atoms_per_team, + vector_length); // s_r + return shmem_size; + } +}; + +template +struct FixACKS2ReaxFFKokkosComputeXFunctor { + int atoms_per_team, vector_length; + typedef int value_type; + typedef Kokkos::ScratchMemorySpace scratch_space; + FixACKS2ReaxFFKokkos c; + + FixACKS2ReaxFFKokkosComputeXFunctor(FixACKS2ReaxFFKokkos* c_ptr):c(*c_ptr) { + c.cleanup_copy(); + }; + + FixACKS2ReaxFFKokkosComputeXFunctor(FixACKS2ReaxFFKokkos *c_ptr, + int _atoms_per_team, int _vector_length) + : c(*c_ptr), atoms_per_team(_atoms_per_team), + vector_length(_vector_length) { + c.cleanup_copy(); + }; + + KOKKOS_INLINE_FUNCTION + void operator()(const int ii, int &m_fill, const bool &final) const { + c.template compute_x_item(ii,m_fill,final); + } + + KOKKOS_INLINE_FUNCTION + void operator()( + const typename Kokkos::TeamPolicy::member_type &team) const { + c.template compute_x_team(team, atoms_per_team, vector_length); + } + + size_t team_shmem_size(int /*team_size*/) const { + size_t shmem_size = + Kokkos::View::shmem_size( + atoms_per_team) + // s_ilist + Kokkos::View::shmem_size( + atoms_per_team) + // s_numnbrs + Kokkos::View::shmem_size( + atoms_per_team) + // s_firstnbr + Kokkos::View:: + shmem_size(atoms_per_team, vector_length) + // s_jtype + Kokkos::View:: + shmem_size(atoms_per_team, vector_length) + // s_j + Kokkos::View::shmem_size(atoms_per_team, + vector_length); // s_r + return shmem_size; + } +}; + +} + +#endif +#endif diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp index 6761ab9b0e..b35bbc46ee 100644 --- a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp @@ -75,6 +75,7 @@ FixQEqReaxFFKokkos::~FixQEqReaxFFKokkos() memoryKK->destroy_kokkos(k_s_hist,s_hist); memoryKK->destroy_kokkos(k_t_hist,t_hist); + memoryKK->destroy_kokkos(k_chi_field,chi_field); } /* ---------------------------------------------------------------------- */ @@ -256,6 +257,8 @@ void FixQEqReaxFFKokkos::pre_force(int /*vflag*/) // init_matvec + if (efield) get_chi_field(); + k_s_hist.template sync(); k_t_hist.template sync(); FixQEqReaxFFKokkosMatVecFunctor matvec_functor(this); @@ -373,10 +376,15 @@ void FixQEqReaxFFKokkos::allocate_array() k_d = DAT::tdual_ffloat_1d("qeq/kk:d",nmax); d_d = k_d.template view(); h_d = k_d.h_view; + + memoryKK->create_kokkos(k_chi_field,chi_field,nmax,"qeq/kk:chi_field"); + d_chi_field = k_chi_field.template view(); } // init_storage + if (efield) get_chi_field(); + FixQEqReaxFFKokkosZeroFunctor zero_functor(this); Kokkos::parallel_for(ignum,zero_functor); @@ -392,7 +400,7 @@ void FixQEqReaxFFKokkos::zero_item(int ii) const if (mask[i] & groupbit) { d_Hdia_inv[i] = 1.0 / params(itype).eta; - d_b_s[i] = -params(itype).chi; + d_b_s[i] = -params(itype).chi - d_chi_field[i]; d_b_t[i] = -1.0; d_s[i] = 0.0; d_t[i] = 0.0; @@ -711,7 +719,7 @@ void FixQEqReaxFFKokkos::matvec_item(int ii) const if (mask[i] & groupbit) { d_Hdia_inv[i] = 1.0 / params(itype).eta; - d_b_s[i] = -params(itype).chi; + d_b_s[i] = -params(itype).chi - d_chi_field[i]; d_b_t[i] = -1.0; d_t[i] = d_t_hist(i,2) + 3*(d_t_hist(i,0) - d_t_hist(i,1)); d_s[i] = 4*(d_s_hist(i,0)+d_s_hist(i,2))-(6*d_s_hist(i,1)+d_s_hist(i,3)); @@ -1575,6 +1583,17 @@ int FixQEqReaxFFKokkos::unpack_exchange(int nlocal, double *buf) /* ---------------------------------------------------------------------- */ +template +void FixQEqReaxFFKokkos::get_chi_field() +{ + atomKK->sync(Host,X_MASK|MASK_MASK|IMAGE_MASK); + FixQEqReaxFF::get_chi_field(); + k_chi_field.modify_host(); + k_chi_field.sync_device(); +} + +/* ---------------------------------------------------------------------- */ + namespace LAMMPS_NS { template class FixQEqReaxFFKokkos; #ifdef LMP_KOKKOS_GPU diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.h b/src/KOKKOS/fix_qeq_reaxff_kokkos.h index 3965770236..fc4f4bafd5 100644 --- a/src/KOKKOS/fix_qeq_reaxff_kokkos.h +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.h @@ -30,7 +30,6 @@ FixStyle(qeq/reax/kk/host,FixQEqReaxFFKokkos); #include "kokkos_type.h" #include "neigh_list.h" #include "neigh_list_kokkos.h" -#include "kokkos_base.h" namespace LAMMPS_NS { @@ -42,7 +41,7 @@ struct TagFixQEqReaxFFPackForwardComm {}; struct TagFixQEqReaxFFUnpackForwardComm {}; template -class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase { +class FixQEqReaxFFKokkos : public FixQEqReaxFF { public: typedef DeviceType device_type; typedef ArrayTypes AT; @@ -201,8 +200,8 @@ class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase { typename AT::t_int_1d d_jlist; typename AT::t_ffloat_1d d_val; - DAT::tdual_ffloat_1d k_t, k_s; - typename AT::t_ffloat_1d d_Hdia_inv, d_b_s, d_b_t, d_t, d_s; + DAT::tdual_ffloat_1d k_t, k_s, k_chi_field; + typename AT::t_ffloat_1d d_Hdia_inv, d_b_s, d_b_t, d_t, d_s, d_chi_field; HAT::t_ffloat_1d h_t, h_s; typename AT::t_ffloat_1d_randomread r_b_s, r_b_t, r_t, r_s; @@ -241,6 +240,7 @@ class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase { void copy_arrays(int, int, int); int pack_exchange(int, double *); int unpack_exchange(int, double *); + void get_chi_field(); }; template diff --git a/src/KOKKOS/fix_rx_kokkos.cpp b/src/KOKKOS/fix_rx_kokkos.cpp index 15b4a39849..caa79c77b1 100644 --- a/src/KOKKOS/fix_rx_kokkos.cpp +++ b/src/KOKKOS/fix_rx_kokkos.cpp @@ -54,7 +54,7 @@ namespace /* anonymous */ { typedef double TimerType; -TimerType getTimeStamp(void) { return MPI_Wtime(); } +TimerType getTimeStamp(void) { return platform::walltime(); } double getElapsedTime( const TimerType &t0, const TimerType &t1) { return t1-t0; } } // end namespace @@ -2075,7 +2075,7 @@ void FixRxKokkos::computeLocalTemperature() // Local list views. (This isn't working!) NeighListKokkos* k_list = static_cast*>(list); - if (not(list->kokkos)) + if (!list->kokkos) error->one(FLERR,"list is not a Kokkos list\n"); //typename ArrayTypes::t_neighbors_2d d_neighbors = k_list->d_neighbors; diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index be32604f94..e26513a122 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -23,7 +23,15 @@ #include #include #include -#include + +#if defined(_WIN32) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include // for _getpid() +#else +#include // for getpid() +#endif #ifdef LMP_KOKKOS_GPU @@ -36,7 +44,7 @@ #define GPU_AWARE_UNKNOWN static int have_gpu_aware = -1; // TODO HIP: implement HIP-aware MPI support (UCX) detection -#if defined(KOKKOS_ENABLE_HIP) || defined(KOKKOS_ENABLE_SYCL) +#if defined(KOKKOS_ENABLE_HIP) || defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET) GPU_AWARE_UNKNOWN #elif defined(KOKKOS_ENABLE_CUDA) @@ -113,7 +121,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) } else if (strcmp(arg[iarg],"g") == 0 || strcmp(arg[iarg],"gpus") == 0) { #ifndef LMP_KOKKOS_GPU - error->all(FLERR,"GPUs are requested but Kokkos has not been compiled for CUDA, HIP, or SYCL"); + error->all(FLERR,"GPUs are requested but Kokkos has not been compiled using a GPU-enabled backend"); #endif if (iarg+2 > narg) error->all(FLERR,"Invalid Kokkos command-line args"); ngpus = atoi(arg[iarg+1]); @@ -154,7 +162,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) if (ngpus > 1 && !set_flag) error->all(FLERR,"Could not determine local MPI rank for multiple " - "GPUs with Kokkos CUDA, HIP, or SYCL because MPI library not recognized"); + "GPUs with Kokkos because MPI library not recognized"); } else if (strcmp(arg[iarg],"t") == 0 || strcmp(arg[iarg],"threads") == 0) { @@ -196,7 +204,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) #ifdef LMP_KOKKOS_GPU if (ngpus <= 0) - error->all(FLERR,"Kokkos has been compiled for CUDA, HIP, or SYCL but no GPUs are requested"); + error->all(FLERR,"Kokkos has been compiled with GPU-enabled backend but no GPUs are requested"); #endif #ifndef KOKKOS_ENABLE_SERIAL @@ -303,7 +311,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) error->warning(FLERR,"Detected MPICH. Disabling GPU-aware MPI"); #else if (me == 0) - error->warning(FLERR,"Kokkos with CUDA, HIP, or SYCL assumes CUDA-aware MPI is available," + error->warning(FLERR,"Kokkos with GPU-enabled backend assumes GPU-aware MPI is available," " but cannot determine if this is the case\n try" " '-pk kokkos gpu/aware off' if getting segmentation faults"); @@ -591,6 +599,10 @@ int KokkosLMP::neigh_count(int m) void KokkosLMP::my_signal_handler(int sig) { if (sig == SIGSEGV) { +#if defined(_WIN32) + kill(_getpid(),SIGABRT); +#else kill(getpid(),SIGABRT); +#endif } } diff --git a/src/KOKKOS/kokkos.h b/src/KOKKOS/kokkos.h index 65990544ad..af35d95b9e 100644 --- a/src/KOKKOS/kokkos.h +++ b/src/KOKKOS/kokkos.h @@ -61,9 +61,11 @@ class KokkosLMP : protected Pointers { int neigh_count(int); template - int need_dup() + int need_dup(int qeq_flag = 0) { int value = 0; + int neighflag = this->neighflag; + if (qeq_flag) neighflag = this->neighflag_qeq; if (neighflag == HALFTHREAD) value = std::is_same::value,Kokkos::Experimental::ScatterDuplicated>::value; @@ -85,7 +87,7 @@ E: Invalid Kokkos command-line args Self-explanatory. See Section 2.7 of the manual for details. -E: Could not determine local MPI rank for multiple GPUs with Kokkos CUDA +E: Could not determine local MPI rank for multiple GPUs with Kokkos because MPI library not recognized The local MPI rank was not found in one of four supported environment variables. @@ -94,13 +96,13 @@ E: Invalid number of threads requested for Kokkos: must be 1 or greater Self-explanatory. -E: GPUs are requested but Kokkos has not been compiled for CUDA +E: GPUs are requested but Kokkos has not been compiled using GPU-enabled backend -Recompile Kokkos with CUDA support to use GPUs. +Recompile Kokkos with GPU-enabled backend to use GPUs. -E: Kokkos has been compiled for CUDA, HIP, or SYCL but no GPUs are requested +E: Kokkos has been compiled with GPU-enabled backend but no GPUs are requested -One or more GPUs must be used when Kokkos is compiled for CUDA/HIP/SYCL. +One or more GPUs must be used when Kokkos is compiled for CUDA/HIP/SYCL/OpenMPTarget. W: Kokkos package already initalized, cannot reinitialize with different parameters diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index 05c839db3f..4c0dea819c 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -20,19 +20,21 @@ #include #include -#include +#include #include #include #include -enum{FULL=1u,HALFTHREAD=2u,HALF=4u}; +constexpr int FULL = 1; +constexpr int HALFTHREAD = 2; +constexpr int HALF = 4; #if defined(KOKKOS_ENABLE_CXX11) #undef ISFINITE #define ISFINITE(x) std::isfinite(x) #endif -#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) || defined(KOKKOS_ENABLE_SYCL) +#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) || defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET) #define LMP_KOKKOS_GPU #endif @@ -221,6 +223,11 @@ template<> struct ExecutionSpaceFromDevice { static const LAMMPS_NS::ExecutionSpace space = LAMMPS_NS::Device; }; +#elif defined(KOKKOS_ENABLE_OPENMPTARGET) +template<> +struct ExecutionSpaceFromDevice { + static const LAMMPS_NS::ExecutionSpace space = LAMMPS_NS::Device; +}; #endif // set host pinned space @@ -230,6 +237,8 @@ typedef Kokkos::CudaHostPinnedSpace LMPPinnedHostType; typedef Kokkos::Experimental::HIPHostPinnedSpace LMPPinnedHostType; #elif defined(KOKKOS_ENABLE_SYCL) typedef Kokkos::Experimental::SYCLSharedUSMSpace LMPPinnedHostType; +#elif defined(KOKKOS_ENABLE_OPENMPTARGET) +typedef Kokkos::Serial LMPPinnedHostType; #endif // create simple LMPDeviceSpace typedef for non CUDA-, HIP-, or SYCL-specific @@ -240,6 +249,8 @@ typedef Kokkos::Cuda LMPDeviceSpace; typedef Kokkos::Experimental::HIP LMPDeviceSpace; #elif defined(KOKKOS_ENABLE_SYCL) typedef Kokkos::Experimental::SYCL LMPDeviceSpace; +#elif defined(KOKKOS_ENABLE_OPENMPTARGET) +typedef Kokkos::Experimental::OpenMPTarget LMPDeviceSpace; #endif @@ -278,6 +289,11 @@ template<> struct AtomicDup { using value = Kokkos::Experimental::ScatterAtomic; }; +#elif defined(KOKKOS_ENABLE_OPENMPTARGET) +template<> +struct AtomicDup { + using value = Kokkos::Experimental::ScatterAtomic; +}; #endif #ifdef LMP_KOKKOS_USE_ATOMICS diff --git a/src/KOKKOS/modify_kokkos.cpp b/src/KOKKOS/modify_kokkos.cpp index 868de3e11e..5545351f53 100644 --- a/src/KOKKOS/modify_kokkos.cpp +++ b/src/KOKKOS/modify_kokkos.cpp @@ -38,7 +38,20 @@ ModifyKokkos::ModifyKokkos(LAMMPS *lmp) : Modify(lmp) void ModifyKokkos::setup(int vflag) { // compute setup needs to come before fix setup - // b/c NH fixes need use DOF of temperature computes + // b/c NH fixes need DOF of temperature computes + // fix group setup() is special case since populates a dynamic group + // needs to be done before temperature compute setup + + for (int i = 0; i < nfix; i++) { + if (strcmp(fix[i]->style,"GROUP") == 0) { + atomKK->sync(fix[i]->execution_space,fix[i]->datamask_read); + int prev_auto_sync = lmp->kokkos->auto_sync; + if (!fix[i]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[i]->setup(vflag); + lmp->kokkos->auto_sync = prev_auto_sync; + atomKK->modified(fix[i]->execution_space,fix[i]->datamask_modify); + } + } for (int i = 0; i < ncompute; i++) compute[i]->setup(); @@ -124,6 +137,37 @@ void ModifyKokkos::setup_pre_neighbor() } } +/* ---------------------------------------------------------------------- + setup post_neighbor call, only for fixes that define post_neighbor + called from Verlet, RESPA +------------------------------------------------------------------------- */ + +void ModifyKokkos::setup_post_neighbor() +{ + if (update->whichflag == 1) + for (int i = 0; i < n_post_neighbor; i++) { + atomKK->sync(fix[list_post_neighbor[i]]->execution_space, + fix[list_post_neighbor[i]]->datamask_read); + int prev_auto_sync = lmp->kokkos->auto_sync; + if (!fix[list_post_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_post_neighbor[i]]->setup_post_neighbor(); + lmp->kokkos->auto_sync = prev_auto_sync; + atomKK->modified(fix[list_post_neighbor[i]]->execution_space, + fix[list_post_neighbor[i]]->datamask_modify); + } + else if (update->whichflag == 2) + for (int i = 0; i < n_min_post_neighbor; i++) { + atomKK->sync(fix[list_min_post_neighbor[i]]->execution_space, + fix[list_min_post_neighbor[i]]->datamask_read); + int prev_auto_sync = lmp->kokkos->auto_sync; + if (!fix[list_min_post_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_min_post_neighbor[i]]->setup_post_neighbor(); + lmp->kokkos->auto_sync = prev_auto_sync; + atomKK->modified(fix[list_min_post_neighbor[i]]->execution_space, + fix[list_min_post_neighbor[i]]->datamask_modify); + } +} + /* ---------------------------------------------------------------------- setup pre_force call, only for fixes that define pre_force called from Verlet, RESPA, Min @@ -258,6 +302,24 @@ void ModifyKokkos::pre_neighbor() } } +/* ---------------------------------------------------------------------- + post_neighbor call, only for relevant fixes +------------------------------------------------------------------------- */ + +void ModifyKokkos::post_neighbor() +{ + for (int i = 0; i < n_post_neighbor; i++) { + atomKK->sync(fix[list_post_neighbor[i]]->execution_space, + fix[list_post_neighbor[i]]->datamask_read); + int prev_auto_sync = lmp->kokkos->auto_sync; + if (!fix[list_post_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_post_neighbor[i]]->post_neighbor(); + lmp->kokkos->auto_sync = prev_auto_sync; + atomKK->modified(fix[list_post_neighbor[i]]->execution_space, + fix[list_post_neighbor[i]]->datamask_modify); + } +} + /* ---------------------------------------------------------------------- pre_force call, only for relevant fixes ------------------------------------------------------------------------- */ @@ -420,6 +482,12 @@ void ModifyKokkos::post_run() atomKK->modified(fix[i]->execution_space, fix[i]->datamask_modify); } + + // must reset this to its default value, since computes may be added + // or removed between runs and with this change we will redirect any + // calls to addstep_compute() to addstep_compute_all() instead. + n_timeflag = -1; + } /* ---------------------------------------------------------------------- @@ -567,6 +635,24 @@ void ModifyKokkos::min_pre_neighbor() } } +/* ---------------------------------------------------------------------- + minimizer post-neighbor call, only for relevant fixes +------------------------------------------------------------------------- */ + +void ModifyKokkos::min_post_neighbor() +{ + for (int i = 0; i < n_min_post_neighbor; i++) { + atomKK->sync(fix[list_min_post_neighbor[i]]->execution_space, + fix[list_min_post_neighbor[i]]->datamask_read); + int prev_auto_sync = lmp->kokkos->auto_sync; + if (!fix[list_min_post_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_min_post_neighbor[i]]->min_post_neighbor(); + lmp->kokkos->auto_sync = prev_auto_sync; + atomKK->modified(fix[list_min_post_neighbor[i]]->execution_space, + fix[list_min_post_neighbor[i]]->datamask_modify); + } +} + /* ---------------------------------------------------------------------- minimizer pre-force call, only for relevant fixes ------------------------------------------------------------------------- */ @@ -646,7 +732,7 @@ double ModifyKokkos::min_energy(double *fextra) } /* ---------------------------------------------------------------------- - store current state of extra dof, only for relevant fixes + store current state of extra minimizer dof, only for relevant fixes ------------------------------------------------------------------------- */ void ModifyKokkos::min_store() @@ -664,7 +750,7 @@ void ModifyKokkos::min_store() } /* ---------------------------------------------------------------------- - mange state of extra dof on a stack, only for relevant fixes + manage state of extra minimizer dof on a stack, only for relevant fixes ------------------------------------------------------------------------- */ void ModifyKokkos::min_clearstore() @@ -710,7 +796,7 @@ void ModifyKokkos::min_popstore() } /* ---------------------------------------------------------------------- - displace extra dof along vector hextra, only for relevant fixes + displace extra minimizer dof along vector hextra, only for relevant fixes ------------------------------------------------------------------------- */ void ModifyKokkos::min_step(double alpha, double *hextra) @@ -755,7 +841,7 @@ double ModifyKokkos::max_alpha(double *hextra) } /* ---------------------------------------------------------------------- - extract extra dof for minimization, only for relevant fixes + extract extra minimizer dof, only for relevant fixes ------------------------------------------------------------------------- */ int ModifyKokkos::min_dof() @@ -775,7 +861,7 @@ int ModifyKokkos::min_dof() } /* ---------------------------------------------------------------------- - reset reference state of fix, only for relevant fixes + reset minimizer reference state of fix, only for relevant fixes ------------------------------------------------------------------------- */ int ModifyKokkos::min_reset_ref() @@ -788,8 +874,8 @@ int ModifyKokkos::min_reset_ref() int prev_auto_sync = lmp->kokkos->auto_sync; if (!fix[list_min_energy[i]]->kokkosable) lmp->kokkos->auto_sync = 1; itmp = fix[list_min_energy[i]]->min_reset_ref(); - lmp->kokkos->auto_sync = prev_auto_sync; if (itmp) itmpall = 1; + lmp->kokkos->auto_sync = prev_auto_sync; atomKK->modified(fix[list_min_energy[i]]->execution_space, fix[list_min_energy[i]]->datamask_modify); } diff --git a/src/KOKKOS/modify_kokkos.h b/src/KOKKOS/modify_kokkos.h index 9b75b7c607..25911743b2 100644 --- a/src/KOKKOS/modify_kokkos.h +++ b/src/KOKKOS/modify_kokkos.h @@ -26,6 +26,7 @@ class ModifyKokkos : public Modify { void setup(int); void setup_pre_exchange(); void setup_pre_neighbor(); + void setup_post_neighbor(); void setup_pre_force(int); void setup_pre_reverse(int, int); void initial_integrate(int); @@ -33,6 +34,7 @@ class ModifyKokkos : public Modify { void pre_decide(); void pre_exchange(); void pre_neighbor(); + void post_neighbor(); void pre_force(int); void pre_reverse(int,int); void post_force(int); @@ -52,6 +54,7 @@ class ModifyKokkos : public Modify { void min_pre_exchange(); void min_pre_neighbor(); + void min_post_neighbor(); void min_pre_force(int); void min_pre_reverse(int,int); void min_post_force(int); diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 1110aef4a6..42ecedd78a 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -226,7 +226,8 @@ void NPairKokkos::build(NeighList *list_) data.h_resize() = 0; Kokkos::deep_copy(d_scalars, h_scalars); -#ifdef LMP_KOKKOS_GPU + +#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) #define BINS_PER_BLOCK 2 const int factor = atoms_per_bin<64?2:1; #else @@ -605,14 +606,15 @@ void NeighborKokkosExecute::build_ItemGPU(typename Kokkos::TeamPolic other_x[MY_II + 3 * atoms_per_bin] = itype; } other_id[MY_II] = i; -#ifndef KOKKOS_ENABLE_SYCL +#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) int test = (__syncthreads_count(i >= 0 && i <= nlocal) == 0); - if (test) return; -#else +#elif defined(KOKKOS_ENABLE_SYCL) int not_done = (i >= 0 && i <= nlocal); dev.team_reduce(Kokkos::Max(not_done)); if(not_done == 0) return; +#elif defined(KOKKOS_ENABLE_OPENMPTARGET) + dev.team_barrier(); #endif if (i >= 0 && i < nlocal) { @@ -1055,14 +1057,15 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP other_x[MY_II + 4 * atoms_per_bin] = radi; } other_id[MY_II] = i; -#ifndef KOKKOS_ENABLE_SYCL +#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) int test = (__syncthreads_count(i >= 0 && i <= nlocal) == 0); - if (test) return; -#else +#elif defined(KOKKOS_ENABLE_SYCL) int not_done = (i >= 0 && i <= nlocal); dev.team_reduce(Kokkos::Max(not_done)); if(not_done == 0) return; +#elif defined(KOKKOS_ENABLE_OPENMPTARGET) + dev.team_barrier(); #endif if (i >= 0 && i < nlocal) { diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.cpp b/src/KOKKOS/pair_exp6_rx_kokkos.cpp index 4da3a43243..0988cb4910 100644 --- a/src/KOKKOS/pair_exp6_rx_kokkos.cpp +++ b/src/KOKKOS/pair_exp6_rx_kokkos.cpp @@ -61,7 +61,7 @@ namespace /* anonymous */ { //typedef double TimerType; -//TimerType getTimeStamp(void) { return MPI_Wtime(); } +//TimerType getTimeStamp(void) { return platform::walltime(); } //double getElapsedTime( const TimerType &t0, const TimerType &t1) { return t1-t0; } typedef struct timespec TimerType; diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index aac0229f87..43a650efb2 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -23,6 +23,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "fix_acks2_reaxff_kokkos.h" #include "kokkos.h" #include "math_const.h" #include "math_special.h" @@ -141,6 +142,25 @@ void PairReaxFFKokkos::init_style() if (fix_reaxff) modify->delete_fix(fix_id); // not needed in the Kokkos version fix_reaxff = nullptr; + acks2_flag = api->system->acks2_flag; + if (acks2_flag) { + int ifix = modify->find_fix_by_style("^acks2/reax"); + Fix* fix = modify->fix[ifix]; + if (!fix->kokkosable) + error->all(FLERR,"Must use Kokkos version of acks2/reaxff with pair reaxff/kk"); + if (fix->execution_space == Host) { + FixACKS2ReaxFFKokkos* acks2_fix = (FixACKS2ReaxFFKokkos*) modify->fix[ifix]; + auto k_s = acks2_fix->get_s(); + k_s.sync(); + d_s = k_s.view(); + } else { + FixACKS2ReaxFFKokkos* acks2_fix = (FixACKS2ReaxFFKokkos*) modify->fix[ifix]; + auto k_s = acks2_fix->get_s(); + k_s.sync(); + d_s = k_s.view(); + } + } + // irequest = neigh request made by parent class neighflag = lmp->kokkos->neighflag; @@ -230,6 +250,9 @@ void PairReaxFFKokkos::setup() // hydrogen bond k_params_sing.h_view(i).p_hbond = api->system->reax_param.sbp[map[i]].p_hbond; + // acks2 + k_params_sing.h_view(i).bcut_acks2 = api->system->reax_param.sbp[map[i]].bcut_acks2; + for (j = 1; j <= n; j++) { if (map[j] == -1) continue; @@ -690,9 +713,11 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) tag = atomKK->k_tag.view(); type = atomKK->k_type.view(); nlocal = atomKK->nlocal; - nall = atom->nlocal + atom->nghost; newton_pair = force->newton_pair; + nn = list->inum; + NN = list->inum + list->gnum; + const int inum = list->inum; const int ignum = inum + list->gnum; NeighListKokkos* k_list = static_cast*>(list); @@ -700,6 +725,22 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) d_neighbors = k_list->d_neighbors; d_ilist = k_list->d_ilist; + if (acks2_flag) { + int ifix = modify->find_fix_by_style("^acks2/reax"); + Fix* fix = modify->fix[ifix]; + if (fix->execution_space == Host) { + FixACKS2ReaxFFKokkos* acks2_fix = (FixACKS2ReaxFFKokkos*) modify->fix[ifix]; + auto k_s = acks2_fix->get_s(); + k_s.sync(); + d_s = k_s.view(); + } else { + FixACKS2ReaxFFKokkos* acks2_fix = (FixACKS2ReaxFFKokkos*) modify->fix[ifix]; + auto k_s = acks2_fix->get_s(); + k_s.sync(); + d_s = k_s.view(); + } + } + need_dup = lmp->kokkos->need_dup(); // allocate duplicated memory @@ -1057,7 +1098,12 @@ void PairReaxFFKokkos::operator()(PairReaxFFComputePolartemplate ev_tally(ev,i,i,epol,0.0,0.0,0.0,0.0); if (eflag_atom) this->template e_tally_single(ev,i,epol); @@ -1195,8 +1241,47 @@ void PairReaxFFKokkos::operator()(PairReaxFFComputeLJCoulomb 0.0) { + /* Coulombic energy contribution */ + const F_FLOAT effpot_diff = d_s[NN + i] + - d_s[NN + j]; + const F_FLOAT e_ele = -0.5 * KCALpMOL_to_EV * bond_softness + * SQR( effpot_diff ); + + ecoul += e_ele; + + /* forces contribution */ + F_FLOAT d_bond_softness; + d_bond_softness = gp[34] + * 3.0 / xcut * pow( d, 2.0 ) + * pow( 1.0 - d, 5.0 ) * (1.0 - 3.0 * d); + d_bond_softness = -0.5 * d_bond_softness + * SQR( effpot_diff ); + d_bond_softness = KCALpMOL_to_EV * d_bond_softness + / rij; + + fcoul += d_bond_softness; + } + } + } + const F_FLOAT ftotal = fvdwl + fcoul; fxtmp += delx*ftotal; @@ -1296,15 +1381,53 @@ void PairReaxFFKokkos::operator()(PairReaxFFComputeTabulatedLJCoulom const F_FLOAT evdwl = ((vdW.d*dif + vdW.c)*dif + vdW.b)*dif + vdW.a; - const F_FLOAT ecoul = (((ele.d*dif + ele.c)*dif + ele.b)*dif + + F_FLOAT ecoul = (((ele.d*dif + ele.c)*dif + ele.b)*dif + ele.a)*qi*qj; const F_FLOAT fvdwl = ((CEvd.d*dif + CEvd.c)*dif + CEvd.b)*dif + CEvd.a; - const F_FLOAT fcoul = (((CEclmb.d*dif+CEclmb.c)*dif+CEclmb.b)*dif + + F_FLOAT fcoul = (((CEclmb.d*dif+CEclmb.c)*dif+CEclmb.b)*dif + CEclmb.a)*qi*qj; + /* contribution to energy and gradients (atoms and cell) + * due to geometry-dependent terms in the ACKS2 + * kinetic energy */ + if (acks2_flag) { + + /* kinetic energy terms */ + double xcut = 0.5 * (paramssing(itype).bcut_acks2 + + paramssing(jtype).bcut_acks2); + + if (rij <= xcut) { + const F_FLOAT d = rij / xcut; + const F_FLOAT bond_softness = gp[34] * pow( d, 3.0 ) + * pow( 1.0 - d, 6.0 ); + + if (bond_softness > 0.0) { + /* Coulombic energy contribution */ + const F_FLOAT effpot_diff = d_s[NN + i] + - d_s[NN + j]; + const F_FLOAT e_ele = -0.5 * KCALpMOL_to_EV * bond_softness + * SQR( effpot_diff ); + + ecoul += e_ele; + + /* forces contribution */ + F_FLOAT d_bond_softness; + d_bond_softness = gp[34] + * 3.0 / xcut * pow( d, 2.0 ) + * pow( 1.0 - d, 5.0 ) * (1.0 - 3.0 * d); + d_bond_softness = -0.5 * d_bond_softness + * SQR( effpot_diff ); + d_bond_softness = KCALpMOL_to_EV * d_bond_softness + / rij; + + fcoul += d_bond_softness; + } + } + } + const F_FLOAT ftotal = fvdwl + fcoul; fxtmp += delx*ftotal; fytmp += dely*ftotal; diff --git a/src/KOKKOS/pair_reaxff_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h index 5ed89bf62f..a88248a717 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.h +++ b/src/KOKKOS/pair_reaxff_kokkos.h @@ -252,12 +252,12 @@ class PairReaxFFKokkos : public PairReaxFF { struct params_sing{ KOKKOS_INLINE_FUNCTION params_sing() {mass=0;chi=0;eta=0;r_s=0;r_pi=0;r_pi2=0;valency=0;valency_val=0;valency_e=0;valency_boc=0;nlp_opt=0; - p_lp2=0;p_ovun2=0;p_ovun5=0;p_val3=0;p_val5=0;p_hbond=0;}; + p_lp2=0;p_ovun2=0;p_ovun5=0;p_val3=0;p_val5=0;p_hbond=0;bcut_acks2=0;}; KOKKOS_INLINE_FUNCTION params_sing(int /*i*/) {mass=0;chi=0;eta=0;r_s=0;r_pi=0;r_pi2=0;valency=0;valency_val=0;valency_e=0;valency_boc=0;nlp_opt=0; - p_lp2=0;p_ovun2=0;p_ovun5=0;p_val3=0;p_val5=0;p_hbond=0;}; + p_lp2=0;p_ovun2=0;p_ovun5=0;p_val3=0;p_val5=0;p_hbond=0;bcut_acks2=0;}; F_FLOAT mass,chi,eta,r_s,r_pi,r_pi2,valency,valency_val,valency_e,valency_boc,nlp_opt, - p_lp2,p_ovun2,p_ovun5, p_val3, p_val5, p_hbond; + p_lp2,p_ovun2,p_ovun5, p_val3, p_val5, p_hbond, bcut_acks2; }; struct params_twbp{ @@ -377,7 +377,7 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_float_1d d_tap; HAT::t_float_1d h_tap; - typename AT::t_float_1d d_bo_rij, d_hb_rsq, d_Deltap, d_Deltap_boc, d_total_bo; + typename AT::t_float_1d d_bo_rij, d_hb_rsq, d_Deltap, d_Deltap_boc, d_total_bo, d_s; typename AT::t_float_1d d_Delta, d_Delta_boc, d_Delta_lp, d_dDelta_lp, d_Delta_lp_temp, d_CdDelta; typename AT::t_ffloat_2d_dl d_BO, d_BO_s, d_BO_pi, d_BO_pi2, d_dBOp; typename AT::t_ffloat_2d_dl d_dln_BOp_pix, d_dln_BOp_piy, d_dln_BOp_piz; @@ -426,7 +426,7 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_ffloat_2d_dl d_dBOpx, d_dBOpy, d_dBOpz; int neighflag, newton_pair, maxnumneigh, maxhb, maxbo; - int nlocal,nall,eflag,vflag; + int nlocal,nn,NN,eflag,vflag,acks2_flag; F_FLOAT cut_nbsq, cut_hbsq, cut_bosq, bo_cut, thb_cut, thb_cutsq; F_FLOAT bo_cut_bond; diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index d71d7d1bad..da18bba001 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -2857,7 +2857,7 @@ int PPPMKokkos::timing_1d(int n, double &time1d) copymode = 0; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); for (int i = 0; i < n; i++) { fft1->timing1d(d_work1,nfft_both,FFT3dKokkos::FORWARD); @@ -2867,7 +2867,7 @@ int PPPMKokkos::timing_1d(int n, double &time1d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time1d = time2 - time1; return 4; @@ -2894,7 +2894,7 @@ int PPPMKokkos::timing_3d(int n, double &time3d) copymode = 0; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); for (int i = 0; i < n; i++) { fft1->compute(d_work1,d_work1,FFT3dKokkos::FORWARD); @@ -2904,7 +2904,7 @@ int PPPMKokkos::timing_3d(int n, double &time3d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time3d = time2 - time1; return 4; diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index 5e9ab757c6..14540c9ace 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -283,7 +283,7 @@ void VerletKokkos::run(int n) atomKK->sync(Device,ALL_MASK); //static double time = 0.0; - //Kokkos::Impl::Timer ktimer; + //Kokkos::Timer ktimer; timer->init_timeout(); for (int i = 0; i < n; i++) { @@ -445,7 +445,7 @@ void VerletKokkos::run(int n) if (pair_compute_flag) { atomKK->sync(force->pair->execution_space,force->pair->datamask_read); atomKK->sync(force->pair->execution_space,~(~force->pair->datamask_read|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); - Kokkos::Impl::Timer ktimer; + Kokkos::Timer ktimer; force->pair->compute(eflag,vflag); atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); atomKK->modified(force->pair->execution_space,~(~force->pair->datamask_modify|(F_MASK | ENERGY_MASK | VIRIAL_MASK))); diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 6f093d5d0a..1f08205f21 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -51,12 +51,6 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp) : mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } -/* ---------------------------------------------------------------------- - free all memory -------------------------------------------------------------------------- */ - -EwaldDipoleSpin::~EwaldDipoleSpin() {} - /* ---------------------------------------------------------------------- called once before run ------------------------------------------------------------------------- */ diff --git a/src/KSPACE/ewald_dipole_spin.h b/src/KSPACE/ewald_dipole_spin.h index eb87c69ae2..4660dde987 100644 --- a/src/KSPACE/ewald_dipole_spin.h +++ b/src/KSPACE/ewald_dipole_spin.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class EwaldDipoleSpin : public EwaldDipole { public: EwaldDipoleSpin(class LAMMPS *); - virtual ~EwaldDipoleSpin(); + virtual ~EwaldDipoleSpin() = default; void init(); void setup(); void compute(int, int); diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index b6739d43fd..06d90e5d0e 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -983,7 +983,7 @@ void PPPM::set_grid_global() h = h_x = h_y = h_z = 4.0/g_ewald; int count = 0; - while (1) { + while (true) { // set grid dimensions @@ -2981,7 +2981,7 @@ int PPPM::timing_1d(int n, double &time1d) for (int i = 0; i < 2*nfft_both; i++) work1[i] = ZEROF; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); for (int i = 0; i < n; i++) { fft1->timing1d(work1,nfft_both,FFT3d::FORWARD); @@ -2993,7 +2993,7 @@ int PPPM::timing_1d(int n, double &time1d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time1d = time2 - time1; if (differentiation_flag) return 2; @@ -3011,7 +3011,7 @@ int PPPM::timing_3d(int n, double &time3d) for (int i = 0; i < 2*nfft_both; i++) work1[i] = ZEROF; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); for (int i = 0; i < n; i++) { fft1->compute(work1,work1,FFT3d::FORWARD); @@ -3023,7 +3023,7 @@ int PPPM::timing_3d(int n, double &time3d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time3d = time2 - time1; if (differentiation_flag) return 2; diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index a39973c6ae..abadcc52be 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -783,7 +783,7 @@ void PPPMDipole::set_grid_global() h = h_x = h_y = h_z = 4.0/g_ewald; int count = 0; - while (1) { + while (true) { // set grid dimension @@ -2443,7 +2443,7 @@ int PPPMDipole::timing_1d(int n, double &time1d) for (int i = 0; i < 2*nfft_both; i++) work1[i] = ZEROF; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); for (int i = 0; i < n; i++) { fft1->timing1d(work1,nfft_both,FFT3d::FORWARD); @@ -2461,7 +2461,7 @@ int PPPMDipole::timing_1d(int n, double &time1d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time1d = time2 - time1; return 12; @@ -2478,7 +2478,7 @@ int PPPMDipole::timing_3d(int n, double &time3d) for (int i = 0; i < 2*nfft_both; i++) work1[i] = ZEROF; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); for (int i = 0; i < n; i++) { fft1->compute(work1,work1,FFT3d::FFT3d::FORWARD); @@ -2496,7 +2496,7 @@ int PPPMDipole::timing_3d(int n, double &time3d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time3d = time2 - time1; return 12; diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index a523fcce9e..85aceb8500 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -1471,7 +1471,7 @@ int PPPMDisp::qr_alg(double **A, double **Q, int n) // start loop for the matrix factorization int count = 0; int countmax = 100000; - while (1) { + while (true) { // make a Wilkinson shift an1 = A[n-2][n-2]; an = A[n-1][n-1]; @@ -2645,7 +2645,7 @@ void PPPMDisp::set_grid() if (!gridflag) { h = h_x = h_y = h_z = 4.0/g_ewald; int count = 0; - while (1) { + while (true) { // set grid dimension @@ -3663,7 +3663,7 @@ void PPPMDisp::set_n_pppm_6() // decrease grid spacing until required precision is obtained int count = 0; - while (1) { + while (true) { // set grid dimension nx_pppm_6 = static_cast (xprd/h_x); @@ -8183,7 +8183,7 @@ int PPPMDisp::timing_1d(int n, double &time1d) for (int i = 0; i < 2*nfft_both_6; i++) work1_6[i] = ZEROF; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); if (function[0]) { for (int i = 0; i < n; i++) { @@ -8197,11 +8197,11 @@ int PPPMDisp::timing_1d(int n, double &time1d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time1d = time2 - time1; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); if (function[1] + function[2] + function[3]) { for (int i = 0; i < n; i++) { @@ -8215,7 +8215,7 @@ int PPPMDisp::timing_1d(int n, double &time1d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time1d += (time2 - time1)*mixing; if (differentiation_flag) return 2; @@ -8238,7 +8238,7 @@ int PPPMDisp::timing_3d(int n, double &time3d) for (int i = 0; i < 2*nfft_both_6; i++) work1_6[i] = ZEROF; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); if (function[0]) { for (int i = 0; i < n; i++) { @@ -8252,11 +8252,11 @@ int PPPMDisp::timing_3d(int n, double &time3d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time3d = time2 - time1; MPI_Barrier(world); - time1 = MPI_Wtime(); + time1 = platform::walltime(); if (function[1] + function[2] + function[3]) { for (int i = 0; i < n; i++) { @@ -8270,7 +8270,7 @@ int PPPMDisp::timing_3d(int n, double &time3d) } MPI_Barrier(world); - time2 = MPI_Wtime(); + time2 = platform::walltime(); time3d += (time2 - time1) * mixing; if (differentiation_flag) return 2; diff --git a/src/LATBOLTZ/fix_lb_fluid.cpp b/src/LATBOLTZ/fix_lb_fluid.cpp index 0295c04f47..2dfe603ca1 100644 --- a/src/LATBOLTZ/fix_lb_fluid.cpp +++ b/src/LATBOLTZ/fix_lb_fluid.cpp @@ -570,7 +570,7 @@ int FixLbFluid::setmask() return mask; } -void FixLbFluid::init(void) +void FixLbFluid::init() { int i,j; @@ -787,7 +787,7 @@ int FixLbFluid::unpack_exchange(int nlocal, double *buf) //========================================================================== // calculate the force from the local atoms acting on the fluid. //========================================================================== -void FixLbFluid::calc_fluidforce(void) +void FixLbFluid::calc_fluidforce() { int *mask = atom->mask; int nlocal = atom->nlocal; @@ -1255,7 +1255,7 @@ require more frequent neighborlist rebuilds"); // read in a fluid restart file. This is only used to restart the // fluid portion of a LAMMPS simulation. //========================================================================== -void FixLbFluid::read_restartfile(void) +void FixLbFluid::read_restartfile() { MPI_Status status; MPI_Datatype realtype; @@ -1295,7 +1295,7 @@ void FixLbFluid::read_restartfile(void) //========================================================================== // write a fluid restart file. //========================================================================== -void FixLbFluid::write_restartfile(void) +void FixLbFluid::write_restartfile() { MPI_File fh; @@ -1343,7 +1343,7 @@ void FixLbFluid::write_restartfile(void) // This assumes that all the simulation parameters have been given in // terms of distance, time and mass units. //========================================================================== -void FixLbFluid::rescale(void) +void FixLbFluid::rescale() { vwtp = vwtp*dt_lb/dx_lb; vwbt = vwbt*dt_lb/dx_lb; @@ -1419,7 +1419,7 @@ satisfy the Courant condition.\n"); // Set the lattice-Boltzmann velocity vectors and weights for the D3Q15 // model. Initialize the fluid velocity and density. //========================================================================== -void FixLbFluid::initializeLB15(void) +void FixLbFluid::initializeLB15() { int i,j,k,m; @@ -1586,7 +1586,7 @@ void FixLbFluid::initializeLB15(void) // Set the lattice-Boltzmann velocity vectors and weights for the D3Q19 // model. Initialize the fluid velocity and density. //========================================================================== -void FixLbFluid::initializeLB19(void) +void FixLbFluid::initializeLB19() { int i,j,k,m; @@ -1823,7 +1823,7 @@ void FixLbFluid::initializeLB19(void) // Initialize the equilibrium distribution functions // (this just uses the initial fluid parameters, and assumes no forces). //========================================================================== -void FixLbFluid::initialize_feq(void) +void FixLbFluid::initialize_feq() { int i,j,k,p; MPI_Request requests[8]; @@ -2311,7 +2311,7 @@ void FixLbFluid::equilibriumdist19(int xstart, int xend, int ystart, int yend, i // Calculate the fluid density and velocity over the entire simulation // domain. //========================================================================== -void FixLbFluid::parametercalc_full(void) +void FixLbFluid::parametercalc_full() { MPI_Request requests[4]; MPI_Request requests2[12]; @@ -2529,7 +2529,7 @@ void FixLbFluid::update_periodic(int xstart, int xend, int ystart, int yend, int //========================================================================== // Print the fluid properties to the screen. //========================================================================== -void FixLbFluid::streamout(void) +void FixLbFluid::streamout() { int i,j,k; int istart,jstart,kstart; @@ -2651,7 +2651,7 @@ void FixLbFluid::streamout(void) // Update the distribution functions over the entire simulation domain for // the D3Q15 model. //========================================================================== -void FixLbFluid::update_full15(void) +void FixLbFluid::update_full15() { MPI_Request req_send15,req_recv15; @@ -3008,7 +3008,7 @@ void FixLbFluid::update_full15(void) // Update the distribution functions over the entire simulation domain for // the D3Q19 model. //========================================================================== -void FixLbFluid::update_full19(void) +void FixLbFluid::update_full19() { MPI_Request req_send15,req_recv15; diff --git a/src/LATBOLTZ/fix_lb_fluid.h b/src/LATBOLTZ/fix_lb_fluid.h index 0842acbe64..98d3e2c792 100644 --- a/src/LATBOLTZ/fix_lb_fluid.h +++ b/src/LATBOLTZ/fix_lb_fluid.h @@ -139,26 +139,26 @@ class FixLbFluid : public Fix { int printfluid; int fixviscouslb; - void rescale(void); - void (FixLbFluid::*initializeLB)(void); - void initializeLB15(void); - void initializeLB19(void); - void initialize_feq(void); + void rescale(); + void (FixLbFluid::*initializeLB)(); + void initializeLB15(); + void initializeLB19(); + void initialize_feq(); void (FixLbFluid::*equilibriumdist)(int, int, int, int, int, int); void equilibriumdist15(int, int, int, int, int, int); void equilibriumdist19(int, int, int, int, int, int); void parametercalc_part(int, int, int, int, int, int); - void parametercalc_full(void); + void parametercalc_full(); void update_periodic(int, int, int, int, int, int); - void (FixLbFluid::*update_full)(void); - void update_full15(void); - void update_full19(void); - void streamout(void); - void read_restartfile(void); - void write_restartfile(void); + void (FixLbFluid::*update_full)(); + void update_full15(); + void update_full19(); + void streamout(); + void read_restartfile(); + void write_restartfile(); void peskin_interpolation(int); void trilinear_interpolation(int); - void calc_fluidforce(void); + void calc_fluidforce(); }; } // namespace LAMMPS_NS #endif diff --git a/src/LATBOLTZ/fix_lb_pc.cpp b/src/LATBOLTZ/fix_lb_pc.cpp index bae0987b21..352803b670 100644 --- a/src/LATBOLTZ/fix_lb_pc.cpp +++ b/src/LATBOLTZ/fix_lb_pc.cpp @@ -338,7 +338,7 @@ int FixLbPC::unpack_exchange(int nlocal, double *buf) } /* ---------------------------------------------------------------------- */ - void FixLbPC::compute_up(void) + void FixLbPC::compute_up() { int *mask = atom->mask; int nlocal = atom->nlocal; diff --git a/src/LATBOLTZ/fix_lb_pc.h b/src/LATBOLTZ/fix_lb_pc.h index e2e47d915f..d218f22ebd 100644 --- a/src/LATBOLTZ/fix_lb_pc.h +++ b/src/LATBOLTZ/fix_lb_pc.h @@ -50,7 +50,7 @@ class FixLbPC : public Fix { double **up; double **up_old; - void compute_up(void); + void compute_up(); class FixLbFluid *fix_lb_fluid; }; diff --git a/src/LATBOLTZ/fix_lb_rigid_pc_sphere.cpp b/src/LATBOLTZ/fix_lb_rigid_pc_sphere.cpp index 304d5bbf0f..d9dfc7b264 100644 --- a/src/LATBOLTZ/fix_lb_rigid_pc_sphere.cpp +++ b/src/LATBOLTZ/fix_lb_rigid_pc_sphere.cpp @@ -1536,7 +1536,7 @@ double FixLbRigidPCSphere::compute_array(int i, int j) } /* ---------------------------------------------------------------------- */ - void FixLbRigidPCSphere::compute_up(void) + void FixLbRigidPCSphere::compute_up() { int *mask = atom->mask; int nlocal = atom->nlocal; diff --git a/src/LATBOLTZ/fix_lb_viscous.cpp b/src/LATBOLTZ/fix_lb_viscous.cpp index 95e36a98a9..0873a0fc94 100644 --- a/src/LATBOLTZ/fix_lb_viscous.cpp +++ b/src/LATBOLTZ/fix_lb_viscous.cpp @@ -55,13 +55,6 @@ FixLbViscous::FixLbViscous(LAMMPS *lmp, int narg, char **arg) : } -} - -/* ---------------------------------------------------------------------- */ - -FixLbViscous::~FixLbViscous() -{ - } /* ---------------------------------------------------------------------- */ diff --git a/src/LATBOLTZ/fix_lb_viscous.h b/src/LATBOLTZ/fix_lb_viscous.h index 1d08a15463..8c86e47553 100644 --- a/src/LATBOLTZ/fix_lb_viscous.h +++ b/src/LATBOLTZ/fix_lb_viscous.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class FixLbViscous : public Fix { public: FixLbViscous(class LAMMPS *, int, char **); - ~FixLbViscous(); + virtual ~FixLbViscous() = default; int setmask(); void init(); void setup(int); diff --git a/src/MACHDYN/fix_smd_move_triangulated_surface.cpp b/src/MACHDYN/fix_smd_move_triangulated_surface.cpp index c790720e99..6fc8a1dadc 100644 --- a/src/MACHDYN/fix_smd_move_triangulated_surface.cpp +++ b/src/MACHDYN/fix_smd_move_triangulated_surface.cpp @@ -215,15 +215,6 @@ FixSMDMoveTriSurf::FixSMDMoveTriSurf(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixSMDMoveTriSurf::~FixSMDMoveTriSurf() -{ - // unregister callbacks to this fix from Atom class - //atom->delete_callback(id,Atom::GROW); - //atom->delete_callback(id,Atom::RESTART); -} - -/* ---------------------------------------------------------------------- */ - int FixSMDMoveTriSurf::setmask() { int mask = 0; mask |= INITIAL_INTEGRATE; diff --git a/src/MACHDYN/fix_smd_move_triangulated_surface.h b/src/MACHDYN/fix_smd_move_triangulated_surface.h index aec2fcb688..e64d2fc409 100644 --- a/src/MACHDYN/fix_smd_move_triangulated_surface.h +++ b/src/MACHDYN/fix_smd_move_triangulated_surface.h @@ -39,7 +39,7 @@ namespace LAMMPS_NS { class FixSMDMoveTriSurf : public Fix { public: FixSMDMoveTriSurf(class LAMMPS *, int, char **); - ~FixSMDMoveTriSurf(); + ~FixSMDMoveTriSurf() = default; int setmask(); virtual void init(); virtual void initial_integrate(int); diff --git a/src/MACHDYN/pair_smd_tlsph.h b/src/MACHDYN/pair_smd_tlsph.h index 86e2bbe52b..0950430ca0 100644 --- a/src/MACHDYN/pair_smd_tlsph.h +++ b/src/MACHDYN/pair_smd_tlsph.h @@ -49,8 +49,8 @@ class PairTlsph : public Pair { void write_restart_settings(FILE *) {} void read_restart_settings(FILE *) {} virtual double memory_usage(); - void compute_shape_matrix(void); - void material_model(void); + void compute_shape_matrix(); + void material_model(); void *extract(const char *, int &); int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); diff --git a/src/MAKE/MACHINES/Makefile.aarch64_arm_openmpi_armpl b/src/MAKE/MACHINES/Makefile.aarch64_arm_openmpi_armpl index ead00277c6..050670804e 100644 --- a/src/MAKE/MACHINES/Makefile.aarch64_arm_openmpi_armpl +++ b/src/MAKE/MACHINES/Makefile.aarch64_arm_openmpi_armpl @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.aarch64_arm_serial_armpl b/src/MAKE/MACHINES/Makefile.aarch64_arm_serial_armpl index 44c83ff1e0..2ad14ab258 100644 --- a/src/MAKE/MACHINES/Makefile.aarch64_arm_serial_armpl +++ b/src/MAKE/MACHINES/Makefile.aarch64_arm_serial_armpl @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.aarch64_g++_openmpi_armpl b/src/MAKE/MACHINES/Makefile.aarch64_g++_openmpi_armpl index 2ebd2ac744..efe91aed43 100644 --- a/src/MAKE/MACHINES/Makefile.aarch64_g++_openmpi_armpl +++ b/src/MAKE/MACHINES/Makefile.aarch64_g++_openmpi_armpl @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.aarch64_g++_serial_armpl b/src/MAKE/MACHINES/Makefile.aarch64_g++_serial_armpl index 054b530bc8..3c5a552b1b 100644 --- a/src/MAKE/MACHINES/Makefile.aarch64_g++_serial_armpl +++ b/src/MAKE/MACHINES/Makefile.aarch64_g++_serial_armpl @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.astra_arm b/src/MAKE/MACHINES/Makefile.astra_arm index f64f4da891..79461626e9 100644 --- a/src/MAKE/MACHINES/Makefile.astra_arm +++ b/src/MAKE/MACHINES/Makefile.astra_arm @@ -64,6 +64,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -73,7 +78,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.bgq b/src/MAKE/MACHINES/Makefile.bgq index f0401e0758..4baecb9fc3 100644 --- a/src/MAKE/MACHINES/Makefile.bgq +++ b/src/MAKE/MACHINES/Makefile.bgq @@ -15,7 +15,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.cori2 b/src/MAKE/MACHINES/Makefile.cori2 index ca902617fd..8421aedc78 100644 --- a/src/MAKE/MACHINES/Makefile.cori2 +++ b/src/MAKE/MACHINES/Makefile.cori2 @@ -75,6 +75,11 @@ JPG_INC = JPG_PATH = JPG_LIB = #-ljpeg +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -84,7 +89,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.cygwin b/src/MAKE/MACHINES/Makefile.cygwin index 3d4a50a8ea..153ae1e6c0 100644 --- a/src/MAKE/MACHINES/Makefile.cygwin +++ b/src/MAKE/MACHINES/Makefile.cygwin @@ -65,6 +65,10 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl but must be empty on Windows) + +override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +78,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.mac b/src/MAKE/MACHINES/Makefile.mac index fb749b5759..e2a78325a1 100644 --- a/src/MAKE/MACHINES/Makefile.mac +++ b/src/MAKE/MACHINES/Makefile.mac @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.mac_mpi b/src/MAKE/MACHINES/Makefile.mac_mpi index 4718c94e51..87f961e12e 100644 --- a/src/MAKE/MACHINES/Makefile.mac_mpi +++ b/src/MAKE/MACHINES/Makefile.mac_mpi @@ -66,6 +66,11 @@ JPG_INC = -I/opt/local/include JPG_PATH = -L/opt/local/lib JPG_LIB = -ljpeg +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.power b/src/MAKE/MACHINES/Makefile.power index 1671fd6273..9c8448abc3 100644 --- a/src/MAKE/MACHINES/Makefile.power +++ b/src/MAKE/MACHINES/Makefile.power @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.summit_kokkos b/src/MAKE/MACHINES/Makefile.summit_kokkos index 95ee7e39a8..87f8c75da2 100644 --- a/src/MAKE/MACHINES/Makefile.summit_kokkos +++ b/src/MAKE/MACHINES/Makefile.summit_kokkos @@ -72,6 +72,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -81,7 +86,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.theta b/src/MAKE/MACHINES/Makefile.theta index 62e125152d..8d04d25ac7 100644 --- a/src/MAKE/MACHINES/Makefile.theta +++ b/src/MAKE/MACHINES/Makefile.theta @@ -70,6 +70,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -79,7 +84,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.ubuntu b/src/MAKE/MACHINES/Makefile.ubuntu index f030ce64df..ed479d8969 100644 --- a/src/MAKE/MACHINES/Makefile.ubuntu +++ b/src/MAKE/MACHINES/Makefile.ubuntu @@ -69,6 +69,11 @@ JPG_INC = JPG_PATH = JPG_LIB = -ljpeg -lpng +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -78,7 +83,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.ubuntu_simple b/src/MAKE/MACHINES/Makefile.ubuntu_simple index e8b58fc804..3926777f03 100644 --- a/src/MAKE/MACHINES/Makefile.ubuntu_simple +++ b/src/MAKE/MACHINES/Makefile.ubuntu_simple @@ -68,6 +68,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -77,7 +82,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.white b/src/MAKE/MACHINES/Makefile.white index ff2103008c..cb101998b3 100644 --- a/src/MAKE/MACHINES/Makefile.white +++ b/src/MAKE/MACHINES/Makefile.white @@ -69,6 +69,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -78,7 +83,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/MACHINES/Makefile.xe6 b/src/MAKE/MACHINES/Makefile.xe6 index a6db78a053..9dbe0ba73e 100644 --- a/src/MAKE/MACHINES/Makefile.xe6 +++ b/src/MAKE/MACHINES/Makefile.xe6 @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/Makefile.mpi b/src/MAKE/Makefile.mpi index 42f48b4e2c..933da9663e 100644 --- a/src/MAKE/Makefile.mpi +++ b/src/MAKE/Makefile.mpi @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/Makefile.serial b/src/MAKE/Makefile.serial index b527919147..6dd8415ea9 100644 --- a/src/MAKE/Makefile.serial +++ b/src/MAKE/Makefile.serial @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.big b/src/MAKE/OPTIONS/Makefile.big index bdc093c6ae..d2cbf8a73e 100644 --- a/src/MAKE/OPTIONS/Makefile.big +++ b/src/MAKE/OPTIONS/Makefile.big @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.fftw b/src/MAKE/OPTIONS/Makefile.fftw index dd539fb5dc..65b568d3d2 100644 --- a/src/MAKE/OPTIONS/Makefile.fftw +++ b/src/MAKE/OPTIONS/Makefile.fftw @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.g++_mpich b/src/MAKE/OPTIONS/Makefile.g++_mpich index e0c77437f5..15257a9a45 100644 --- a/src/MAKE/OPTIONS/Makefile.g++_mpich +++ b/src/MAKE/OPTIONS/Makefile.g++_mpich @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.g++_mpich_link b/src/MAKE/OPTIONS/Makefile.g++_mpich_link index 4f2855a9cc..3498842be4 100644 --- a/src/MAKE/OPTIONS/Makefile.g++_mpich_link +++ b/src/MAKE/OPTIONS/Makefile.g++_mpich_link @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.g++_openmpi b/src/MAKE/OPTIONS/Makefile.g++_openmpi index 75c12f9b38..a619beefcc 100644 --- a/src/MAKE/OPTIONS/Makefile.g++_openmpi +++ b/src/MAKE/OPTIONS/Makefile.g++_openmpi @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.g++_openmpi_link b/src/MAKE/OPTIONS/Makefile.g++_openmpi_link index 0c9997dbb0..7d1743fec7 100644 --- a/src/MAKE/OPTIONS/Makefile.g++_openmpi_link +++ b/src/MAKE/OPTIONS/Makefile.g++_openmpi_link @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.g++_serial b/src/MAKE/OPTIONS/Makefile.g++_serial index d6b9bf3221..397a977ead 100644 --- a/src/MAKE/OPTIONS/Makefile.g++_serial +++ b/src/MAKE/OPTIONS/Makefile.g++_serial @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.gpu b/src/MAKE/OPTIONS/Makefile.gpu index 9ad5cf477c..2e183ef746 100644 --- a/src/MAKE/OPTIONS/Makefile.gpu +++ b/src/MAKE/OPTIONS/Makefile.gpu @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.hip b/src/MAKE/OPTIONS/Makefile.hip index 8be9e7260f..ed9f832a42 100644 --- a/src/MAKE/OPTIONS/Makefile.hip +++ b/src/MAKE/OPTIONS/Makefile.hip @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -80,7 +85,7 @@ endif EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.icc_mpich b/src/MAKE/OPTIONS/Makefile.icc_mpich index c630c42c26..30d7b3da81 100644 --- a/src/MAKE/OPTIONS/Makefile.icc_mpich +++ b/src/MAKE/OPTIONS/Makefile.icc_mpich @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.icc_mpich_link b/src/MAKE/OPTIONS/Makefile.icc_mpich_link index 8b89d2509a..232475f2e3 100644 --- a/src/MAKE/OPTIONS/Makefile.icc_mpich_link +++ b/src/MAKE/OPTIONS/Makefile.icc_mpich_link @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.icc_openmpi b/src/MAKE/OPTIONS/Makefile.icc_openmpi index 0a2c9598a6..5f3281c021 100644 --- a/src/MAKE/OPTIONS/Makefile.icc_openmpi +++ b/src/MAKE/OPTIONS/Makefile.icc_openmpi @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.icc_openmpi_link b/src/MAKE/OPTIONS/Makefile.icc_openmpi_link index 825d4cdff0..ab3909fd1e 100644 --- a/src/MAKE/OPTIONS/Makefile.icc_openmpi_link +++ b/src/MAKE/OPTIONS/Makefile.icc_openmpi_link @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.icc_serial b/src/MAKE/OPTIONS/Makefile.icc_serial index 2d2da54c68..5ec920c9ef 100644 --- a/src/MAKE/OPTIONS/Makefile.icc_serial +++ b/src/MAKE/OPTIONS/Makefile.icc_serial @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.intel_coprocessor b/src/MAKE/OPTIONS/Makefile.intel_coprocessor index 2b66c20f4a..99e8d22d82 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_coprocessor +++ b/src/MAKE/OPTIONS/Makefile.intel_coprocessor @@ -70,6 +70,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -79,7 +84,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi index 04ec1fdc64..0371078bd2 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi @@ -69,6 +69,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -78,7 +83,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich index dece0092f1..04a60f8f61 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich @@ -69,6 +69,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -78,7 +83,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi index 0053aef20a..9041dc797e 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi @@ -70,6 +70,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -79,7 +84,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.jpeg b/src/MAKE/OPTIONS/Makefile.jpeg index 268e7b94e8..c2b7ab6a49 100644 --- a/src/MAKE/OPTIONS/Makefile.jpeg +++ b/src/MAKE/OPTIONS/Makefile.jpeg @@ -65,6 +65,11 @@ JPG_INC = -I/usr/include JPG_PATH = -L/usr/lib JPG_LIB = -ljpeg +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.knl b/src/MAKE/OPTIONS/Makefile.knl index 091fd7558f..c6cf783331 100644 --- a/src/MAKE/OPTIONS/Makefile.knl +++ b/src/MAKE/OPTIONS/Makefile.knl @@ -68,6 +68,11 @@ JPG_INC = JPG_PATH = JPG_LIB = -ljpeg +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -77,7 +82,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi index c6071cf747..cb3ef0e442 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi +++ b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi @@ -70,6 +70,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -79,7 +84,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only b/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only index 0b2e42487f..6d5e8d779e 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only +++ b/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_omp b/src/MAKE/OPTIONS/Makefile.kokkos_omp index 3e8f7ba634..e505da8ae2 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_omp +++ b/src/MAKE/OPTIONS/Makefile.kokkos_omp @@ -66,6 +66,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -75,7 +80,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_phi b/src/MAKE/OPTIONS/Makefile.kokkos_phi index 0e2bec0a5a..b825ad691a 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_phi +++ b/src/MAKE/OPTIONS/Makefile.kokkos_phi @@ -67,6 +67,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -76,7 +81,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.mgptfast b/src/MAKE/OPTIONS/Makefile.mgptfast index da10701a9a..e7fd82a39c 100644 --- a/src/MAKE/OPTIONS/Makefile.mgptfast +++ b/src/MAKE/OPTIONS/Makefile.mgptfast @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.omp b/src/MAKE/OPTIONS/Makefile.omp index 573c2d826b..7a59d7f10d 100644 --- a/src/MAKE/OPTIONS/Makefile.omp +++ b/src/MAKE/OPTIONS/Makefile.omp @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.oneapi b/src/MAKE/OPTIONS/Makefile.oneapi index 2524773a76..d34f0900c6 100644 --- a/src/MAKE/OPTIONS/Makefile.oneapi +++ b/src/MAKE/OPTIONS/Makefile.oneapi @@ -68,6 +68,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -77,7 +82,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.opt b/src/MAKE/OPTIONS/Makefile.opt index 2cb5540fd4..acfd802c44 100644 --- a/src/MAKE/OPTIONS/Makefile.opt +++ b/src/MAKE/OPTIONS/Makefile.opt @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.pgi_mpich_link b/src/MAKE/OPTIONS/Makefile.pgi_mpich_link index daa8a79166..b09efd6fa0 100644 --- a/src/MAKE/OPTIONS/Makefile.pgi_mpich_link +++ b/src/MAKE/OPTIONS/Makefile.pgi_mpich_link @@ -65,6 +65,11 @@ JPG_INC = JPG_PATH = JPG_LIB = +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MAKE/OPTIONS/Makefile.png b/src/MAKE/OPTIONS/Makefile.png index 40ebe43d32..8eff543af6 100644 --- a/src/MAKE/OPTIONS/Makefile.png +++ b/src/MAKE/OPTIONS/Makefile.png @@ -65,6 +65,11 @@ JPG_INC = -I/usr/include JPG_PATH = -L/usr/lib JPG_LIB = -lpng +# library for loading shared objects (defaults to -ldl, should be empty on Windows) +# uncomment to change the default + +# override DYN_LIB = + # --------------------------------------------------------------------- # build rules and dependencies # do not edit this section @@ -74,7 +79,7 @@ include Makefile.package EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) $(DYN_LIB) EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) diff --git a/src/MANIFOLD/fix_nve_manifold_rattle.cpp b/src/MANIFOLD/fix_nve_manifold_rattle.cpp index b4644a1350..e3c0024d57 100644 --- a/src/MANIFOLD/fix_nve_manifold_rattle.cpp +++ b/src/MANIFOLD/fix_nve_manifold_rattle.cpp @@ -140,10 +140,8 @@ FixNVEManifoldRattle::FixNVEManifoldRattle( LAMMPS *lmp, int &narg, char **arg, if (strcmp(arg[argi], "every") == 0) { nevery = utils::inumeric(FLERR,arg[argi+1],false,lmp); next_output = update->ntimestep + nevery; - if (comm->me == 0) { - fprintf(screen,"Outputting every %d steps, next is %d\n", - nevery, next_output); - } + if (comm->me == 0) + utils::logmesg(lmp,"Outputting every {} steps, next is {}\n",nevery, next_output); argi += 2; } else if (error_on_unknown_keyword) { error->all(FLERR,"Error parsing arg \"{}\".\n",arg[argi]); @@ -211,11 +209,9 @@ void FixNVEManifoldRattle::print_stats( const char *header ) double inv_tdiff = 1.0/( static_cast(ntimestep) - stats.last_out ); stats.last_out = ntimestep; - fprintf(screen, "%s stats for time step " BIGINT_FORMAT " on %d atoms:\n", - header, ntimestep, stats.natoms); - fprintf(screen, " iters/atom: x = %f, v = %f, dofs removed %d", - x_iters * inv_tdiff, v_iters * inv_tdiff, stats.dofs_removed); - fprintf(screen,"\n"); + utils::logmesg(lmp, "{} stats for time step {} on {} atoms:\n", header, ntimestep, stats.natoms); + utils::logmesg(lmp, " iters/atom: x = {}, v = {}, dofs removed = {}\n", + x_iters * inv_tdiff, v_iters * inv_tdiff, stats.dofs_removed); } stats.x_iters_per_atom = 0; @@ -498,7 +494,7 @@ void FixNVEManifoldRattle::rattle_manifold_x(double *x, double *v, const double c_inv = 1.0 / c; - while (1) { + while (true) { v[0] = vt[0] - l*no_dt[0]; v[1] = vt[1] - l*no_dt[1]; v[2] = vt[2] - l*no_dt[2]; diff --git a/src/MANIFOLD/fix_nvt_manifold_rattle.cpp b/src/MANIFOLD/fix_nvt_manifold_rattle.cpp index f675cdff73..0dcc233b54 100644 --- a/src/MANIFOLD/fix_nvt_manifold_rattle.cpp +++ b/src/MANIFOLD/fix_nvt_manifold_rattle.cpp @@ -32,21 +32,21 @@ ------------------------------------------------------------------------- */ - #include "fix_nvt_manifold_rattle.h" -#include -#include + #include "atom.h" -#include "force.h" -#include "update.h" -#include "error.h" -#include "group.h" #include "citeme.h" -#include "modify.h" #include "compute.h" +#include "error.h" +#include "force.h" +#include "group.h" +#include "modify.h" +#include "update.h" #include "manifold.h" +#include +#include using namespace LAMMPS_NS; using namespace FixConst; @@ -115,9 +115,7 @@ FixNVTManifoldRattle::FixNVTManifoldRattle(LAMMPS *lmp, int narg, char **arg, mtchain = utils::inumeric(FLERR, arg[argi+1],false,lmp); argi += 2; } else if (error_on_unknown_keyword) { - char msg[2048]; - sprintf(msg,"Error parsing arg \"%s\".\n", arg[argi]); - error->all(FLERR, msg); + error->all(FLERR, "Error parsing arg \"{}\".\n", arg[argi]); } else { argi += 1; } @@ -271,12 +269,8 @@ void FixNVTManifoldRattle::nhc_temp_integrate() factor_eta = exp(-dthalf*eta_dot[0]); - if (factor_eta == 0) { - char msg[2048]; - sprintf(msg, "WTF, factor_eta is 0! dthalf = %f, eta_dot[0] = %f", - dthalf, eta_dot[0]); - error->all(FLERR,msg); - } + if (factor_eta == 0) + error->all(FLERR, "factor_eta is 0! dthalf = {}, eta_dot[0] = {}", dthalf, eta_dot[0]); nh_v_temp(); diff --git a/src/MANIFOLD/manifold_gaussian_bump.cpp b/src/MANIFOLD/manifold_gaussian_bump.cpp index 5eb2b08504..1483ff7489 100644 --- a/src/MANIFOLD/manifold_gaussian_bump.cpp +++ b/src/MANIFOLD/manifold_gaussian_bump.cpp @@ -67,9 +67,7 @@ public: double get_t_from_x( double xx ) const { if (xx < x0 || xx > x1) { - char msg[2048]; - sprintf(msg, "x ( %g ) out of bounds [%g, %g]", xx, x0, x1 ); - err->one(FLERR, msg); + err->one(FLERR,"x ( {} ) out of bounds [{}, {}]", xx, x0, x1 ); } // Newton iterate to get right t. @@ -271,8 +269,6 @@ void manifold_gaussian_bump::post_param_init() make_lut(); - - // test_lut(); } @@ -360,31 +356,3 @@ void manifold_gaussian_bump::lut_get_z_and_zp( double rr, double &zz, zz = zleft * fmin + zright * frac; zzp = zpleft * fmin + zpright * frac; } - - -void manifold_gaussian_bump::test_lut() -{ - double x[3], nn[3]; - if (comm->me != 0) return; - - FILE *fp = fopen( "test_lut_gaussian.dat", "w" ); - double dx = 0.1; - for (double xx = 0; xx < 20; xx += dx) { - x[0] = xx; - x[1] = 0.0; - x[2] = 0.0; - double gg = g( x ); - n( x, nn ); - double taper_z; - if (xx <= rc1) { - taper_z = gaussian_bump(xx); - } else if (xx < rc2) { - taper_z = lut_get_z( xx ); - } else { - taper_z = 0.0; - } - fprintf( fp, "%g %g %g %g %g %g %g\n", xx, gaussian_bump(xx), taper_z, - gg, nn[0], nn[1], nn[2] ); - } - fclose(fp); -} diff --git a/src/MANIFOLD/manifold_gaussian_bump.h b/src/MANIFOLD/manifold_gaussian_bump.h index 8c72db080f..4671b189df 100644 --- a/src/MANIFOLD/manifold_gaussian_bump.h +++ b/src/MANIFOLD/manifold_gaussian_bump.h @@ -86,8 +86,6 @@ namespace user_manifold { double lut_get_zp(double rr) const; void lut_get_z_and_zp(double rr, double &zz, double &zzp) const; - void test_lut(); - double taper(double); double taper_der(double); }; diff --git a/src/MANIFOLD/manifold_thylakoid.cpp b/src/MANIFOLD/manifold_thylakoid.cpp index b7004cac3a..ca50bfc881 100644 --- a/src/MANIFOLD/manifold_thylakoid.cpp +++ b/src/MANIFOLD/manifold_thylakoid.cpp @@ -34,17 +34,13 @@ manifold_thylakoid::manifold_thylakoid( LAMMPS *lmp, int /*narg*/, char ** /*arg // fix should call post_param_init(); } - - manifold_thylakoid::~manifold_thylakoid() { - for (std::size_t i = 0; i < parts.size(); ++i) { - delete parts[i]; + for (auto & part : parts) { + delete part; } } - - void manifold_thylakoid::post_param_init() { // Set coefficients: @@ -59,52 +55,21 @@ void manifold_thylakoid::post_param_init() LB = params[1]; lB = params[2]; - if (comm->me == 0) { - fprintf(screen,"My params are now: lT = %f, LT = %f, pad = %f, " - "wB = %f, LB = %f, lB = %f\n", lT, LT, pad, wB, LB, lB ); - fprintf(screen,"Calling init_domains() from post_param_init().\n"); - } init_domains(); - checkup(); } -void manifold_thylakoid::checkup() -{ - if (comm->me == 0) { - fprintf(screen,"This is checkup of thylakoid %p\n", this); - fprintf(screen,"I have %ld parts. They are:\n", parts.size()); - for (int i = 0; i < (int)parts.size(); ++i) { - fprintf(screen, "[%f, %f] x [%f, %f] x [%f, %f]\n", - parts[i]->xlo, parts[i]->xhi, - parts[i]->ylo, parts[i]->yhi, - parts[i]->zlo, parts[i]->zhi ); - } - fprintf(screen,"My params are:\n"); - for (int i = 0; i < NPARAMS; ++i) { - fprintf(screen,"%f\n", params[i]); - } - } -} - - double manifold_thylakoid::g( const double *x ) { int err = 0; std::size_t idx; thyla_part *p = get_thyla_part(x,&err,&idx); - if (err) { - char msg[2048]; - sprintf(msg,"Error getting thyla_part for x = (%f, %f, %f)",x[0],x[1],x[2]); - error->one(FLERR,msg); - } + if (err) error->one(FLERR,"Error getting thyla_part for x = ({}, {}, {})",x[0],x[1],x[2]); + double con_val = p->g(x); if (std::isfinite(con_val)) { return con_val; } else { - char msg[2048]; - sprintf(msg,"Error, thyla_part of type %d returned %f as constraint val!", - p->type, con_val); - error->one(FLERR,msg); + error->one(FLERR,"Error, thyla_part of type {} returned {} as constraint val!", p->type, con_val); return 0; } } @@ -114,20 +79,14 @@ void manifold_thylakoid::n( const double *x, double *n ) int err = 0; std::size_t idx; thyla_part *p = get_thyla_part(x,&err,&idx); - if (err) { - char msg[2048]; - sprintf(msg,"Error getting thyla_part for x = (%f, %f, %f)",x[0],x[1],x[2]); - error->one(FLERR,msg); - } + if (err) + error->one(FLERR,"Error getting thyla_part for x = ({}, {}, {})",x[0],x[1],x[2]); p->n(x,n); if (std::isfinite(n[0]) && std::isfinite(n[1]) && std::isfinite(n[2])) { return; - } else { - char msg[2048]; - sprintf(msg,"Error, thyla_part of type %d returned (%f,%f,%f) as gradient!", - p->type, n[0], n[1], n[2]); - error->one(FLERR,msg); - } + } else + error->one(FLERR,"thyla_part of type {} returned ({},{},{}) as gradient!", + p->type, n[0], n[1], n[2]); } thyla_part *manifold_thylakoid::get_thyla_part( const double *x, int * /*err_flag*/, std::size_t *idx ) @@ -140,9 +99,7 @@ thyla_part *manifold_thylakoid::get_thyla_part( const double *x, int * /*err_fla return p; } } - char msg[2048]; - sprintf(msg,"Could not find thyla_part for x = (%f,%f,%f)", x[0],x[1],x[2]); - error->one(FLERR,msg); + error->one(FLERR,"Could not find thyla_part for x = ({},{},{})", x[0],x[1],x[2]); return nullptr; } @@ -153,12 +110,9 @@ thyla_part *manifold_thylakoid::get_thyla_part( const double *x, int * /*err_fla void manifold_thylakoid::init_domains() { - if (wB + 2*lB > LT) { - char msg[2048]; - sprintf(msg,"LT = %f not large enough to accommodate bridge with " - "wB = %f and lB = %f! %f > %f\n", LT, wB, lB, wB + 2*lB, LT); - error->one(FLERR,msg); - } + if (wB + 2*lB > LT) + error->one(FLERR,"LT = {} not large enough to accommodate bridge with " + "wB = {} and lB = {}! {} > {}\n", LT, wB, lB, wB + 2*lB, LT); // Determine some constant coordinates: x0 = -( 0.5*LB + lB + lT + LT + lT + pad); @@ -375,12 +329,9 @@ void manifold_thylakoid::init_domains() parts.push_back(p); // Check if this plane lines up with bl: - if (fabs(plr.pt[0] - bl.pt[0] + lB) > 1e-8) { - char msg[2048]; - sprintf(msg,"Origins of plane left right and bridge left misaligned! %f != %f!\n", - plr.pt[0], bl.pt[0] - lB ); - error->one(FLERR,msg); - } + if (fabs(plr.pt[0] - bl.pt[0] + lB) > 1e-8) + error->one(FLERR,"Origins of plane left right and bridge left misaligned! {} != {}!\n", + plr.pt[0], bl.pt[0] - lB ); // Now, for the right stack, you can mirror the other... // To mirror them you need to invert lo[0] and hi[0] and flip their sign. @@ -428,12 +379,9 @@ void manifold_thylakoid::init_domains() set_domain(p, prr.lo, prr.hi); parts.push_back(p); - if (fabs(prr.pt[0] - br.pt[0] - lB) > 1e-8) { - char msg[2048]; - sprintf(msg,"Origins of plane left right and bridge left misaligned! %f != %f!\n", - prr.pt[0], br.pt[0] + lB); - error->one(FLERR,msg); - } + if (fabs(prr.pt[0] - br.pt[0] - lB) > 1e-8) + error->one(FLERR,"Origins of plane left right and bridge left misaligned! {} != {}!\n", + prr.pt[0], br.pt[0] + lB); } diff --git a/src/MANIFOLD/manifold_thylakoid.h b/src/MANIFOLD/manifold_thylakoid.h index 5470d722f9..0236c3bf54 100644 --- a/src/MANIFOLD/manifold_thylakoid.h +++ b/src/MANIFOLD/manifold_thylakoid.h @@ -37,7 +37,6 @@ namespace user_manifold { virtual int nparams() { return NPARAMS; } virtual void post_param_init(); - virtual void checkup(); // Some diagnostics... private: void init_domains(); diff --git a/src/MANIFOLD/manifold_thylakoid_shared.cpp b/src/MANIFOLD/manifold_thylakoid_shared.cpp index b71cf23e5e..5efc20a298 100644 --- a/src/MANIFOLD/manifold_thylakoid_shared.cpp +++ b/src/MANIFOLD/manifold_thylakoid_shared.cpp @@ -90,11 +90,6 @@ thyla_part::thyla_part( int type, double *args, double xlo, double ylo, double z z0 = (type == THYLA_TYPE_SPHERE) ? params[3] : params[5]; } - - -thyla_part::~thyla_part() -{} - double thyla_part::g(const double *x) { switch(type) { diff --git a/src/MANIFOLD/manifold_thylakoid_shared.h b/src/MANIFOLD/manifold_thylakoid_shared.h index a90d5e8801..67909802b0 100644 --- a/src/MANIFOLD/manifold_thylakoid_shared.h +++ b/src/MANIFOLD/manifold_thylakoid_shared.h @@ -33,7 +33,7 @@ namespace user_manifold { thyla_part(int type, double *args, double xlo, double ylo, double zlo, double xhi, double yhi, double zhi); thyla_part() : type(-1), x0(-1337), y0(-1337), z0(-1337) {} - ~thyla_part(); + ~thyla_part() = default; double g(const double *x); void n(const double *x, double *n); diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index a02a5718ff..29d2121f1f 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -3485,8 +3485,8 @@ void PairAIREBO::read_file(char *filename) // global parameters current_section = "global parameters"; - for (int i = 0; i < (int)params.size(); i++) { - *params[i] = reader.next_double(); + for (auto & param : params) { + *param = reader.next_double(); } diff --git a/src/MANYBODY/pair_atm.cpp b/src/MANYBODY/pair_atm.cpp index 81adef5871..f7eda909e6 100644 --- a/src/MANYBODY/pair_atm.cpp +++ b/src/MANYBODY/pair_atm.cpp @@ -128,9 +128,9 @@ void PairATM::compute(int eflag, int vflag) rij[0] = x[j][0] - xi; if (rij[0] < 0.0) continue; rij[1] = x[j][1] - yi; - if (rij[0] == 0.0 and rij[1] < 0.0) continue; + if (rij[0] == 0.0 && rij[1] < 0.0) continue; rij[2] = x[j][2] - zi; - if (rij[0] == 0.0 and rij[1] == 0.0 and rij[2] < 0.0) continue; + if (rij[0] == 0.0 && rij[1] == 0.0 && rij[2] < 0.0) continue; rij2 = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; if (rij2 > cutoff_squared) continue; @@ -141,9 +141,9 @@ void PairATM::compute(int eflag, int vflag) rik[0] = x[k][0] - xi; if (rik[0] < 0.0) continue; rik[1] = x[k][1] - yi; - if (rik[0] == 0.0 and rik[1] < 0.0) continue; + if (rik[0] == 0.0 && rik[1] < 0.0) continue; rik[2] = x[k][2] - zi; - if (rik[0] == 0.0 and rik[1] == 0.0 and rik[2] < 0.0) continue; + if (rik[0] == 0.0 && rik[1] == 0.0 && rik[2] < 0.0) continue; rik2 = rik[0]*rik[0] + rik[1]*rik[1] + rik[2]*rik[2]; if (rik2 > cutoff_squared) continue; diff --git a/src/MANYBODY/pair_edip.cpp b/src/MANYBODY/pair_edip.cpp index 0efa509cb3..af2314b8b9 100644 --- a/src/MANYBODY/pair_edip.cpp +++ b/src/MANYBODY/pair_edip.cpp @@ -463,7 +463,7 @@ void PairEDIP::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -void PairEDIP::allocateGrids(void) +void PairEDIP::allocateGrids() { int numGridPointsOneCutoffFunction; int numGridPointsNotOneCutoffFunction; @@ -789,7 +789,7 @@ void PairEDIP::read_file(char *file) char line[MAXLINE], *ptr; int eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line, MAXLINE, fp); if (ptr == nullptr) { diff --git a/src/MANYBODY/pair_edip.h b/src/MANYBODY/pair_edip.h index 8ee3a74dd8..5812768d55 100644 --- a/src/MANYBODY/pair_edip.h +++ b/src/MANYBODY/pair_edip.h @@ -90,11 +90,11 @@ class PairEDIP : public Pair { Param *params; // parameter set for an I-J-K interaction void allocate(); - void allocatePreLoops(void); - void deallocatePreLoops(void); - void allocateGrids(void); - void deallocateGrids(void); - void initGrids(void); + void allocatePreLoops(); + void deallocatePreLoops(); + void allocateGrids(); + void deallocateGrids(); + void initGrids(); void read_file(char *); void setup_params(); diff --git a/src/MANYBODY/pair_edip_multi.cpp b/src/MANYBODY/pair_edip_multi.cpp index 47cc5a90fa..8017fa4f8e 100644 --- a/src/MANYBODY/pair_edip_multi.cpp +++ b/src/MANYBODY/pair_edip_multi.cpp @@ -486,7 +486,7 @@ void PairEDIPMulti::edip_fcut3(double r, Param *param, double &f, double &fdr) pre-calculated structures ------------------------------------------------------------------------- */ -void PairEDIPMulti::allocatePreLoops(void) +void PairEDIPMulti::allocatePreLoops() { int nthreads = comm->nthreads; @@ -497,7 +497,7 @@ void PairEDIPMulti::allocatePreLoops(void) deallocate preLoops ------------------------------------------------------------------------- */ -void PairEDIPMulti::deallocatePreLoops(void) +void PairEDIPMulti::deallocatePreLoops() { memory->destroy(preForceCoord); } @@ -602,7 +602,7 @@ void PairEDIPMulti::read_file(char *file) char line[MAXLINE],*ptr; int eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); if (ptr == nullptr) { diff --git a/src/MANYBODY/pair_edip_multi.h b/src/MANYBODY/pair_edip_multi.h index 44921ebdba..3ee7347a56 100644 --- a/src/MANYBODY/pair_edip_multi.h +++ b/src/MANYBODY/pair_edip_multi.h @@ -57,8 +57,8 @@ class PairEDIPMulti : public Pair { Param *params; // parameter set for an I-J-K interaction void allocate(); - void allocatePreLoops(void); - void deallocatePreLoops(void); + void allocatePreLoops(); + void deallocatePreLoops(); void read_file(char *); void setup(); diff --git a/src/MANYBODY/pair_extep.cpp b/src/MANYBODY/pair_extep.cpp index bc96a40c57..68db444f31 100644 --- a/src/MANYBODY/pair_extep.cpp +++ b/src/MANYBODY/pair_extep.cpp @@ -540,7 +540,7 @@ void PairExTeP::read_file(char *file) char line[MAXLINE],*ptr; int eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); if (ptr == nullptr) { @@ -669,7 +669,7 @@ void PairExTeP::read_file(char *file) F_corr_data[iel][jel][in][jn][ivar]=0; // loop until EOF - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fp); //fputs(line,stdout); diff --git a/src/MANYBODY/pair_lcbop.cpp b/src/MANYBODY/pair_lcbop.cpp index 3c6f08a7e7..547fc75154 100644 --- a/src/MANYBODY/pair_lcbop.cpp +++ b/src/MANYBODY/pair_lcbop.cpp @@ -935,7 +935,7 @@ void PairLCBOP::read_file(char *filename) // skip initial comment lines - while (1) { + while (true) { utils::sfgets(FLERR,s,MAXLINE,fp,filename,error); if (s[0] != '#') break; } @@ -971,7 +971,7 @@ void PairLCBOP::read_file(char *filename) utils::sfgets(FLERR,s,MAXLINE,fp,filename,error); sscanf(s,"%lg",&eps); utils::sfgets(FLERR,s,MAXLINE,fp,filename,error); sscanf(s,"%lg",&delta); - while (1) { + while (true) { utils::sfgets(FLERR,s,MAXLINE,fp,filename,error); if (s[0] != '#') break; } @@ -988,7 +988,7 @@ void PairLCBOP::read_file(char *filename) &F_conj_data[i][2][k][l], &F_conj_data[i][3][k][l]); } - while (1) { utils::sfgets(FLERR,s,MAXLINE,fp,filename,error); if (s[0] != '#') break; } + while (true) { utils::sfgets(FLERR,s,MAXLINE,fp,filename,error); if (s[0] != '#') break; } } } diff --git a/src/MANYBODY/pair_polymorphic.cpp b/src/MANYBODY/pair_polymorphic.cpp index f12d369e0d..ce476e1204 100644 --- a/src/MANYBODY/pair_polymorphic.cpp +++ b/src/MANYBODY/pair_polymorphic.cpp @@ -593,7 +593,7 @@ void PairPolymorphic::read_file(char *file) if ((ng == 0) || (nr == 0) || (nx == 0)) error->one(FLERR,"Error reading potential file header"); - } catch (TokenizerException &e) { + } catch (TokenizerException &) { error->one(FLERR,"Potential file incompatible with this pair style version"); } diff --git a/src/MANYBODY/pair_tersoff_table.h b/src/MANYBODY/pair_tersoff_table.h index 662fd532b7..ab345d8af2 100644 --- a/src/MANYBODY/pair_tersoff_table.h +++ b/src/MANYBODY/pair_tersoff_table.h @@ -69,8 +69,8 @@ class PairTersoffTable : public Pair { double **preGtetaFunction, **preGtetaFunctionDerived; double *preCutoffFunction, *preCutoffFunctionDerived; - virtual void allocatePreLoops(void); - virtual void deallocatePreLoops(void); + virtual void allocatePreLoops(); + virtual void deallocatePreLoops(); // grids @@ -79,8 +79,8 @@ class PairTersoffTable : public Pair { double **gtetaFunction, **gtetaFunctionDerived; double **betaZetaPower, **betaZetaPowerDerived; - void allocateGrids(void); - void deallocateGrids(void); + void allocateGrids(); + void deallocateGrids(); }; } // namespace LAMMPS_NS diff --git a/src/MC/fix_atom_swap.cpp b/src/MC/fix_atom_swap.cpp index 76200dc614..b3420e423e 100644 --- a/src/MC/fix_atom_swap.cpp +++ b/src/MC/fix_atom_swap.cpp @@ -74,11 +74,13 @@ FixAtomSwap::FixAtomSwap(LAMMPS *lmp, int narg, char **arg) : ncycles = utils::inumeric(FLERR,arg[4],false,lmp); seed = utils::inumeric(FLERR,arg[5],false,lmp); double temperature = utils::numeric(FLERR,arg[6],false,lmp); - beta = 1.0/(force->boltz*temperature); if (nevery <= 0) error->all(FLERR,"Illegal fix atom/swap command"); if (ncycles < 0) error->all(FLERR,"Illegal fix atom/swap command"); if (seed <= 0) error->all(FLERR,"Illegal fix atom/swap command"); + if (temperature <= 0.0) error->all(FLERR,"Illegal fix atom/swap command"); + + beta = 1.0/(force->boltz*temperature); memory->create(type_list,atom->ntypes,"atom/swap:type_list"); memory->create(mu,atom->ntypes+1,"atom/swap:mu"); @@ -142,7 +144,7 @@ void FixAtomSwap::options(int narg, char **arg) if (narg < 0) error->all(FLERR,"Illegal fix atom/swap command"); regionflag = 0; - conserve_ke_flag = 1; + ke_flag = 1; semi_grand_flag = 0; nswaptypes = 0; nmutypes = 0; @@ -160,7 +162,7 @@ void FixAtomSwap::options(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"ke") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix atom/swap command"); - conserve_ke_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); + ke_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"semi-grand") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix atom/swap command"); @@ -301,6 +303,8 @@ void FixAtomSwap::pre_exchange() if (next_reneighbor != update->ntimestep) return; + // insure current system is ready to compute energy + if (domain->triclinic) domain->x2lamda(atom->nlocal); domain->pbc(); comm->exchange(); @@ -309,8 +313,13 @@ void FixAtomSwap::pre_exchange() if (modify->n_pre_neighbor) modify->pre_neighbor(); neighbor->build(1); + // energy_stored = energy of current state + // will be updated after accepted swaps + energy_stored = energy_full(); + // attempt Ncycle atom swaps + int nsuccess = 0; if (semi_grand_flag) { update_semi_grand_atoms_list(); @@ -320,23 +329,30 @@ void FixAtomSwap::pre_exchange() for (int i = 0; i < ncycles; i++) nsuccess += attempt_swap(); } + // udpate MC stats + nswap_attempts += ncycles; nswap_successes += nsuccess; - energy_full(); next_reneighbor = update->ntimestep + nevery; } /* ---------------------------------------------------------------------- -Note: atom charges are assumed equal and so are not updated + attempt a semd-grand swap of a single atom + compare before/after energy and accept/reject the swap + NOTE: atom charges are assumed equal and so are not updated ------------------------------------------------------------------------- */ int FixAtomSwap::attempt_semi_grand() { if (nswap == 0) return 0; + // pre-swap energy + double energy_before = energy_stored; + // pick a random atom and perform swap + int itype,jtype,jswaptype; int i = pick_semi_grand_atom(); if (i >= 0) { @@ -350,9 +366,12 @@ int FixAtomSwap::attempt_semi_grand() atom->type[i] = jtype; } + // if unequal_cutoffs, call comm->borders() and rebuild neighbor list + // else communicate ghost atoms + // call to comm->exchange() is a no-op but clears ghost atoms + if (unequal_cutoffs) { if (domain->triclinic) domain->x2lamda(atom->nlocal); - domain->pbc(); comm->exchange(); comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); @@ -362,6 +381,8 @@ int FixAtomSwap::attempt_semi_grand() comm->forward_comm_fix(this); } + // post-swap energy + if (force->kspace) force->kspace->qsum_qsq(); double energy_after = energy_full(); @@ -374,10 +395,12 @@ int FixAtomSwap::attempt_semi_grand() int success_all = 0; MPI_Allreduce(&success,&success_all,1,MPI_INT,MPI_MAX,world); + // swap accepted, return 1 + if (success_all) { update_semi_grand_atoms_list(); energy_stored = energy_after; - if (conserve_ke_flag) { + if (ke_flag) { if (i >= 0) { atom->v[i][0] *= sqrt_mass_ratio[itype][jtype]; atom->v[i][1] *= sqrt_mass_ratio[itype][jtype]; @@ -385,38 +408,35 @@ int FixAtomSwap::attempt_semi_grand() } } return 1; - } else { - if (i >= 0) { - atom->type[i] = itype; - } - if (force->kspace) force->kspace->qsum_qsq(); - energy_stored = energy_before; - - if (unequal_cutoffs) { - if (domain->triclinic) domain->x2lamda(atom->nlocal); - domain->pbc(); - comm->exchange(); - comm->borders(); - if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(1); - } else { - comm->forward_comm_fix(this); - } } + + // swap not accepted, return 0 + // restore the swapped atom + // do not need to re-call comm->borders() and rebuild neighbor list + // since will be done on next cycle or in Verlet when this fix finishes + + if (i >= 0) atom->type[i] = itype; + if (force->kspace) force->kspace->qsum_qsq(); + return 0; } - /* ---------------------------------------------------------------------- + attempt a swap of a pair of atoms + compare before/after energy and accept/reject the swap ------------------------------------------------------------------------- */ int FixAtomSwap::attempt_swap() { if ((niswap == 0) || (njswap == 0)) return 0; + // pre-swap energy + double energy_before = energy_stored; + // pick a random pair of atoms + // swap their properties + int i = pick_i_swap_atom(); int j = pick_j_swap_atom(); int itype = type_list[0]; @@ -431,6 +451,10 @@ int FixAtomSwap::attempt_swap() if (atom->q_flag) atom->q[j] = qtype[0]; } + // if unequal_cutoffs, call comm->borders() and rebuild neighbor list + // else communicate ghost atoms + // call to comm->exchange() is a no-op but clears ghost atoms + if (unequal_cutoffs) { if (domain->triclinic) domain->x2lamda(atom->nlocal); domain->pbc(); @@ -443,13 +467,17 @@ int FixAtomSwap::attempt_swap() comm->forward_comm_fix(this); } + // post-swap energy + double energy_after = energy_full(); + // swap accepted, return 1 + // if ke_flag, rescale atom velocities + if (random_equal->uniform() < exp(beta*(energy_before - energy_after))) { update_swap_atoms_list(); - energy_stored = energy_after; - if (conserve_ke_flag) { + if (ke_flag) { if (i >= 0) { atom->v[i][0] *= sqrt_mass_ratio[itype][jtype]; atom->v[i][1] *= sqrt_mass_ratio[itype][jtype]; @@ -461,30 +489,24 @@ int FixAtomSwap::attempt_swap() atom->v[j][2] *= sqrt_mass_ratio[jtype][itype]; } } + energy_stored = energy_after; return 1; - } else { - if (i >= 0) { - atom->type[i] = type_list[0]; - if (atom->q_flag) atom->q[i] = qtype[0]; - } - if (j >= 0) { - atom->type[j] = type_list[1]; - if (atom->q_flag) atom->q[j] = qtype[1]; - } - energy_stored = energy_before; - - if (unequal_cutoffs) { - if (domain->triclinic) domain->x2lamda(atom->nlocal); - domain->pbc(); - comm->exchange(); - comm->borders(); - if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(1); - } else { - comm->forward_comm_fix(this); - } } + + // swap not accepted, return 0 + // restore the swapped itype & jtype atoms + // do not need to re-call comm->borders() and rebuild neighbor list + // since will be done on next cycle or in Verlet when this fix finishes + + if (i >= 0) { + atom->type[i] = type_list[0]; + if (atom->q_flag) atom->q[i] = qtype[0]; + } + if (j >= 0) { + atom->type[j] = type_list[1]; + if (atom->q_flag) atom->q[j] = qtype[1]; + } + return 0; } @@ -497,7 +519,6 @@ double FixAtomSwap::energy_full() int eflag = 1; int vflag = 0; - if (modify->n_pre_neighbor) modify->pre_neighbor(); if (modify->n_pre_force) modify->pre_force(vflag); if (force->pair) force->pair->compute(eflag,vflag); diff --git a/src/MC/fix_atom_swap.h b/src/MC/fix_atom_swap.h index a77b5a944e..2511fe6544 100644 --- a/src/MC/fix_atom_swap.h +++ b/src/MC/fix_atom_swap.h @@ -17,8 +17,8 @@ FixStyle(atom/swap,FixAtomSwap); // clang-format on #else -#ifndef LMP_FIX_MCSWAP_H -#define LMP_FIX_MCSWAP_H +#ifndef LMP_FIX_ATOM_SWAP_H +#define LMP_FIX_ATOM_SWAP_H #include "fix.h" @@ -31,14 +31,6 @@ class FixAtomSwap : public Fix { int setmask(); void init(); void pre_exchange(); - int attempt_semi_grand(); - int attempt_swap(); - double energy_full(); - int pick_semi_grand_atom(); - int pick_i_swap_atom(); - int pick_j_swap_atom(); - void update_semi_grand_atoms_list(); - void update_swap_atoms_list(); int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); double compute_vector(int); @@ -48,7 +40,7 @@ class FixAtomSwap : public Fix { private: int nevery, seed; - int conserve_ke_flag; // yes = conserve ke, no = do not conserve ke + int ke_flag; // yes = conserve ke, no = do not conserve ke int semi_grand_flag; // yes = semi-grand canonical, no = constant composition int ncycles; int niswap, njswap; // # of i,j swap atoms on all procs @@ -85,6 +77,14 @@ class FixAtomSwap : public Fix { class Compute *c_pe; void options(int, char **); + int attempt_semi_grand(); + int attempt_swap(); + double energy_full(); + int pick_semi_grand_atom(); + int pick_i_swap_atom(); + int pick_j_swap_atom(); + void update_semi_grand_atoms_list(); + void update_swap_atoms_list(); }; } // namespace LAMMPS_NS diff --git a/src/MC/fix_mol_swap.cpp b/src/MC/fix_mol_swap.cpp new file mode 100644 index 0000000000..8d7c2bf367 --- /dev/null +++ b/src/MC/fix_mol_swap.cpp @@ -0,0 +1,501 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "fix_mol_swap.h" + +#include "angle.h" +#include "atom.h" +#include "bond.h" +#include "comm.h" +#include "compute.h" +#include "dihedral.h" +#include "domain.h" +#include "error.h" +#include "fix.h" +#include "force.h" +#include "improper.h" +#include "kspace.h" +#include "modify.h" +#include "neighbor.h" +#include "pair.h" +#include "random_park.h" +#include "update.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +#define BIG 1.0e20 + +/* ---------------------------------------------------------------------- */ + +FixMolSwap::FixMolSwap(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), random(nullptr), c_pe(nullptr) +{ + if (narg < 9) error->all(FLERR,"Illegal fix mol/swap command"); + + vector_flag = 1; + size_vector = 2; + global_freq = 1; + extvector = 0; + restart_global = 1; + time_depend = 1; + + // parse args + + nevery = utils::inumeric(FLERR,arg[3],false,lmp); + ncycles = utils::inumeric(FLERR,arg[4],false,lmp); + itype = utils::inumeric(FLERR,arg[5],false,lmp); + jtype = utils::inumeric(FLERR,arg[6],false,lmp); + seed = utils::inumeric(FLERR,arg[7],false,lmp); + double temperature = utils::numeric(FLERR,arg[8],false,lmp); + + // optional args + + ke_flag = 1; + + int iarg = 9; + while (iarg < narg) { + if (strcmp(arg[iarg],"ke") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix mol/swap command"); + ke_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; + } else error->all(FLERR,"Illegal fix mol/swap command"); + } + + // error check + + if (nevery <= 0) error->all(FLERR,"Illegal fix mol/swap command"); + if (ncycles < 0) error->all(FLERR,"Illegal fix mol/swap command"); + if (itype == jtype) error->all(FLERR,"Illegal fix mol/swap command"); + if (itype <= 0 || itype > atom->ntypes || + jtype <= 0 || jtype > atom->ntypes) + error->all(FLERR,"Fix mol/swap atom types are invalid"); + if (seed <= 0) error->all(FLERR,"Illegal fix mol/swap command"); + if (temperature <= 0.0) error->all(FLERR,"Illegal fix mol/swap command"); + if (ke_flag && atom->rmass) + error->all(FLERR,"Cannot conserve kinetic energy with fix mol/swap " + "unless per-type masses"); + + beta = 1.0/(force->boltz*temperature); + + // random number generator, same for all procs + + random = new RanPark(lmp,seed); + + // set up reneighboring + + force_reneighbor = 1; + next_reneighbor = update->ntimestep + 1; + + // zero out counters + + nswap_attempt = 0.0; + nswap_accept = 0.0; + + // qflag = 1 if charges are defined + + if (atom->q_flag) qflag = 1; + else qflag = 0; + + // set comm size needed by this Fix + + if (qflag) comm_forward = 2; + else comm_forward = 1; +} + +/* ---------------------------------------------------------------------- */ + +FixMolSwap::~FixMolSwap() +{ + delete random; +} + +/* ---------------------------------------------------------------------- */ + +int FixMolSwap::setmask() +{ + int mask = 0; + mask |= PRE_EXCHANGE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixMolSwap::init() +{ + // c_pe = compute used to calculate before/after potential energy + + char *id_pe = (char *) "thermo_pe"; + int ipe = modify->find_compute(id_pe); + c_pe = modify->compute[ipe]; + + // minmol = smallest molID with atoms of itype or jtype + // maxmol = largest molID with atoms of itype or jtype + // require: molID > 0, atoms in fix group + + int *mask = atom->mask; + int *type = atom->type; + tagint *molecule = atom->molecule; + int nlocal = atom->nlocal; + + tagint minmol_me = MAXTAGINT; + tagint maxmol_me = 0; + + for (int i = 0; i < nlocal; i++) { + if (molecule[i] == 0) continue; + if (!(mask[i] & groupbit)) continue; + + if (molecule[i] < minmol_me) { + if (type[i] == itype || type[i] == jtype) minmol_me = molecule[i]; + } + if (molecule[i] > maxmol_me) { + if (type[i] == itype || type[i] == jtype) maxmol_me = molecule[i]; + } + } + + MPI_Allreduce(&minmol_me,&minmol,1,MPI_LMP_TAGINT,MPI_MIN,world); + MPI_Allreduce(&maxmol_me,&maxmol,1,MPI_LMP_TAGINT,MPI_MAX,world); + + // if ke_flag, check if itype/jtype masses are different + // if yes, pre-calcuate velocity scale factors that keep KE constant + // if no, turn ke_flag off + + if (ke_flag) { + double *mass = atom->mass; + if (mass[itype] != mass[jtype]) { + i2j_vscale = sqrt(mass[itype]/mass[jtype]); + j2i_vscale = sqrt(mass[jtype]/mass[itype]); + } else ke_flag = 0; + } + + // if qflag, check if all charges for itype are identical, ditto for jtype + // if not, cannot swap charges, issue warning + + if (qflag) { + double *q = atom->q; + + double iqone,jqone; + iqone = jqone = -BIG; + + for (int i = 0; i < nlocal; i++) { + if (molecule[i] == 0) continue; + if (!(mask[i] & groupbit)) continue; + if (type[i] == itype) iqone = q[i]; + if (type[i] == jtype) jqone = q[i]; + } + + MPI_Allreduce(&iqone,&iq,1,MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&jqone,&jq,1,MPI_DOUBLE,MPI_MAX,world); + + int flag = 0; + + for (int i = 0; i < nlocal; i++) { + if (molecule[i] == 0) continue; + if (!(mask[i] & groupbit)) continue; + if (type[i] == itype && q[i] != iq) flag = 1; + if (type[i] == jtype && q[i] != jq) flag = 1; + } + + int flagall; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_MAX,world); + if (flagall) qflag = 0; + + if (!qflag && comm->me == 0) + error->warning(FLERR,"Cannot swap charges in fix mol/swap"); + } + + // check if all cutoffs involving itype and jtype are the same + // if not, reneighboring will be needed after swaps + + double **cutsq = force->pair->cutsq; + + unequal_cutoffs = false; + for (int ktype = 1; ktype <= atom->ntypes; ktype++) + if (cutsq[itype][ktype] != cutsq[jtype][ktype]) unequal_cutoffs = true; +} + +/* ---------------------------------------------------------------------- + perform ncycle Monte Carlo swaps +------------------------------------------------------------------------- */ + +void FixMolSwap::pre_exchange() +{ + // just return if should not be called on this timestep + + if (next_reneighbor != update->ntimestep) return; + + // insure current system is ready to compute energy + + if (domain->triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + comm->exchange(); + comm->borders(); + if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + if (modify->n_pre_neighbor) modify->pre_neighbor(); + neighbor->build(1); + + // energy_stored = energy of current state + // will be updated after accepted swaps + + energy_stored = energy_full(); + + // attempt Ncycle molecule swaps + + int naccept = 0; + for (int m = 0; m < ncycles; m++) naccept += attempt_swap(); + + // udpate MC stats + + nswap_attempt += ncycles; + nswap_accept += naccept; + + next_reneighbor = update->ntimestep + nevery; +} + +/* ---------------------------------------------------------------------- + attempt a swap of atom types within a random molecule + compare before/after energy and accept/reject the swap +------------------------------------------------------------------------- */ + +int FixMolSwap::attempt_swap() +{ + // pre-swap energy + + double energy_before = energy_stored; + + // pick a random molecule + // swap properties of all its eligible itype & jtype atoms + + tagint molID = + minmol + static_cast (random->uniform() * (maxmol-minmol+1)); + if (molID > maxmol) molID = maxmol; + + int *mask = atom->mask; + double **v = atom->v; + double *q = atom->q; + int *type = atom->type; + tagint *molecule = atom->molecule; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (molecule[i] != molID) continue; + if (!(mask[i] & groupbit)) continue; + if (type[i] == itype) { + type[i] = jtype; + if (qflag) q[i] = jq; + if (ke_flag) { + v[i][0] *= i2j_vscale; + v[i][1] *= i2j_vscale; + v[i][2] *= i2j_vscale; + } + } else if (type[i] == jtype) { + type[i] = itype; + if (qflag) q[i] = iq; + if (ke_flag) { + v[i][0] *= j2i_vscale; + v[i][1] *= j2i_vscale; + v[i][2] *= j2i_vscale; + } + } + } + + // if unequal_cutoffs, call comm->borders() and rebuild neighbor list + // else communicate ghost atoms + // call to comm->exchange() is a no-op but clears ghost atoms + + if (unequal_cutoffs) { + if (domain->triclinic) domain->x2lamda(atom->nlocal); + comm->exchange(); + comm->borders(); + if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + if (modify->n_pre_neighbor) modify->pre_neighbor(); + neighbor->build(1); + } else { + comm->forward_comm_fix(this); + } + + // post-swap energy + + double energy_after = energy_full(); + + // swap accepted, return 1 + + if (random->uniform() < exp(beta*(energy_before - energy_after))) { + energy_stored = energy_after; + return 1; + } + + // swap not accepted, return 0 + // restore the swapped itype & jtype atoms + // do not need to re-call comm->borders() and rebuild neighbor list + // since will be done on next cycle or in Verlet when this fix finishes + + for (int i = 0; i < nlocal; i++) { + if (molecule[i] != molID) continue; + if (!(mask[i] & groupbit)) continue; + if (type[i] == itype) { + type[i] = jtype; + if (qflag) q[i] = jq; + if (ke_flag) { + v[i][0] *= i2j_vscale; + v[i][1] *= i2j_vscale; + v[i][2] *= i2j_vscale; + } + } else if (type[i] == jtype) { + type[i] = itype; + if (qflag) q[i] = iq; + if (ke_flag) { + v[i][0] *= j2i_vscale; + v[i][1] *= j2i_vscale; + v[i][2] *= j2i_vscale; + } + } + } + + return 0; +} + +/* ---------------------------------------------------------------------- + compute system potential energy before or after a swap +------------------------------------------------------------------------- */ + +double FixMolSwap::energy_full() +{ + int eflag = 1; + int vflag = 0; + + if (modify->n_pre_force) modify->pre_force(vflag); + + if (force->pair) force->pair->compute(eflag,vflag); + + if (atom->molecular != Atom::ATOMIC) { + if (force->bond) force->bond->compute(eflag,vflag); + if (force->angle) force->angle->compute(eflag,vflag); + if (force->dihedral) force->dihedral->compute(eflag,vflag); + if (force->improper) force->improper->compute(eflag,vflag); + } + + if (force->kspace) force->kspace->compute(eflag,vflag); + + if (modify->n_post_force) modify->post_force(vflag); + + update->eflag_global = update->ntimestep; + double total_energy = c_pe->compute_scalar(); + + return total_energy; +} + +/* ---------------------------------------------------------------------- */ + +int FixMolSwap::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) +{ + int i,j,m; + + int *type = atom->type; + double *q = atom->q; + + m = 0; + + if (qflag) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = type[j]; + buf[m++] = q[j]; + } + } else { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = type[j]; + } + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void FixMolSwap::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + int *type = atom->type; + double *q = atom->q; + + m = 0; + last = first + n; + + if (qflag) { + for (i = first; i < last; i++) { + type[i] = static_cast (buf[m++]); + q[i] = buf[m++]; + } + } else { + for (i = first; i < last; i++) + type[i] = static_cast (buf[m++]); + } +} + +/* ---------------------------------------------------------------------- + return acceptance ratio +------------------------------------------------------------------------- */ + +double FixMolSwap::compute_vector(int n) +{ + if (n == 0) return nswap_attempt; + if (n == 1) return nswap_accept; + return 0.0; +} + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixMolSwap::write_restart(FILE *fp) +{ + int n = 0; + double list[6]; + list[n++] = random->state(); + list[n++] = ubuf(next_reneighbor).d; + list[n++] = nswap_attempt; + list[n++] = nswap_accept; + list[n++] = ubuf(update->ntimestep).d; + + if (comm->me == 0) { + int size = n * sizeof(double); + fwrite(&size,sizeof(int),1,fp); + fwrite(list,sizeof(double),n,fp); + } +} + +/* ---------------------------------------------------------------------- + use state info from restart file to restart the Fix +------------------------------------------------------------------------- */ + +void FixMolSwap::restart(char *buf) +{ + int n = 0; + double *list = (double *) buf; + + seed = static_cast (list[n++]); + random->reset(seed); + + next_reneighbor = (bigint) ubuf(list[n++]).i; + + nswap_attempt = static_cast(list[n++]); + nswap_accept = static_cast(list[n++]); + + bigint ntimestep_restart = (bigint) ubuf(list[n++]).i; + if (ntimestep_restart != update->ntimestep) + error->all(FLERR,"Must not reset timestep when restarting fix mol/swap"); +} diff --git a/src/MC/fix_mol_swap.h b/src/MC/fix_mol_swap.h new file mode 100644 index 0000000000..3197cbd832 --- /dev/null +++ b/src/MC/fix_mol_swap.h @@ -0,0 +1,122 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(mol/swap,FixMolSwap); +// clang-format on +#else + +#ifndef LMP_FIX_MOL_SWAP_H +#define LMP_FIX_MOL_SWAP_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixMolSwap : public Fix { + public: + FixMolSwap(class LAMMPS *, int, char **); + ~FixMolSwap(); + int setmask(); + void init(); + void pre_exchange(); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + double compute_vector(int); + void write_restart(FILE *); + void restart(char *); + + private: + int nevery, ncycles, seed; + int itype, jtype; + double temperature; + + int ke_flag; // 1 if kinetic energy is also swapped + double i2j_vscale; // scale factors for velocity to keep KE constant + double j2i_vscale; + + int qflag; // 1 if charge is also swapped + double iq,jq; // charge values for all itype,jtype atoms + + bool unequal_cutoffs; // 1 if itype and jtype have any different cutoffs + tagint minmol,maxmol; // range of mol IDs selected for swaps + + double nswap_attempt; // cummulative stats on MC attempts and accepts + double nswap_accept; + + double beta; // 1/kT + double energy_stored; // energy of current state as swaps are accepted + + class RanPark *random; + class Compute *c_pe; + + int attempt_swap(); + double energy_full(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Region ID for fix atom/swap does not exist + +Self-explanatory. + +E: Must specify at least 2 types in fix atom/swap command + +Self-explanatory. + +E: Need nswaptypes mu values in fix atom/swap command + +Self-explanatory. + +E: Only 2 types allowed when not using semi-grand in fix atom/swap command + +Self-explanatory. + +E: Mu not allowed when not using semi-grand in fix atom/swap command + +Self-explanatory. + +E: Invalid atom type in fix atom/swap command + +The atom type specified in the atom/swap command does not exist. + +E: All atoms of a swapped type must have the same charge. + +Self-explanatory. + +E: At least one atom of each swapped type must be present to define charges. + +Self-explanatory. + +E: All atoms of a swapped type must have same charge. + +Self-explanatory. + +E: Cannot do atom/swap on atoms in atom_modify first group + +This is a restriction due to the way atoms are organized in a list to +enable the atom_modify first command. + +*/ diff --git a/src/MDI/fix_mdi_engine.cpp b/src/MDI/fix_mdi_engine.cpp index 8024623e43..b08209080a 100644 --- a/src/MDI/fix_mdi_engine.cpp +++ b/src/MDI/fix_mdi_engine.cpp @@ -388,7 +388,7 @@ char *FixMDIEngine::engine_mode(const char *node) // respond to commands from the driver - while (not exit_flag and not local_exit_flag) { + while (!exit_flag && !local_exit_flag) { // read the next command from the driver // all procs call this, but only proc 0 receives the command diff --git a/src/MDI/mdi_engine.cpp b/src/MDI/mdi_engine.cpp index 4be739d187..5194c44189 100644 --- a/src/MDI/mdi_engine.cpp +++ b/src/MDI/mdi_engine.cpp @@ -200,7 +200,7 @@ void MDIEngine::command(int narg, char ** /*arg*/) char *command; - while (1) { + while (true) { // mdi/engine command only recognizes three nodes // DEFAULT, INIT_MD, INIT_OPTG @@ -265,7 +265,7 @@ char *MDIEngine::mdi_md() // run MD one step at a time - while (1) { + while (true) { update->whichflag = 1; timer->init_timeout(); update->nsteps += 1; diff --git a/src/MEAM/pair_meam.cpp b/src/MEAM/pair_meam.cpp index 2acf58f738..e8c6c942a4 100644 --- a/src/MEAM/pair_meam.cpp +++ b/src/MEAM/pair_meam.cpp @@ -255,7 +255,7 @@ void PairMEAM::coeff(int narg, char **arg) "'maxelt' in meam.h and recompile.", maxelt); for (int i = 0; i < nlibelements; i++) { - libelements.push_back(arg[i+3]); + libelements.emplace_back(arg[i+3]); mass.push_back(0.0); } @@ -517,7 +517,7 @@ void PairMEAM::read_user_meam_file(const std::string &userfile) char * line = nullptr; char buffer[MAXLINE]; - while (1) { + while (true) { int which; int nindex, index[3]; double value; diff --git a/src/MESONT/pair_mesont_tpm.cpp b/src/MESONT/pair_mesont_tpm.cpp index 64aeeeeadd..293e9d02f5 100644 --- a/src/MESONT/pair_mesont_tpm.cpp +++ b/src/MESONT/pair_mesont_tpm.cpp @@ -38,7 +38,7 @@ using namespace LAMMPS_NS; class MESONTList { public: MESONTList(const Atom* atom, const NeighList* nblist); - ~MESONTList() {}; + ~MESONTList() = default;; //list of segments const std::vector>& get_segments() const; //list of triplets @@ -197,7 +197,7 @@ MESONTList::MESONTList(const Atom* atom, const NeighList* nblist) { index_list.push_back(i); index_list_b[i] = index_list.size() - 1; int idx = i; - while (1) { + while (true) { idx = chain_list[idx][1]; if (idx == cnt_end || idx == domain_end) break; else index_list.push_back(idx); diff --git a/src/MGPT/mgpt_readpot.cpp b/src/MGPT/mgpt_readpot.cpp index 75ea1202aa..dd196142f5 100644 --- a/src/MGPT/mgpt_readpot.cpp +++ b/src/MGPT/mgpt_readpot.cpp @@ -131,7 +131,7 @@ static void getparmindata(const char *potin_file,int nvol[1],double vol0[1],doub exit(1); } - if (0) { + if (false) { printf("Before sort:\n"); for (int i = 0; i nvol = %d, vol0 = %.6f, x0= %.6f, x1 = %.6f, dx = %.6f\n", nvol,vol0,x0,x1,dx); } @@ -408,7 +408,7 @@ void potdata::readpot(const char *parmin_file,const char *potin_file,const doubl double vpair_tmp = vpairtab[i*nr+j]; vpairtab[i*nr+j] = vpairtab[i*nr+j]*fscr + v2a - v2b; - if (0) if (fabs(vol-ivol) < 0.01) { + if (false) if (fabs(vol-ivol) < 0.01) { static FILE *xfile = nullptr; if (j == 0) { xfile = fopen("mgpt5-pot.dat","w"); @@ -487,7 +487,7 @@ void potdata::readpot(const char *parmin_file,const char *potin_file,const doubl evalspline(nx-1,x0,x1,C,x,&evol0,&devol0,&unused); devol0 *= dxdv; - if (1) { + if (true) { printf("%% READPOT PARAMETERS:\n"); printf("%% ddl = %15.5e %15.5e %15.5e %15.5e\n",ddl[1],ddl[2],ddl[3],ddl[4]); diff --git a/src/MGPT/mgpt_readpot.h b/src/MGPT/mgpt_readpot.h index d860146959..89b59aa243 100644 --- a/src/MGPT/mgpt_readpot.h +++ b/src/MGPT/mgpt_readpot.h @@ -320,7 +320,7 @@ struct potdata2 { tdeppot.devol0 = maketempspline(ntemp,potlist,&(potlist[0].devol0)); - tdeppot.ddl[0] = 0; + tdeppot.ddl[0] = nullptr; for(int k = 1; k<=4; k++) tdeppot.ddl[k] = maketempspline(ntemp,potlist,&(potlist[0].ddl[k])); diff --git a/src/MGPT/mgpt_splinetab.cpp b/src/MGPT/mgpt_splinetab.cpp index e31572fe50..fd6d4541c2 100644 --- a/src/MGPT/mgpt_splinetab.cpp +++ b/src/MGPT/mgpt_splinetab.cpp @@ -105,7 +105,7 @@ void evalspline(int n,double x0,double x1,double C[][4], xhat = xhat - idx; p = C[idx]; - if (0) { + if (false) { *y = p[0] + xhat*(p[1] + xhat*(p[2] + xhat*p[3])); *dy = p[1] + xhat*(2*p[2] + xhat*3*p[3]); diff --git a/src/MGPT/pair_mgpt.cpp b/src/MGPT/pair_mgpt.cpp index fb956cabaf..4744693b0f 100644 --- a/src/MGPT/pair_mgpt.cpp +++ b/src/MGPT/pair_mgpt.cpp @@ -191,24 +191,24 @@ static inline double mtrace(int n,double A[8][8],double B[8][8]) { void PairMGPT::make_triplet(bond_data *ij_bond,bond_data *ik_bond, triplet_data *triptr) { - if (1) { - const trmul_fun tr_mul = linalg.tr_mul; - tr_mul(&(ij_bond->H.m[1][0]), &(ik_bond->H.m[1][0]) ,&(triptr->H1H2.m[1][0]) ); - tr_mul(&(ij_bond->Hx.m[1][0]),&(ik_bond->H.m[1][0]) ,&(triptr->H1xH2.m[1][0])); - tr_mul(&(ij_bond->Hy.m[1][0]),&(ik_bond->H.m[1][0]) ,&(triptr->H1yH2.m[1][0])); - tr_mul(&(ij_bond->Hz.m[1][0]),&(ik_bond->H.m[1][0]) ,&(triptr->H1zH2.m[1][0])); - tr_mul(&(ij_bond->H.m[1][0]) ,&(ik_bond->Hx.m[1][0]),&(triptr->H1H2x.m[1][0])); - tr_mul(&(ij_bond->H.m[1][0]) ,&(ik_bond->Hy.m[1][0]),&(triptr->H1H2y.m[1][0])); - tr_mul(&(ij_bond->H.m[1][0]) ,&(ik_bond->Hz.m[1][0]),&(triptr->H1H2z.m[1][0])); - } else { - transprod(ij_bond->H, ik_bond->H ,triptr->H1H2 ); - transprod(ij_bond->Hx,ik_bond->H ,triptr->H1xH2); - transprod(ij_bond->Hy,ik_bond->H ,triptr->H1yH2); - transprod(ij_bond->Hz,ik_bond->H ,triptr->H1zH2); - transprod(ij_bond->H ,ik_bond->Hx,triptr->H1H2x); - transprod(ij_bond->H ,ik_bond->Hy,triptr->H1H2y); - transprod(ij_bond->H ,ik_bond->Hz,triptr->H1H2z); - } +#if 1 + const trmul_fun tr_mul = linalg.tr_mul; + tr_mul(&(ij_bond->H.m[1][0]), &(ik_bond->H.m[1][0]) ,&(triptr->H1H2.m[1][0]) ); + tr_mul(&(ij_bond->Hx.m[1][0]),&(ik_bond->H.m[1][0]) ,&(triptr->H1xH2.m[1][0])); + tr_mul(&(ij_bond->Hy.m[1][0]),&(ik_bond->H.m[1][0]) ,&(triptr->H1yH2.m[1][0])); + tr_mul(&(ij_bond->Hz.m[1][0]),&(ik_bond->H.m[1][0]) ,&(triptr->H1zH2.m[1][0])); + tr_mul(&(ij_bond->H.m[1][0]) ,&(ik_bond->Hx.m[1][0]),&(triptr->H1H2x.m[1][0])); + tr_mul(&(ij_bond->H.m[1][0]) ,&(ik_bond->Hy.m[1][0]),&(triptr->H1H2y.m[1][0])); + tr_mul(&(ij_bond->H.m[1][0]) ,&(ik_bond->Hz.m[1][0]),&(triptr->H1H2z.m[1][0])); +#else + transprod(ij_bond->H, ik_bond->H ,triptr->H1H2 ); + transprod(ij_bond->Hx,ik_bond->H ,triptr->H1xH2); + transprod(ij_bond->Hy,ik_bond->H ,triptr->H1yH2); + transprod(ij_bond->Hz,ik_bond->H ,triptr->H1zH2); + transprod(ij_bond->H ,ik_bond->Hx,triptr->H1H2x); + transprod(ij_bond->H ,ik_bond->Hy,triptr->H1H2y); + transprod(ij_bond->H ,ik_bond->Hz,triptr->H1H2z); +#endif } static double t_make_t = 0.0,t_make_b = 0.0,n_make = 0.0; @@ -222,8 +222,8 @@ PairMGPT::triplet_data *PairMGPT::get_triplet(const double xx[][3],int i,int j,i double t0,t1; - bond_data *bij = 0,*bik = 0; - triplet_data *tptr = 0; + bond_data *bij = nullptr,*bik = nullptr; + triplet_data *tptr = nullptr; t0 = gettime(); if (recompute == 0) { @@ -231,7 +231,7 @@ PairMGPT::triplet_data *PairMGPT::get_triplet(const double xx[][3],int i,int j,i bik = bhash->Lookup(Doublet(i,k)); } - if (bij == 0) { + if (bij == nullptr) { if (recompute == 0) bij = bhash->Insert(Doublet(i,j)); else @@ -242,7 +242,7 @@ PairMGPT::triplet_data *PairMGPT::get_triplet(const double xx[][3],int i,int j,i make_bond(xx,j,i,bij); } - if (bik == 0) { + if (bik == nullptr) { if (recompute == 0) bik = bhash->Insert(Doublet(i,k)); else @@ -256,7 +256,7 @@ PairMGPT::triplet_data *PairMGPT::get_triplet(const double xx[][3],int i,int j,i t_make_b += t1-t0; t0 = gettime(); - if (bij != 0 && bij != 0) { + if (bij != nullptr && bij != nullptr) { tptr = twork; make_triplet(bij,bik,tptr); *dvir_ij_p = bij->fl_deriv_sum; @@ -289,7 +289,7 @@ double PairMGPT::numderiv3t(double xx[][3],int i,int j,int k,int p) { xx[i][p] = xsave - delta; make_bond(xx,i,j,&Bij); - if (0) { /* This bond doesn't change when i is perturbed */ + if (false) { /* This bond doesn't change when i is perturbed */ make_bond(xx,j,k,&Bjk); } make_bond(xx,k,i,&Bki); @@ -341,7 +341,7 @@ double PairMGPT::numderiv4(double xx[][3],int i,int j,int k,int m,int p) { xx[i][p] = xsave - delta; make_bond(xx,i,j,&Bij); - if (0) { /* Only the i coordinates changed... */ + if (false) { /* Only the i coordinates changed... */ make_bond(xx,j,k,&Bjk); make_bond(xx,k,m,&Bkm); } @@ -438,7 +438,7 @@ void PairMGPT::force_debug_4(double xx[][3], for (int p = 0; p<3; p++) { /* Compute numerical derivatives by displacing atoms i,j,k,m */ double ndfi,ndfj,ndfk,ndfm; - if (1) { + if (true) { double ndf[] = {0.0,0.0,0.0,0.0}; for (int s = 0; s<4; s++) for (int t = 0; t<4; t++) @@ -765,7 +765,7 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, int c_p = 0, c_t = 0, c_q = 0; - if (0) + if (false) if (domain->triclinic) { if (comm->me == 0) printf("Can not handle triclinic box yet\n"); @@ -933,7 +933,7 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, const int ski = (k < i) ? 1 : -1; - T12 = T23 = T31 = 0; + T12 = T23 = T31 = nullptr; mj = first[j]; /* @@ -1042,7 +1042,7 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, accumulate_forces_3(w3); } - if (T12 != 0) { + if (T12 != nullptr) { //printf("T12 i,j,k = %d,%d,%d\n",i,j,k); mcount++; if (three_body_energies && evflag) { @@ -1098,7 +1098,7 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, accumulate_forces_3(w3); } - if (T23 != 0) { + if (T23 != nullptr) { //printf("T23 i,j,k = %d,%d,%d\n",i,j,k); mcount++; if (three_body_energies && evflag) { @@ -1154,7 +1154,7 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, } - if (T31 != 0) { + if (T31 != nullptr) { //printf("T31 i,j,k = %d,%d,%d\n",i,j,k); mcount++; if (three_body_energies && evflag) { @@ -1327,15 +1327,15 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, tr1 = tr2 = tr3 = 0.0; dvir_im = dvir_jm = dvir_km = 0.0; - T45 = T56 = T64 = 0; - if (T12 != 0 && c_km && c_im) + T45 = T56 = T64 = nullptr; + if (T12 != nullptr && c_km && c_im) T45 = get_triplet(xx,m,i,k,&bond_hash,&T45work,&dvir_im,&dvir_km); - if (T23 != 0 && c_im && c_jm) + if (T23 != nullptr && c_im && c_jm) T56 = get_triplet(xx,m,i,j,&bond_hash,&T56work,&dvir_im,&dvir_jm); - if (T31 != 0 && c_jm && c_km) + if (T31 != nullptr && c_jm && c_km) T64 = get_triplet(xx,m,j,k,&bond_hash,&T64work,&dvir_jm,&dvir_km); - if (T12 != 0 && T45 != 0) { + if (T12 != nullptr && T45 != nullptr) { if (four_body_energies && evflag) { tr1 = transtrace(T12->H1H2,T45->H1H2); double dvir = ( (dvir_ij + dvir_jk + dvir_im + dvir_km)*splinepot.ve + @@ -1364,7 +1364,7 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, accumulate_forces_4(w4); } - if (T23 != 0 && T56 != 0) { + if (T23 != nullptr && T56 != nullptr) { if (four_body_energies && evflag) { tr2 = transtrace(T23->H1H2,T56->H1H2); double dvir = ( (dvir_ki + dvir_jk + dvir_im + dvir_jm)*splinepot.ve + @@ -1394,7 +1394,7 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, } - if (T31 != 0 && T64 != 0) { + if (T31 != nullptr && T64 != nullptr) { if (four_body_energies && evflag) { tr3 = transtrace(T31->H1H2,T64->H1H2); double dvir = ( (dvir_ki + dvir_ij + dvir_jm + dvir_km)*splinepot.ve + @@ -1690,7 +1690,7 @@ void PairMGPT::compute(int eflag, int vflag) compute_x(listfull->numneigh,listfull->firstneigh,&e_s,&e_p,&e_t,&e_q,evflag,newton_pair); - if (0) { // Stupid force calculation / verification + if (false) { // Stupid force calculation / verification int ii,nmax=-1; for (ii = 0; iiinum + listfull->gnum; ii++) { int i = listfull->ilist[ii]; @@ -1768,7 +1768,7 @@ void PairMGPT::compute(int eflag, int vflag) } - if (0) { + if (false) { printf("\nForces MGPT:\n"); const int iimax = (listfull->inum < 10) ? listfull->inum : 10; for (int ii = 0; iinext; delete p; p = q; @@ -188,9 +188,9 @@ public: return &table[idx]->data; } else { /* This is for threading... and incomplete */ typedef Link *LinkPtr; - LinkPtr ptr = table[idx],last = 0,dataptr = new Link(key,0); + LinkPtr ptr = table[idx],last = nullptr,dataptr = new Link(key,nullptr); - while(ptr != 0) { + while(ptr != nullptr) { last = ptr; ptr = ptr->next; } @@ -241,7 +241,7 @@ public: p = table[idx]; - while(p != 0 && !(p->key == key)) { + while(p != nullptr && !(p->key == key)) { p = p->next; count = count + 1; } @@ -251,9 +251,9 @@ public: nsearch = nsearch + 1; nstep = nstep + count; - if(p != 0) p->hits++; + if(p != nullptr) p->hits++; - return (p == 0) ? 0 : &p->data; + return (p == nullptr) ? nullptr : &p->data; } }; @@ -469,8 +469,8 @@ public: return 0; } double get_weight(const int triclinic, - const double a[3] = 0,const double b[3] = 0, - const double c[3] = 0,const double d[3] = 0) { + const double a[3] = nullptr,const double b[3] = nullptr, + const double c[3] = nullptr,const double d[3] = nullptr) { const double *s0 = triclinic ? domain->sublo_lamda : domain->sublo, *s1 = triclinic ? domain->subhi_lamda : domain->subhi; @@ -479,10 +479,10 @@ public: for(int p = 0; p<3; p++) { double cog = 0.0,q,w,n = 0.0; - if(a != 0) { cog = cog + a[p]; n = n + 1; } - if(b != 0) { cog = cog + b[p]; n = n + 1; } - if(c != 0) { cog = cog + c[p]; n = n + 1; } - if(d != 0) { cog = cog + d[p]; n = n + 1; } + if(a != nullptr) { cog = cog + a[p]; n = n + 1; } + if(b != nullptr) { cog = cog + b[p]; n = n + 1; } + if(c != nullptr) { cog = cog + c[p]; n = n + 1; } + if(d != nullptr) { cog = cog + d[p]; n = n + 1; } cog = cog * (1.0/n); if(cog < 0.5*(s0[p]+s1[p])) q = cog - s0[p]; diff --git a/src/MISC/fix_ipi.cpp b/src/MISC/fix_ipi.cpp index b56c5eebcb..b82339713e 100644 --- a/src/MISC/fix_ipi.cpp +++ b/src/MISC/fix_ipi.cpp @@ -200,22 +200,10 @@ FixIPI::FixIPI(LAMMPS *lmp, int narg, char **arg) : hasdata = bsize = 0; // creates a temperature compute for all atoms - char** newarg = new char*[3]; - newarg[0] = (char *) "IPI_TEMP"; - newarg[1] = (char *) "all"; - newarg[2] = (char *) "temp"; - modify->add_compute(3,newarg); - delete [] newarg; + modify->add_compute("IPI_TEMP all temp"); // creates a pressure compute to extract the virial - newarg = new char*[5]; - newarg[0] = (char *) "IPI_PRESS"; - newarg[1] = (char *) "all"; - newarg[2] = (char *) "pressure"; - newarg[3] = (char *) "IPI_TEMP"; - newarg[4] = (char *) "virial"; - modify->add_compute(5,newarg); - delete [] newarg; + modify->add_compute("IPI_PRESS all pressure IPI_TEMP virial"); // create instance of Irregular class irregular = new Irregular(lmp); diff --git a/src/MISC/fix_pair_tracker.cpp b/src/MISC/fix_pair_tracker.cpp index 95151375c4..3616855869 100644 --- a/src/MISC/fix_pair_tracker.cpp +++ b/src/MISC/fix_pair_tracker.cpp @@ -79,15 +79,14 @@ FixPairTracker::FixPairTracker(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg], "type/include") == 0) { if (iarg + 1 >= narg) error->all(FLERR, "Invalid keyword in fix pair/tracker command"); int ntypes = atom->ntypes; - - int i, j, itype, jtype, in, jn, infield, jnfield; + int i, j, itype, jtype; int inlo, inhi, jnlo, jnhi; - char *istr, *jstr; + if (!type_filter) { memory->create(type_filter, ntypes + 1, ntypes + 1, "fix/pair/tracker:type_filter"); for (i = 0; i <= ntypes; i++) { - for (j = 0; j <= ntypes; j++) { type_filter[i][j] = 0; } + for (j = 0; j <= ntypes; j++) type_filter[i][j] = 0; } } diff --git a/src/ML-IAP/mliap_descriptor_snap.cpp b/src/ML-IAP/mliap_descriptor_snap.cpp index 6399ef63a3..5475117a99 100644 --- a/src/ML-IAP/mliap_descriptor_snap.cpp +++ b/src/ML-IAP/mliap_descriptor_snap.cpp @@ -382,7 +382,7 @@ void MLIAPDescriptorSNAP::read_paramfile(char *paramfilename) int eof = 0; int n,nwords; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fpparam); if (ptr == nullptr) { diff --git a/src/ML-IAP/mliap_descriptor_so3.cpp b/src/ML-IAP/mliap_descriptor_so3.cpp index d816bd0638..e8bedea377 100644 --- a/src/ML-IAP/mliap_descriptor_so3.cpp +++ b/src/ML-IAP/mliap_descriptor_so3.cpp @@ -93,7 +93,7 @@ void MLIAPDescriptorSO3::read_paramfile(char *paramfilename) int eof = 0; int n, nwords; - while (1) { + while (true) { if (comm->me == 0) { ptr = utils::fgets_trunc(line, MAXLINE, fpparam); if (ptr == nullptr) { diff --git a/src/ML-IAP/mliap_model_linear.cpp b/src/ML-IAP/mliap_model_linear.cpp index 1323b95aa1..08654783d8 100644 --- a/src/ML-IAP/mliap_model_linear.cpp +++ b/src/ML-IAP/mliap_model_linear.cpp @@ -31,10 +31,6 @@ MLIAPModelLinear::MLIAPModelLinear(LAMMPS* lmp, char* coefffilename) : if (nparams > 0) ndescriptors = nparams - 1; } -/* ---------------------------------------------------------------------- */ - -MLIAPModelLinear::~MLIAPModelLinear() {} - /* ---------------------------------------------------------------------- get number of parameters ---------------------------------------------------------------------- */ diff --git a/src/ML-IAP/mliap_model_linear.h b/src/ML-IAP/mliap_model_linear.h index b485e58eff..d2abaec31e 100644 --- a/src/ML-IAP/mliap_model_linear.h +++ b/src/ML-IAP/mliap_model_linear.h @@ -21,7 +21,7 @@ namespace LAMMPS_NS { class MLIAPModelLinear : public MLIAPModelSimple { public: MLIAPModelLinear(LAMMPS *, char * = nullptr); - ~MLIAPModelLinear(); + ~MLIAPModelLinear() = default; virtual int get_nparams(); virtual int get_gamma_nnz(class MLIAPData *); virtual void compute_gradients(class MLIAPData *); diff --git a/src/ML-IAP/mliap_model_nn.cpp b/src/ML-IAP/mliap_model_nn.cpp index 10ef97300e..853f1d9c6c 100644 --- a/src/ML-IAP/mliap_model_nn.cpp +++ b/src/ML-IAP/mliap_model_nn.cpp @@ -125,7 +125,7 @@ void MLIAPModelNN::read_coeffs(char *coefffilename) int ielem = 0; int l = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fpcoeff); if (ptr == nullptr) { diff --git a/src/ML-IAP/mliap_model_python.cpp b/src/ML-IAP/mliap_model_python.cpp index 3d91107449..878d234c69 100644 --- a/src/ML-IAP/mliap_model_python.cpp +++ b/src/ML-IAP/mliap_model_python.cpp @@ -62,7 +62,7 @@ MLIAPModelPython::MLIAPModelPython(LAMMPS *lmp, char *coefffilename) : // if LAMMPS_POTENTIALS environment variable is set, add it to PYTHONPATH as well const char *potentials_path = getenv("LAMMPS_POTENTIALS"); - if (potentials_path != NULL) { PyList_Append(py_path, PY_STRING_FROM_STRING(potentials_path)); } + if (potentials_path != nullptr) { PyList_Append(py_path, PY_STRING_FROM_STRING(potentials_path)); } PyGILState_Release(gstate); if (coefffilename) read_coeffs(coefffilename); @@ -132,7 +132,7 @@ void MLIAPModelPython::connect_param_counts() void MLIAPModelPython::compute_gradients(MLIAPData *data) { - if (not model_loaded) { error->all(FLERR, "Model not loaded."); } + if (!model_loaded) { error->all(FLERR, "Model not loaded."); } PyGILState_STATE gstate = PyGILState_Ensure(); MLIAPPY_compute_gradients(this, data); diff --git a/src/ML-IAP/mliap_model_python.h b/src/ML-IAP/mliap_model_python.h index 8410b4dc4a..4243c67332 100644 --- a/src/ML-IAP/mliap_model_python.h +++ b/src/ML-IAP/mliap_model_python.h @@ -20,7 +20,7 @@ namespace LAMMPS_NS { class MLIAPModelPython : public MLIAPModel { public: - MLIAPModelPython(LAMMPS *, char * = NULL); + MLIAPModelPython(LAMMPS *, char * = nullptr); ~MLIAPModelPython(); virtual int get_nparams(); virtual int get_gamma_nnz(class MLIAPData *); diff --git a/src/ML-IAP/mliap_model_quadratic.cpp b/src/ML-IAP/mliap_model_quadratic.cpp index a881c7848c..10507adc91 100644 --- a/src/ML-IAP/mliap_model_quadratic.cpp +++ b/src/ML-IAP/mliap_model_quadratic.cpp @@ -34,10 +34,6 @@ MLIAPModelQuadratic::MLIAPModelQuadratic(LAMMPS* lmp, char* coefffilename) : nonlinearflag = 1; } -/* ---------------------------------------------------------------------- */ - -MLIAPModelQuadratic::~MLIAPModelQuadratic() {} - /* ---------------------------------------------------------------------- get number of parameters ---------------------------------------------------------------------- */ diff --git a/src/ML-IAP/mliap_model_quadratic.h b/src/ML-IAP/mliap_model_quadratic.h index c183178339..74234066c8 100644 --- a/src/ML-IAP/mliap_model_quadratic.h +++ b/src/ML-IAP/mliap_model_quadratic.h @@ -21,7 +21,7 @@ namespace LAMMPS_NS { class MLIAPModelQuadratic : public MLIAPModelSimple { public: MLIAPModelQuadratic(LAMMPS *, char * = nullptr); - ~MLIAPModelQuadratic(); + ~MLIAPModelQuadratic() = default; virtual int get_nparams(); virtual int get_gamma_nnz(class MLIAPData *); virtual void compute_gradients(class MLIAPData *); diff --git a/src/ML-PACE/pair_pace.cpp b/src/ML-PACE/pair_pace.cpp index f0d6547083..56e3d6005d 100644 --- a/src/ML-PACE/pair_pace.cpp +++ b/src/ML-PACE/pair_pace.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -43,52 +42,47 @@ Copyright 2021 Yury Lysogorskiy^1, Cas van der Oord^2, Anton Bochkarev^1, #include #include +#include "ace_c_basis.h" #include "ace_evaluator.h" #include "ace_recursive.h" -#include "ace_c_basis.h" #include "ace_version.h" namespace LAMMPS_NS { - struct ACEImpl { - ACEImpl() : basis_set(nullptr), ace(nullptr){} - ~ACEImpl() {delete basis_set; delete ace;} - ACECTildeBasisSet *basis_set; - ACERecursiveEvaluator *ace; - }; -} +struct ACEImpl { + ACEImpl() : basis_set(nullptr), ace(nullptr) {} + ~ACEImpl() + { + delete basis_set; + delete ace; + } + ACECTildeBasisSet *basis_set; + ACERecursiveEvaluator *ace; +}; +} // namespace LAMMPS_NS using namespace LAMMPS_NS; using namespace MathConst; -#define MAXLINE 1024 -#define DELTA 4 +static char const *const elements_pace[] = { + "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", + "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", + "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", + "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", + "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", + "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", + "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"}; +static constexpr int elements_num_pace = sizeof(elements_pace) / sizeof(const char *); -//added YL - -//keywords for ACE evaluator style -#define RECURSIVE_KEYWORD "recursive" -#define PRODUCT_KEYWORD "product" - -static int elements_num_pace = 104; -static char const *const elements_pace[104] = {"X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", - "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", - "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", - "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", - "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", - "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", - "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", - "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr" -}; - -static int AtomicNumberByName_pace(char *elname) { +static int AtomicNumberByName_pace(char *elname) +{ for (int i = 1; i < elements_num_pace; i++) - if (strcmp(elname, elements_pace[i]) == 0) - return i; + if (strcmp(elname, elements_pace[i]) == 0) return i; return -1; } /* ---------------------------------------------------------------------- */ -PairPACE::PairPACE(LAMMPS *lmp) : Pair(lmp) { +PairPACE::PairPACE(LAMMPS *lmp) : Pair(lmp) +{ single_enable = 0; restartinfo = 0; one_coeff = 1; @@ -104,7 +98,8 @@ PairPACE::PairPACE(LAMMPS *lmp) : Pair(lmp) { check if allocated, since class can be destructed when incomplete ------------------------------------------------------------------------- */ -PairPACE::~PairPACE() { +PairPACE::~PairPACE() +{ if (copymode) return; delete aceimpl; @@ -118,7 +113,8 @@ PairPACE::~PairPACE() { /* ---------------------------------------------------------------------- */ -void PairPACE::compute(int eflag, int vflag) { +void PairPACE::compute(int eflag, int vflag) +{ int i, j, ii, jj, inum, jnum; double delx, dely, delz, evdwl; double fij[3]; @@ -149,8 +145,7 @@ void PairPACE::compute(int eflag, int vflag) { // the pointer to the list of neighbors of "i" firstneigh = list->firstneigh; - if (inum != nlocal) - error->all(FLERR,"inum: {} nlocal: {} are different",inum, nlocal); + if (inum != nlocal) error->all(FLERR, "inum: {} nlocal: {} are different", inum, nlocal); // Aidan Thompson told RD (26 July 2019) that practically always holds: // inum = nlocal @@ -160,7 +155,6 @@ void PairPACE::compute(int eflag, int vflag) { // skin atoms can be removed by setting skin to zero but here // they are disregarded anyway - //determine the maximum number of neighbours int max_jnum = -1; int nei = 0; @@ -168,8 +162,7 @@ void PairPACE::compute(int eflag, int vflag) { i = ilist[ii]; jnum = numneigh[i]; nei = nei + jnum; - if (jnum > max_jnum) - max_jnum = jnum; + if (jnum > max_jnum) max_jnum = jnum; } aceimpl->ace->resize_neighbours_cache(max_jnum); @@ -199,6 +192,7 @@ void PairPACE::compute(int eflag, int vflag) { } catch (exception &e) { error->one(FLERR, e.what()); } + // 'compute_atom' will update the `aceimpl->ace->e_atom` and `aceimpl->ace->neighbours_forces(jj, alpha)` arrays for (jj = 0; jj < jnum; jj++) { @@ -209,9 +203,9 @@ void PairPACE::compute(int eflag, int vflag) { dely = x[j][1] - ytmp; delz = x[j][2] - ztmp; - fij[0] = scale[itype][jtype]*aceimpl->ace->neighbours_forces(jj, 0); - fij[1] = scale[itype][jtype]*aceimpl->ace->neighbours_forces(jj, 1); - fij[2] = scale[itype][jtype]*aceimpl->ace->neighbours_forces(jj, 2); + fij[0] = scale[itype][itype] * aceimpl->ace->neighbours_forces(jj, 0); + fij[1] = scale[itype][itype] * aceimpl->ace->neighbours_forces(jj, 1); + fij[2] = scale[itype][itype] * aceimpl->ace->neighbours_forces(jj, 2); f[i][0] += fij[0]; f[i][1] += fij[1]; @@ -222,15 +216,14 @@ void PairPACE::compute(int eflag, int vflag) { // tally per-atom virial contribution if (vflag) - ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, - fij[0], fij[1], fij[2], - -delx, -dely, -delz); + ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, fij[0], fij[1], fij[2], -delx, -dely, + -delz); } // tally energy contribution if (eflag) { // evdwl = energy of atom I - evdwl = scale[1][1]*aceimpl->ace->e_atom; + evdwl = scale[itype][itype]*aceimpl->ace->e_atom; ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); } } @@ -242,42 +235,45 @@ void PairPACE::compute(int eflag, int vflag) { /* ---------------------------------------------------------------------- */ -void PairPACE::allocate() { +void PairPACE::allocate() +{ allocated = 1; - int n = atom->ntypes; + int n = atom->ntypes + 1; - memory->create(setflag, n + 1, n + 1, "pair:setflag"); - memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); - memory->create(scale, n + 1, n + 1,"pair:scale"); - map = new int[n+1]; + memory->create(setflag, n, n, "pair:setflag"); + memory->create(cutsq, n, n, "pair:cutsq"); + memory->create(scale, n, n, "pair:scale"); + map = new int[n]; } /* ---------------------------------------------------------------------- global settings ------------------------------------------------------------------------- */ -void PairPACE::settings(int narg, char **arg) { - if (narg > 1) - error->all(FLERR,"Illegal pair_style command."); +void PairPACE::settings(int narg, char **arg) +{ + if (narg > 1) error->all(FLERR, "Illegal pair_style command."); // ACE potentials are parameterized in metal units - if (strcmp("metal",update->unit_style) != 0) - error->all(FLERR,"ACE potentials require 'metal' units"); + if (strcmp("metal", update->unit_style) != 0) + error->all(FLERR, "ACE potentials require 'metal' units"); - recursive = true; // default evaluator style: RECURSIVE + recursive = true; // default evaluator style: RECURSIVE if (narg > 0) { - if (strcmp(arg[0], RECURSIVE_KEYWORD) == 0) + if (strcmp(arg[0], "recursive") == 0) recursive = true; - else if (strcmp(arg[0], PRODUCT_KEYWORD) == 0) { + else if (strcmp(arg[0], "product") == 0) { recursive = false; - } else error->all(FLERR,"Illegal pair_style command"); + } else + error->all(FLERR, "Illegal pair_style command"); } if (comm->me == 0) { - utils::logmesg(lmp,"ACE version: {}.{}.{}\n", - VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - if (recursive) utils::logmesg(lmp,"Recursive evaluator is used\n"); - else utils::logmesg(lmp,"Product evaluator is used\n"); + utils::logmesg(lmp, "ACE version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); + if (recursive) + utils::logmesg(lmp, "Recursive evaluator is used\n"); + else + utils::logmesg(lmp, "Product evaluator is used\n"); } } @@ -285,29 +281,29 @@ void PairPACE::settings(int narg, char **arg) { set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairPACE::coeff(int narg, char **arg) { +void PairPACE::coeff(int narg, char **arg) +{ if (!allocated) allocate(); - map_element2type(narg-3,arg+3); + map_element2type(narg - 3, arg + 3); auto potential_file_name = utils::get_potential_file_path(arg[2]); char **elemtypes = &arg[3]; //load potential file delete aceimpl->basis_set; - aceimpl->basis_set = new ACECTildeBasisSet(); - if (comm->me == 0) - utils::logmesg(lmp,"Loading {}\n", potential_file_name); - aceimpl->basis_set->load(potential_file_name); + if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); + aceimpl->basis_set = new ACECTildeBasisSet(potential_file_name); if (comm->me == 0) { - utils::logmesg(lmp,"Total number of basis functions\n"); + utils::logmesg(lmp, "Total number of basis functions\n"); for (SPECIES_TYPE mu = 0; mu < aceimpl->basis_set->nelements; mu++) { int n_r1 = aceimpl->basis_set->total_basis_size_rank1[mu]; int n = aceimpl->basis_set->total_basis_size[mu]; - utils::logmesg(lmp,"\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, n); + utils::logmesg(lmp, "\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, + n); } } @@ -324,26 +320,25 @@ void PairPACE::coeff(int narg, char **arg) { for (int i = 1; i <= n; i++) { char *elemname = elemtypes[i - 1]; int atomic_number = AtomicNumberByName_pace(elemname); - if (atomic_number == -1) - error->all(FLERR,"'{}' is not a valid element\n", elemname); + if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); if (mu != -1) { if (comm->me == 0) - utils::logmesg(lmp,"Mapping LAMMPS atom type #{}({}) -> " - "ACE species type #{}\n", i, elemname, mu); + utils::logmesg(lmp, "Mapping LAMMPS atom type #{}({}) -> ACE species type #{}\n", i, + elemname, mu); map[i] = mu; - aceimpl->ace->element_type_mapping(i) = mu; // set up LAMMPS atom type to ACE species mapping for ace evaluator + // set up LAMMPS atom type to ACE species mapping for ace evaluator + aceimpl->ace->element_type_mapping(i) = mu; } else { - error->all(FLERR,"Element {} is not supported by ACE-potential from file {}", elemname,potential_file_name); + error->all(FLERR, "Element {} is not supported by ACE-potential from file {}", elemname, + potential_file_name); } } // initialize scale factor for (int i = 1; i <= n; i++) { - for (int j = i; j <= n; j++) { - scale[i][j] = 1.0; - } + for (int j = i; j <= n; j++) { scale[i][j] = 1.0; } } aceimpl->ace->set_basis(*aceimpl->basis_set, 1); @@ -353,11 +348,10 @@ void PairPACE::coeff(int narg, char **arg) { init specific to this pair style ------------------------------------------------------------------------- */ -void PairPACE::init_style() { - if (atom->tag_enable == 0) - error->all(FLERR, "Pair style pACE requires atom IDs"); - if (force->newton_pair == 0) - error->all(FLERR, "Pair style pACE requires newton pair on"); +void PairPACE::init_style() +{ + if (atom->tag_enable == 0) error->all(FLERR, "Pair style pACE requires atom IDs"); + if (force->newton_pair == 0) error->all(FLERR, "Pair style pACE requires newton pair on"); // request a full neighbor list int irequest = neighbor->request(this, instance_me); @@ -369,7 +363,8 @@ void PairPACE::init_style() { init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairPACE::init_one(int i, int j) { +double PairPACE::init_one(int i, int j) +{ if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); //cutoff from the basis set's radial functions settings scale[j][i] = scale[i][j]; @@ -382,7 +377,6 @@ double PairPACE::init_one(int i, int j) { void *PairPACE::extract(const char *str, int &dim) { dim = 2; - if (strcmp(str,"scale") == 0) return (void *) scale; + if (strcmp(str, "scale") == 0) return (void *) scale; return nullptr; } - diff --git a/src/ML-RANN/pair_rann.cpp b/src/ML-RANN/pair_rann.cpp index 60ed776c41..3e97b638dc 100644 --- a/src/ML-RANN/pair_rann.cpp +++ b/src/ML-RANN/pair_rann.cpp @@ -432,7 +432,7 @@ void PairRANN::read_atom_types(std::vector line,char *filename,int int nwords = line.size(); if (nwords < 1) error->one(filename,linenum,"Incorrect syntax for atom types"); nelements = nwords; - line.push_back("all"); + line.emplace_back("all"); allocate(line); } @@ -440,7 +440,7 @@ void PairRANN::read_mass(const std::vector &line1, const std::vecto if (nelements == -1)error->one(filename,linenum-1,"atom types must be defined before mass in potential file."); for (int i=0;i line,std::vector l if (nelements == -1)error->one(filename,linenum-1,"atom types must be defined before fingerprints per element in potential file."); for (i=0;i line,std::vectorn_body_type!=nwords-1) {error->one(filename,linenum,"invalid fingerprint for element combination");} k++; - fingerprints[i][i1]->init(atomtypes,utils::inumeric(filename,linenum,line1[k++].c_str(),1,lmp)); + fingerprints[i][i1]->init(atomtypes,utils::inumeric(filename,linenum,line1[k++].c_str(),true,lmp)); fingerprintcount[i]++; } delete[] atomtypes; @@ -523,7 +523,7 @@ void PairRANN::read_fingerprint_constants(std::vector line,std::vec for (j=0;jatomtypes[j]!=atomtypes[j]) {break;} if (j==n_body_type-1) { - if (line[nwords-3].compare(fingerprints[i][k]->style)==0 && utils::inumeric(filename,linenum,line[nwords-2].c_str(),1,lmp)==fingerprints[i][k]->id) { + if (line[nwords-3].compare(fingerprints[i][k]->style)==0 && utils::inumeric(filename,linenum,line[nwords-2].c_str(),true,lmp)==fingerprints[i][k]->id) { found=true; i1 = k; break; @@ -542,7 +542,7 @@ void PairRANN::read_network_layers(std::vector line,std::vectorone(filename,linenum-1,"atom types must be defined before network layers in potential file."); for (i=0;ione(filename,linenum,"invalid number of network layers"); delete[] net[i].dimensions; weightdefined[i] = new bool [net[i].layers]; @@ -570,9 +570,9 @@ void PairRANN::read_layer_size(std::vector line,std::vectorone(filename,linenum-1,"networklayers for each atom type must be defined before the corresponding layer sizes."); - int j = utils::inumeric(filename,linenum,line[2].c_str(),1,lmp); + int j = utils::inumeric(filename,linenum,line[2].c_str(),true,lmp); if (j>=net[i].layers || j<0) {error->one(filename,linenum,"invalid layer in layer size definition");}; - net[i].dimensions[j]= utils::inumeric(filename,linenum,line1[0].c_str(),1,lmp); + net[i].dimensions[j]= utils::inumeric(filename,linenum,line1[0].c_str(),true,lmp); return; } } @@ -587,7 +587,7 @@ void PairRANN::read_weight(std::vector line,std::vectorone(filename,*linenum-1,"networklayers must be defined before weights."); - i=utils::inumeric(filename,*linenum,line[2].c_str(),1,lmp); + i=utils::inumeric(filename,*linenum,line[2].c_str(),true,lmp); if (i>=net[l].layers || i<0)error->one(filename,*linenum-1,"invalid weight layer"); if (net[l].dimensions[i]==0 || net[l].dimensions[i+1]==0) error->one(filename,*linenum-1,"network layer sizes must be defined before corresponding weight"); net[l].Weights[i] = new double[net[l].dimensions[i]*net[l].dimensions[i+1]]; @@ -595,7 +595,7 @@ void PairRANN::read_weight(std::vector line,std::vectorone(filename,*linenum,"invalid weights per line"); for (k=0;k line,std::vectorone(filename,*linenum,"invalid weights per line"); for (k=0;k line,std::vector for (l=0;lone(filename,*linenum-1,"networklayers must be defined before biases."); - i=utils::inumeric(filename,*linenum,line[2].c_str(),1,lmp); + i=utils::inumeric(filename,*linenum,line[2].c_str(),true,lmp); if (i>=net[l].layers || i<0)error->one(filename,*linenum-1,"invalid bias layer"); if (net[l].dimensions[i]==0) error->one(filename,*linenum-1,"network layer sizes must be defined before corresponding bias"); biasdefined[l][i] = true; net[l].Biases[i] = new double[net[l].dimensions[i+1]]; - net[l].Biases[i][0] = utils::numeric(filename,*linenum,line1[0].c_str(),1,lmp); + net[l].Biases[i][0] = utils::numeric(filename,*linenum,line1[0].c_str(),true,lmp); for (j=1;jone(filename,*linenum,"unexpected end of potential file!"); (*linenum)++; Tokenizer values1 = Tokenizer(linetemp,": ,\t_\n"); line1 = values1.as_vector(); - net[l].Biases[i][j] = utils::numeric(filename,*linenum,line1[0].c_str(),1,lmp); + net[l].Biases[i][j] = utils::numeric(filename,*linenum,line1[0].c_str(),true,lmp); } return; } @@ -680,10 +680,10 @@ void PairRANN::read_screening(std::vector line,std::vectorone(filename,linenum-1,"unrecognized screening keyword"); delete[] atomtypes; diff --git a/src/ML-RANN/rann_fingerprint_bond.cpp b/src/ML-RANN/rann_fingerprint_bond.cpp index dd2a309415..48c73757e7 100644 --- a/src/ML-RANN/rann_fingerprint_bond.cpp +++ b/src/ML-RANN/rann_fingerprint_bond.cpp @@ -77,26 +77,26 @@ bool Fingerprint_bond::parse_values(std::string constant,std::vectorerrorf(FLERR,"Undefined value for bond power"); if (re!=0.0 && rc!=0.0 && alpha_k[0]!=-1 && dr!=0.0 && mlength!=0 && kmax!=0)return true; diff --git a/src/ML-RANN/rann_fingerprint_bondscreened.cpp b/src/ML-RANN/rann_fingerprint_bondscreened.cpp index 0e9d562f6e..6f65ca6454 100644 --- a/src/ML-RANN/rann_fingerprint_bondscreened.cpp +++ b/src/ML-RANN/rann_fingerprint_bondscreened.cpp @@ -78,26 +78,26 @@ bool Fingerprint_bondscreened::parse_values(std::string constant,std::vectorerrorf(FLERR,"Undefined value for bond power"); if (re!=0.0 && rc!=0.0 && alpha_k[0]!=-1 && dr!=0.0 && mlength!=0 && kmax!=0)return true; diff --git a/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp b/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp index 5fb81dc5b1..1dcf8872d2 100644 --- a/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp +++ b/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp @@ -79,26 +79,26 @@ bool Fingerprint_bondscreenedspin::parse_values(std::string constant,std::vector int nwords,l; nwords=line1.size(); if (constant.compare("re")==0) { - re = strtod(line1[0].c_str(),NULL); + re = strtod(line1[0].c_str(),nullptr); } else if (constant.compare("rc")==0) { - rc = strtod(line1[0].c_str(),NULL); + rc = strtod(line1[0].c_str(),nullptr); } else if (constant.compare("alphak")==0) { delete[] alpha_k; alpha_k = new double[nwords]; for (l=0;lerrorf(FLERR,"Undefined value for bond power"); if (re!=0.0 && rc!=0.0 && alpha_k[0]!=-1 && dr!=0.0 && mlength!=0 && kmax!=0)return true; diff --git a/src/ML-RANN/rann_fingerprint_bondspin.cpp b/src/ML-RANN/rann_fingerprint_bondspin.cpp index 77749fa3c7..76c4c016ac 100644 --- a/src/ML-RANN/rann_fingerprint_bondspin.cpp +++ b/src/ML-RANN/rann_fingerprint_bondspin.cpp @@ -78,26 +78,26 @@ bool Fingerprint_bondspin::parse_values(std::string constant,std::vectorerrorf(FLERR,"Undefined value for bond power"); if (re!=0.0 && rc!=0.0 && alpha_k[0]!=-1 && dr!=0.0 && mlength!=0 && kmax!=0)return true; diff --git a/src/ML-RANN/rann_fingerprint_radial.cpp b/src/ML-RANN/rann_fingerprint_radial.cpp index 29eeb07a65..f5b381f1f1 100644 --- a/src/ML-RANN/rann_fingerprint_radial.cpp +++ b/src/ML-RANN/rann_fingerprint_radial.cpp @@ -67,30 +67,30 @@ bool Fingerprint_radial::parse_values(std::string constant,std::vectorerrorf(FLERR,"Undefined value for radial power"); //code will run with default o=0 if o is never specified. All other values must be defined in potential file. - if (re!=0 && rc!=0 && alpha!=0 && dr!=0 && nmax!=0)return true; + if (re!=0 && rc!=0 && alpha!=nullptr && dr!=0 && nmax!=0)return true; return false; } diff --git a/src/ML-RANN/rann_fingerprint_radialscreened.cpp b/src/ML-RANN/rann_fingerprint_radialscreened.cpp index 9ac98d183c..b8af308389 100644 --- a/src/ML-RANN/rann_fingerprint_radialscreened.cpp +++ b/src/ML-RANN/rann_fingerprint_radialscreened.cpp @@ -68,30 +68,30 @@ bool Fingerprint_radialscreened::parse_values(std::string constant,std::vectorerrorf(FLERR,"Undefined value for radial power"); //code will run with default o=0 if o is never specified. All other values must be defined in potential file. - if (re!=0 && rc!=0 && alpha!=0 && dr!=0 && nmax!=0)return true; + if (re!=0 && rc!=0 && alpha!=nullptr && dr!=0 && nmax!=0)return true; return false; } diff --git a/src/ML-RANN/rann_fingerprint_radialscreenedspin.cpp b/src/ML-RANN/rann_fingerprint_radialscreenedspin.cpp index 3caeaa84da..de28610c8b 100644 --- a/src/ML-RANN/rann_fingerprint_radialscreenedspin.cpp +++ b/src/ML-RANN/rann_fingerprint_radialscreenedspin.cpp @@ -69,30 +69,30 @@ bool Fingerprint_radialscreenedspin::parse_values(std::string constant,std::vect int l; int nwords=line1.size(); if (constant.compare("re")==0) { - re = strtod(line1[0].c_str(),NULL); + re = strtod(line1[0].c_str(),nullptr); } else if (constant.compare("rc")==0) { - rc = strtod(line1[0].c_str(),NULL); + rc = strtod(line1[0].c_str(),nullptr); } else if (constant.compare("alpha")==0) { delete[] alpha; alpha = new double[nwords]; for (l=0;lerrorf(FLERR,"Undefined value for radial power"); //code will run with default o=0 if o is never specified. All other values must be defined in potential file. - if (re!=0 && rc!=0 && alpha!=0 && dr!=0 && nmax!=0)return true; + if (re!=0 && rc!=0 && alpha!=nullptr && dr!=0 && nmax!=0)return true; return false; } diff --git a/src/ML-RANN/rann_fingerprint_radialspin.cpp b/src/ML-RANN/rann_fingerprint_radialspin.cpp index b48fad80d0..e7a4ef449e 100644 --- a/src/ML-RANN/rann_fingerprint_radialspin.cpp +++ b/src/ML-RANN/rann_fingerprint_radialspin.cpp @@ -68,30 +68,30 @@ bool Fingerprint_radialspin::parse_values(std::string constant,std::vectorerrorf(FLERR,"Undefined value for radial power"); //code will run with default o=0 if o is never specified. All other values must be defined in potential file. - if (re!=0 && rc!=0 && alpha!=0 && dr!=0 && nmax!=0)return true; + if (re!=0 && rc!=0 && alpha!=nullptr && dr!=0 && nmax!=0)return true; return false; } diff --git a/src/ML-SNAP/pair_snap.cpp b/src/ML-SNAP/pair_snap.cpp index d7cd953615..1eb078bc61 100644 --- a/src/ML-SNAP/pair_snap.cpp +++ b/src/ML-SNAP/pair_snap.cpp @@ -500,8 +500,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) nelemtmp = words.next_int(); ncoeffall = words.next_int(); } catch (TokenizerException &e) { - error->all(FLERR,"Incorrect format in SNAP coefficient " - "file: {}", e.what()); + error->all(FLERR,"Incorrect format in SNAP coefficient file: {}", e.what()); } // clean out old arrays and set up element lists @@ -538,7 +537,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) std::vector words; try { words = Tokenizer(utils::trim_comment(line),"\"' \t\n\r\f").as_vector(); - } catch (TokenizerException &e) { + } catch (TokenizerException &) { // ignore } if (words.size() != 3) @@ -599,8 +598,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) coeffelem[jelem][icoeff] = coeff.next_double(); } catch (TokenizerException &e) { - error->all(FLERR,"Incorrect format in SNAP coefficient " - "file: {}", e.what()); + error->all(FLERR,"Incorrect format in SNAP coefficient file: {}", e.what()); } } } @@ -609,8 +607,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) for (int jelem = 0; jelem < nelements; jelem++) { if (elementflags[jelem] == 0) - error->all(FLERR,"Element {} not found in SNAP coefficient " - "file", elements[jelem]); + error->all(FLERR,"Element {} not found in SNAP coefficient file", elements[jelem]); } delete[] elementflags; @@ -643,7 +640,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) } eof = 0; - while (1) { + while (true) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fpparam); if (ptr == nullptr) { @@ -660,7 +657,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) std::vector words; try { words = Tokenizer(utils::trim_comment(line),"\"' \t\n\r\f").as_vector(); - } catch (TokenizerException &e) { + } catch (TokenizerException &) { // ignore } diff --git a/src/MOLECULE/angle_table.cpp b/src/MOLECULE/angle_table.cpp index 4299e375f1..a5ba07b779 100644 --- a/src/MOLECULE/angle_table.cpp +++ b/src/MOLECULE/angle_table.cpp @@ -412,7 +412,7 @@ void AngleTable::read_table(Table *tb, char *file, char *keyword) tb->afile[i] = values.next_double(); tb->efile[i] = values.next_double(); tb->ffile[i] = values.next_double(); - } catch (TokenizerException &e) { + } catch (TokenizerException &) { ++cerror; } } diff --git a/src/MOLECULE/bond_table.cpp b/src/MOLECULE/bond_table.cpp index 5637dfa699..db1314c76f 100644 --- a/src/MOLECULE/bond_table.cpp +++ b/src/MOLECULE/bond_table.cpp @@ -340,7 +340,7 @@ void BondTable::read_table(Table *tb, char *file, char *keyword) tb->rfile[i] = values.next_double(); tb->efile[i] = values.next_double(); tb->ffile[i] = values.next_double(); - } catch (TokenizerException &e) { + } catch (TokenizerException &) { ++cerror; } diff --git a/src/MOLECULE/dihedral_table.cpp b/src/MOLECULE/dihedral_table.cpp index c701c4564f..a91324dd98 100644 --- a/src/MOLECULE/dihedral_table.cpp +++ b/src/MOLECULE/dihedral_table.cpp @@ -86,7 +86,7 @@ static int solve_cyc_tridiag( const double diag[], size_t d_stride, double * c = (double *) malloc (N * sizeof (double)); double * z = (double *) malloc (N * sizeof (double)); - if (delta == 0 || gamma == 0 || alpha == 0 || c == 0 || z == 0) { + if (delta == nullptr || gamma == nullptr || alpha == nullptr || c == nullptr || z == nullptr) { if (warn) fprintf(stderr,"Internal Cyclic Spline Error: failed to allocate working space\n"); diff --git a/src/MOLFILE/dump_molfile.cpp b/src/MOLFILE/dump_molfile.cpp index 052fb444a4..35e87f94af 100644 --- a/src/MOLFILE/dump_molfile.cpp +++ b/src/MOLFILE/dump_molfile.cpp @@ -26,8 +26,8 @@ #include "memory.h" #include "update.h" -#include #include +#include #include "molfile_interface.h" @@ -131,9 +131,9 @@ DumpMolfile::~DumpMolfile() if (typenames) { for (int i = 1; i <= ntypes; i++) - delete [] typenames[i]; + delete[] typenames[i]; - delete [] typenames; + delete[] typenames; typenames = nullptr; } } @@ -152,8 +152,7 @@ void DumpMolfile::init_style() typenames = new char*[ntypes+1]; for (int itype = 1; itype <= ntypes; itype++) { /* a 32-bit int can be maximally 10 digits plus sign */ - typenames[itype] = new char[12]; - sprintf(typenames[itype],"%d",itype); + typenames[itype] = utils::strdup(std::to_string(itype)); } } @@ -207,6 +206,7 @@ void DumpMolfile::write() } } ntotal = 0; + reorderflag = 0; // if file per timestep, open new file @@ -430,9 +430,9 @@ int DumpMolfile::modify_param(int narg, char **arg) if (typenames) { for (int i = 1; i <= ntypes; i++) - delete [] typenames[i]; + delete[] typenames[i]; - delete [] typenames; + delete[] typenames; typenames = nullptr; } diff --git a/src/MOLFILE/molfile_interface.cpp b/src/MOLFILE/molfile_interface.cpp index 8e1174d8f4..9ce3822082 100644 --- a/src/MOLFILE/molfile_interface.cpp +++ b/src/MOLFILE/molfile_interface.cpp @@ -17,20 +17,16 @@ ------------------------------------------------------------------------- */ #include "molfile_interface.h" + +#include "platform.h" +#include "tokenizer.h" +#include "utils.h" + #include "molfile_plugin.h" #include #include #include -#include -#include // for strcasecmp() - -#if defined(_WIN32) -#include -#else -#include -#include -#endif #if vmdplugin_ABIVERSION < 16 #error "unsupported VMD molfile plugin ABI version" @@ -39,9 +35,9 @@ #define DEBUG 0 extern "C" { - typedef int (*initfunc)(void); + typedef int (*initfunc)(); typedef int (*regfunc)(void *, vmdplugin_register_cb); - typedef int (*finifunc)(void); + typedef int (*finifunc)(); typedef struct { void *p; @@ -199,172 +195,17 @@ extern "C" { return 0; } - // directory traversal helper functions - -#if defined(_WIN32) - - // Win32 directory traversal handle - typedef struct { - HANDLE h; - WIN32_FIND_DATA fd; - char *name; - char *searchname; - int dlen; - } dirhandle_t; - - // open a directory handle - static dirhandle_t *my_opendir(const char *dirname) - { - dirhandle_t *d; - int len; - - if (dirname == nullptr) - return nullptr; - d = new dirhandle_t; - - len = 2 + strlen(dirname); - d->name = new char[len]; - strcpy(d->name, dirname); - strcat(d->name, "\\"); - d->dlen = len; - - len += 1; - d->searchname = new char[len]; - strcpy(d->searchname, dirname); - strcat(d->searchname, "\\*"); - - d->h = FindFirstFile(d->searchname, &(d->fd)); - if (d->h == ((HANDLE)(-1))) { - delete[] d->searchname; - delete[] d->name; - delete d; - return nullptr; - } - return d; - } - - // get next file name from directory handle - static char *my_readdir(dirhandle_t *d) - { - if (FindNextFile(d->h, &(d->fd))) { - return d->fd.cFileName; - } - return nullptr; - } - - // close directory handle - static void my_closedir(dirhandle_t *d) - { - if (d->h != nullptr) { - FindClose(d->h); - } - delete[] d->searchname; - delete[] d->name; - delete d; - } - - // open a shared object file - static void *my_dlopen(const char *fname) { - return (void *)LoadLibrary(fname); - } - - // resolve a symbol in shared object - static void *my_dlsym(void *h, const char *sym) { - return (void *)GetProcAddress((HINSTANCE)h, sym); - } - - // close a shared object - static int my_dlclose(void *h) { - /* FreeLibrary returns nonzero on success */ - return !FreeLibrary((HINSTANCE)h); - } - -#else - - // Unix directory traversal handle - typedef struct { - DIR *d; - char *name; - int dlen; - } dirhandle_t; - - // open a directory handle - static dirhandle_t *my_opendir(const char *dirname) - { - dirhandle_t *d; - int len; - - if (dirname == nullptr) return nullptr; - - d = new dirhandle_t; - len = 2 + strlen(dirname); - d->name = new char[len]; - strcpy(d->name,dirname); - strcat(d->name,"/"); - d->dlen = len; - - d->d = opendir(d->name); - if (d->d == nullptr) { - delete[] d->name; - delete d; - return nullptr; - } - return d; - } - - // get next file name from directory handle - static char *my_readdir(dirhandle_t *d) - { - struct dirent *p; - - if ((p = readdir(d->d)) != nullptr) { - return p->d_name; - } - - return nullptr; - } - - // close directory handle - static void my_closedir(dirhandle_t *d) - { - if (d->d != nullptr) { - closedir(d->d); - } - delete[] d->name; - delete d; - return; - } - - // open a shared object file - static void *my_dlopen(const char *fname) { - return dlopen(fname, RTLD_NOW); - } - - // resolve a symbol in shared object - static void *my_dlsym(void *h, const char *sym) { - return dlsym(h, sym); - } - - // close a shared object - static int my_dlclose(void *h) { - return dlclose(h); - } - -#endif - } // end of extern "C" region using namespace LAMMPS_NS; // constructor. MolfileInterface::MolfileInterface(const char *type, const int mode) - : _plugin(0), _dso(0), _ptr(0), _info(0), _natoms(0), - _mode(mode), _caps(M_NONE) + : _plugin(nullptr), _dso(nullptr), _ptr(nullptr), _info(nullptr), _natoms(0), + _mode(mode), _caps(M_NONE), _props(0) { - _name = new char[5]; - strcpy(_name,"none"); - _type = new char[1+strlen(type)]; - strcpy(_type,type); + _name = utils::strdup("none"); + _type = utils::strdup(type); } // destructor. @@ -384,62 +225,21 @@ MolfileInterface::~MolfileInterface() // register the best matching plugin in a given directory int MolfileInterface::find_plugin(const char *pluginpath) { - dirhandle_t *dir; - char *filename, *ext, *next, *path, *plugindir; int retval = E_NONE; -#if defined(_WIN32) -#define MY_PATHSEP ';' -#else -#define MY_PATHSEP ':' -#endif if (pluginpath == nullptr) return E_DIR; - plugindir = path = strdup(pluginpath); - while (plugindir) { - // check if this a single directory or path. - next = strchr(plugindir,MY_PATHSEP); - if (next) { - *next = '\0'; - ++next; + // search for suitable file names in provided path and try to inspect them + // only look at .so files, since this is what VMD uses on all platforms + + for (const auto &dir : Tokenizer(pluginpath,":").as_vector()) { + for (const auto &filename : platform::list_directory(dir)) { + if (utils::strmatch(filename,"\\.so$")) { + int rv = load_plugin(platform::path_join(dir,filename).c_str()); + if (rv > retval) retval = rv; + } } - - dir = my_opendir(plugindir); - if (!dir) - retval = (retval > E_DIR) ? retval : E_DIR; - - // search for suitable file names and try to inspect them - while (dir) { - char *fullname; - int len; - - filename = my_readdir(dir); - if (filename == nullptr) break; - - // only look at .so files - ext = strrchr(filename, '.'); - if (ext == nullptr) continue; - if (strcasecmp(ext,".so") != 0) continue; - - // construct full pathname of potential DSO - len = dir->dlen; - len += strlen(filename); - fullname = new char[len]; - strcpy(fullname,dir->name); - strcat(fullname,filename); - - // try to register plugin at file name. - int rv = load_plugin(fullname); - if (rv > retval) retval = rv; - - delete[] fullname; - } - if (dir) - my_closedir(dir); - - plugindir = next; } - free(path); return retval; } @@ -447,25 +247,25 @@ int MolfileInterface::find_plugin(const char *pluginpath) int MolfileInterface::load_plugin(const char *filename) { void *dso; - int len, retval = E_NONE; + int retval = E_NONE; // access shared object - dso = my_dlopen(filename); + dso = platform::dlopen(filename); if (dso == nullptr) return E_FILE; // check for required plugin symbols - void *ifunc = my_dlsym(dso,"vmdplugin_init"); - void *rfunc = my_dlsym(dso,"vmdplugin_register"); - void *ffunc = my_dlsym(dso,"vmdplugin_fini"); + void *ifunc = platform::dlsym(dso,"vmdplugin_init"); + void *rfunc = platform::dlsym(dso,"vmdplugin_register"); + void *ffunc = platform::dlsym(dso,"vmdplugin_fini"); if (ifunc == nullptr || rfunc == nullptr || ffunc == nullptr) { - my_dlclose(dso); + platform::dlclose(dso); return E_SYMBOL; } // initialize plugin. skip plugin if it fails. if (((initfunc)(ifunc))()) { - my_dlclose(dso); + platform::dlclose(dso); return E_SYMBOL; } @@ -528,12 +328,8 @@ int MolfileInterface::load_plugin(const char *filename) forget_plugin(); delete[] _name; - len = 16; - len += strlen(plugin->prettyname); - len += strlen(plugin->author); - _name = new char[len]; - sprintf(_name,"%s v%d.%d by %s",plugin->prettyname, - plugin->majorv, plugin->minorv, plugin->author); + _name = utils::strdup(fmt::format("{} v{}.{} by {}", plugin->prettyname, + plugin->majorv, plugin->minorv, plugin->author)); // determine plugin capabilities _caps = M_NONE; @@ -569,7 +365,7 @@ int MolfileInterface::load_plugin(const char *filename) } // better luck next time. clean up and return. - my_dlclose(dso); + platform::dlclose(dso); return retval; } @@ -583,10 +379,10 @@ void MolfileInterface::forget_plugin() _plugin = nullptr; if (_dso) { - void *ffunc = my_dlsym(_dso,"vmdplugin_fini"); + void *ffunc = platform::dlsym(_dso,"vmdplugin_fini"); if (ffunc) ((finifunc)ffunc)(); - my_dlclose(_dso); + platform::dlclose(_dso); } _dso = nullptr; diff --git a/src/MOLFILE/molfile_interface.h b/src/MOLFILE/molfile_interface.h index 4be74d5cbe..151618286b 100644 --- a/src/MOLFILE/molfile_interface.h +++ b/src/MOLFILE/molfile_interface.h @@ -113,7 +113,7 @@ class MolfileInterface { // inquire on interface status // true if file stream is active. - bool is_open() const { return (_ptr != 0); }; + bool is_open() const { return (_ptr != nullptr); }; // true if file format requires or provides atom properties bool has_props() const { return (_mode & (M_RSTRUCT | M_WSTRUCT)) != 0; }; // true if file format can read or write velocities diff --git a/src/MOLFILE/reader_molfile.cpp b/src/MOLFILE/reader_molfile.cpp index e04b615018..5f75ae50f5 100644 --- a/src/MOLFILE/reader_molfile.cpp +++ b/src/MOLFILE/reader_molfile.cpp @@ -85,13 +85,7 @@ void ReaderMolfile::settings(int narg, char **arg) if (mf->find_plugin(path)!= MFI::E_MATCH) error->one(FLERR,"No suitable molfile plugin found"); - if (screen) - fprintf(screen,"Dump reader uses molfile plugin: %s\n", - mf->get_plugin_name()); - - if (logfile) - fprintf(logfile,"Dump reader uses molfile plugin: %s\n", - mf->get_plugin_name()); + utils::logmesg(lmp,"Dump reader uses molfile plugin: {}\n", mf->get_plugin_name()); } } @@ -100,30 +94,22 @@ void ReaderMolfile::settings(int narg, char **arg) only called by proc 0 ------------------------------------------------------------------------- */ -void ReaderMolfile::open_file(const char *file) +void ReaderMolfile::open_file(const std::string &file) { int rv; - char str[1024]; // close open file, if needed. if (mf->is_open()) mf->close(); - rv = mf->open(file,&natoms); + rv = mf->open(file.c_str(),&natoms); - if (rv != MFI::E_NONE) { - snprintf(str,1024,"Cannot open file %s",file); - error->one(FLERR,str); - } + if (rv != MFI::E_NONE) error->one(FLERR,"Cannot open file {}", file); - if (natoms < 1) { - snprintf(str,1024,"No atoms in file %s",file); - error->one(FLERR,str); - } + if (natoms < 1) error->one(FLERR,"No atoms in file {}", file); memory->create(types,natoms,"reader:types"); memory->create(coords,3*natoms,"reader:coords"); - if (mf->has_vels()) - memory->create(vels,3*natoms,"reader:vels"); + if (mf->has_vels()) memory->create(vels,3*natoms,"reader:vels"); // initialize system properties, if available if (mf->has_props()) { diff --git a/src/MOLFILE/reader_molfile.h b/src/MOLFILE/reader_molfile.h index 1f7fead9c0..4330eaf4eb 100644 --- a/src/MOLFILE/reader_molfile.h +++ b/src/MOLFILE/reader_molfile.h @@ -39,7 +39,7 @@ class ReaderMolfile : public Reader { int &, int &, int &); virtual void read_atoms(int, int, double **); - virtual void open_file(const char *); + virtual void open_file(const std::string &); virtual void close_file(); private: diff --git a/src/Makefile b/src/Makefile index 7f02c1e84b..2d651c4986 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,6 +2,7 @@ SHELL = /bin/bash PYTHON = python +DYN_LIB = -ldl #.IGNORE: @@ -400,14 +401,14 @@ ifeq ($(mode),static) @cd $(objdir); \ $(MAKE) $(MFLAGS) "OBJ = $(OBJLIB)" "INC = $(INC)" "SHFLAGS =" \ "LMPLIB = $(ARLIB)" "ARLIB = $(ARLIB)" "SHLIB = $(SHLIB)" \ - "LMPLINK = $(LMPLINK)" "EXE = ../$(EXE)" ../$(EXE) + "LMPLINK = $(LMPLINK)" "DYN_LIB = $(DYN_LIB)" "EXE = ../$(EXE)" ../$(EXE) @ln -s $(ARLIB) $(ARLINK) endif ifeq ($(mode),shared) @cd $(objdir); \ $(MAKE) $(MFLAGS) "OBJ = $(OBJLIB)" "INC = $(INC)" \ "LMPLIB = $(SHLIB)" "ARLIB = $(ARLIB)" "SHLIB = $(SHLIB)" \ - "LMPLINK = $(LMPLINK)" "EXE = ../$(EXE)" ../$(EXE) + "LMPLINK = $(LMPLINK)" "DYN_LIB = $(DYN_LIB)" "EXE = ../$(EXE)" ../$(EXE) @ln -s $(SHLIB) $(SHLINK) endif # backward compatibility diff --git a/src/NETCDF/dump_netcdf.cpp b/src/NETCDF/dump_netcdf.cpp index 5702c94499..5f30c941ca 100644 --- a/src/NETCDF/dump_netcdf.cpp +++ b/src/NETCDF/dump_netcdf.cpp @@ -274,7 +274,7 @@ void DumpNetCDF::openfile() if (append_flag && !multifile) { // Fixme! Perform checks if dimensions and variables conform with // data structure standard. - if (not utils::file_is_readable(filecurrent)) + if (!platform::file_is_readable(filecurrent)) error->all(FLERR, "cannot append to non-existent file {}",filecurrent); if (singlefile_opened) return; diff --git a/src/NETCDF/dump_netcdf_mpiio.cpp b/src/NETCDF/dump_netcdf_mpiio.cpp index a6c3c535c9..0a76203f96 100644 --- a/src/NETCDF/dump_netcdf_mpiio.cpp +++ b/src/NETCDF/dump_netcdf_mpiio.cpp @@ -272,7 +272,7 @@ void DumpNetCDFMPIIO::openfile() if (append_flag && !multifile) { // Fixme! Perform checks if dimensions and variables conform with // data structure standard. - if (not utils::file_is_readable(filecurrent)) + if (!platform::file_is_readable(filecurrent)) error->all(FLERR, "cannot append to non-existent file {}", filecurrent); MPI_Offset index[NC_MAX_VAR_DIMS], count[NC_MAX_VAR_DIMS]; diff --git a/src/OPENMP/fix_qeq_reaxff_omp.cpp b/src/OPENMP/fix_qeq_reaxff_omp.cpp index 89b75bfe7a..0b0ba589cf 100644 --- a/src/OPENMP/fix_qeq_reaxff_omp.cpp +++ b/src/OPENMP/fix_qeq_reaxff_omp.cpp @@ -232,12 +232,15 @@ void FixQEqReaxFFOMP::compute_H() void FixQEqReaxFFOMP::init_storage() { + if (efield) get_chi_field(); + #if defined(_OPENMP) #pragma omp parallel for schedule(static) #endif for (int i = 0; i < NN; i++) { Hdia_inv[i] = 1. / eta[atom->type[i]]; b_s[i] = -chi[atom->type[i]]; + if (efield) b_s[i] -= chi_field[i]; b_t[i] = -1.0; b_prc[i] = 0; b_prm[i] = 0; @@ -274,6 +277,8 @@ void FixQEqReaxFFOMP::pre_force(int /* vflag */) if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) reallocate_matrix(); + if (efield) get_chi_field(); + init_matvec(); if (dual_enabled) { @@ -310,6 +315,7 @@ void FixQEqReaxFFOMP::init_matvec() /* init pre-conditioner for H and init solution vectors */ Hdia_inv[i] = 1. / eta[atom->type[i]]; b_s[i] = -chi[atom->type[i]]; + if (efield) b_s[i] -= chi_field[i]; b_t[i] = -1.0; // Predictor Step @@ -338,6 +344,7 @@ void FixQEqReaxFFOMP::init_matvec() /* init pre-conditioner for H and init solution vectors */ Hdia_inv[i] = 1. / eta[atom->type[i]]; b_s[i] = -chi[atom->type[i]]; + if (efield) b_s[i] -= chi_field[i]; b_t[i] = -1.0; /* linear extrapolation for s & t from previous solutions */ diff --git a/src/OPENMP/npair_half_size_multi_newton_omp.cpp b/src/OPENMP/npair_half_size_multi_newton_omp.cpp index cdc68e1b42..bcf87d385c 100644 --- a/src/OPENMP/npair_half_size_multi_newton_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_newton_omp.cpp @@ -108,7 +108,7 @@ void NPairHalfSizeMultiNewtonOmp::build(NeighList *list) // if j is ghost, only store if j coords are "above and to the right" of i for (j = js; j >= 0; j = bins[j]) { - if(icollection != jcollection and j < i) continue; + if(icollection != jcollection && j < i) continue; if (j >= nlocal) { if (x[j][2] < ztmp) continue; diff --git a/src/OPENMP/pair_buck_long_coul_long_omp.cpp b/src/OPENMP/pair_buck_long_coul_long_omp.cpp index 4fd746b9a4..372c993a8d 100644 --- a/src/OPENMP/pair_buck_long_coul_long_omp.cpp +++ b/src/OPENMP/pair_buck_long_coul_long_omp.cpp @@ -332,7 +332,7 @@ void PairBuckLongCoulLongOMP::compute_inner() loop_setup_thr(ifrom, ito, tid, inum, nthreads); ThrData *thr = fix->get_thr(tid); thr->timer(Timer::START); - ev_setup_thr(0, 0, nall, 0, 0, nullptr, thr); + ev_setup_thr(0, 0, nall, nullptr, nullptr, nullptr, thr); eval_inner(ifrom, ito, thr); thr->timer(Timer::PAIR); @@ -357,7 +357,7 @@ void PairBuckLongCoulLongOMP::compute_middle() loop_setup_thr(ifrom, ito, tid, inum, nthreads); ThrData *thr = fix->get_thr(tid); thr->timer(Timer::START); - ev_setup_thr(0, 0, nall, 0, 0, nullptr, thr); + ev_setup_thr(0, 0, nall, nullptr, nullptr, nullptr, thr); eval_middle(ifrom, ito, thr); thr->timer(Timer::PAIR); @@ -810,7 +810,7 @@ void PairBuckLongCoulLongOMP::eval_inner(int iifrom, int iito, ThrData * const t const double qqrd2e = force->qqrd2e; const double *x0 = x[0]; - double *f0 = f[0], *fi = 0; + double *f0 = f[0], *fi = nullptr; int *ilist = list->ilist_inner; @@ -903,7 +903,7 @@ void PairBuckLongCoulLongOMP::eval_middle(int iifrom, int iito, ThrData * const const double qqrd2e = force->qqrd2e; const double *x0 = x[0]; - double *f0 = f[0], *fi = 0; + double *f0 = f[0], *fi = nullptr; int *ilist = list->ilist_middle; diff --git a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp index 43e2fb15e4..6d013c5f7c 100644 --- a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp +++ b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp @@ -41,10 +41,6 @@ PairLJCutCoulCutDielectricOMP::PairLJCutCoulCutDielectricOMP(LAMMPS *lmp) : /* ---------------------------------------------------------------------- */ -PairLJCutCoulCutDielectricOMP::~PairLJCutCoulCutDielectricOMP() {} - -/* ---------------------------------------------------------------------- */ - void PairLJCutCoulCutDielectricOMP::compute(int eflag, int vflag) { ev_init(eflag, vflag); diff --git a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h index 093d0a8a42..5f28aa4d17 100644 --- a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h +++ b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h @@ -28,7 +28,7 @@ namespace LAMMPS_NS { class PairLJCutCoulCutDielectricOMP : public PairLJCutCoulCutDielectric, public ThrOMP { public: PairLJCutCoulCutDielectricOMP(class LAMMPS *); - virtual ~PairLJCutCoulCutDielectricOMP(); + virtual ~PairLJCutCoulCutDielectricOMP() = default; virtual void compute(int, int); protected: diff --git a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.cpp b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.cpp index 6aa79e18a5..c076501d68 100644 --- a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.cpp +++ b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.cpp @@ -47,10 +47,6 @@ PairLJCutCoulLongDielectricOMP::PairLJCutCoulLongDielectricOMP(LAMMPS *lmp) : /* ---------------------------------------------------------------------- */ -PairLJCutCoulLongDielectricOMP::~PairLJCutCoulLongDielectricOMP() {} - -/* ---------------------------------------------------------------------- */ - void PairLJCutCoulLongDielectricOMP::compute(int eflag, int vflag) { ev_init(eflag, vflag); diff --git a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h index 0d13c4a92e..f70809524f 100644 --- a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h +++ b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h @@ -29,7 +29,7 @@ class PairLJCutCoulLongDielectricOMP : public PairLJCutCoulLongDielectric, publi public: PairLJCutCoulLongDielectricOMP(class LAMMPS *); - virtual ~PairLJCutCoulLongDielectricOMP(); + virtual ~PairLJCutCoulLongDielectricOMP() = default; virtual void compute(int, int); protected: diff --git a/src/OPENMP/pair_lj_long_coul_long_omp.cpp b/src/OPENMP/pair_lj_long_coul_long_omp.cpp index a2758c545c..e0707a87e0 100644 --- a/src/OPENMP/pair_lj_long_coul_long_omp.cpp +++ b/src/OPENMP/pair_lj_long_coul_long_omp.cpp @@ -331,7 +331,7 @@ void PairLJLongCoulLongOMP::compute_inner() loop_setup_thr(ifrom, ito, tid, inum, nthreads); ThrData *thr = fix->get_thr(tid); thr->timer(Timer::START); - ev_setup_thr(0, 0, nall, 0, 0, nullptr, thr); + ev_setup_thr(0, 0, nall, nullptr, nullptr, nullptr, thr); eval_inner(ifrom, ito, thr); thr->timer(Timer::PAIR); @@ -356,7 +356,7 @@ void PairLJLongCoulLongOMP::compute_middle() loop_setup_thr(ifrom, ito, tid, inum, nthreads); ThrData *thr = fix->get_thr(tid); thr->timer(Timer::START); - ev_setup_thr(0, 0, nall, 0, 0, nullptr, thr); + ev_setup_thr(0, 0, nall, nullptr, nullptr, nullptr, thr); eval_middle(ifrom, ito, thr); thr->timer(Timer::PAIR); @@ -805,7 +805,7 @@ void PairLJLongCoulLongOMP::eval_inner(int iifrom, int iito, ThrData * const thr const double qqrd2e = force->qqrd2e; const double *x0 = x[0]; - double *f0 = f[0], *fi = 0; + double *f0 = f[0], *fi = nullptr; int *ilist = list->ilist_inner; @@ -896,7 +896,7 @@ void PairLJLongCoulLongOMP::eval_middle(int iifrom, int iito, ThrData * const th const double qqrd2e = force->qqrd2e; const double *x0 = x[0]; - double *f0 = f[0], *fi = 0; + double *f0 = f[0], *fi = nullptr; int *ilist = list->ilist_middle; diff --git a/src/OPENMP/pair_lubricate_omp.cpp b/src/OPENMP/pair_lubricate_omp.cpp index 0233ea5a06..f2df1b3ee8 100644 --- a/src/OPENMP/pair_lubricate_omp.cpp +++ b/src/OPENMP/pair_lubricate_omp.cpp @@ -47,11 +47,6 @@ PairLubricateOMP::PairLubricateOMP(LAMMPS *lmp) : /* ---------------------------------------------------------------------- */ -PairLubricateOMP::~PairLubricateOMP() -{} - -/* ---------------------------------------------------------------------- */ - void PairLubricateOMP::compute(int eflag, int vflag) { ev_init(eflag,vflag); diff --git a/src/OPENMP/pair_lubricate_omp.h b/src/OPENMP/pair_lubricate_omp.h index 27dbe73dd8..1f5fc340bb 100644 --- a/src/OPENMP/pair_lubricate_omp.h +++ b/src/OPENMP/pair_lubricate_omp.h @@ -33,7 +33,7 @@ class PairLubricateOMP : public PairLubricate, public ThrOMP { public: PairLubricateOMP(class LAMMPS *); - virtual ~PairLubricateOMP(); + virtual ~PairLubricateOMP() = default; virtual void compute(int, int); virtual double memory_usage(); diff --git a/src/OPENMP/pair_lubricate_poly_omp.cpp b/src/OPENMP/pair_lubricate_poly_omp.cpp index d3ad6b926c..669b964c73 100644 --- a/src/OPENMP/pair_lubricate_poly_omp.cpp +++ b/src/OPENMP/pair_lubricate_poly_omp.cpp @@ -47,11 +47,6 @@ PairLubricatePolyOMP::PairLubricatePolyOMP(LAMMPS *lmp) : /* ---------------------------------------------------------------------- */ -PairLubricatePolyOMP::~PairLubricatePolyOMP() -{} - -/* ---------------------------------------------------------------------- */ - void PairLubricatePolyOMP::compute(int eflag, int vflag) { ev_init(eflag,vflag); diff --git a/src/OPENMP/pair_lubricate_poly_omp.h b/src/OPENMP/pair_lubricate_poly_omp.h index 7fdfed6c62..5a36d232b8 100644 --- a/src/OPENMP/pair_lubricate_poly_omp.h +++ b/src/OPENMP/pair_lubricate_poly_omp.h @@ -33,7 +33,7 @@ class PairLubricatePolyOMP : public PairLubricatePoly, public ThrOMP { public: PairLubricatePolyOMP(class LAMMPS *); - virtual ~PairLubricatePolyOMP(); + virtual ~PairLubricatePolyOMP() = default; virtual void compute(int, int); virtual double memory_usage(); diff --git a/src/OPENMP/pair_reaxff_omp.cpp b/src/OPENMP/pair_reaxff_omp.cpp index 6cf3e90575..d39672f09b 100644 --- a/src/OPENMP/pair_reaxff_omp.cpp +++ b/src/OPENMP/pair_reaxff_omp.cpp @@ -101,13 +101,17 @@ PairReaxFFOMP::~PairReaxFFOMP() void PairReaxFFOMP::init_style() { - if (!atom->q_flag) - error->all(FLERR,"Pair style reaxff/omp requires atom attribute q"); - bool have_qeq = ((modify->find_fix_by_style("^qeq/reax") != -1) - || (modify->find_fix_by_style("^qeq/shielded") != -1)); + || (modify->find_fix_by_style("^qeq/shielded") != -1) + || (modify->find_fix_by_style("^acks2/reax") != -1)); if (!have_qeq && qeqflag == 1) - error->all(FLERR,"Pair reaxff/omp requires use of fix qeq/reaxff or qeq/shielded"); + error->all(FLERR,"Pair reaxff/omp requires use of fix qeq/reaxff or qeq/shielded" + " or fix acks2/reaxff"); + + int have_acks2 = (modify->find_fix_by_style("^acks2/reax") != -1); + api->system->acks2_flag = have_acks2; + if (api->system->acks2_flag) + error->all(FLERR,"Cannot (yet) use ACKS2 with OPENMP ReaxFF"); api->system->n = atom->nlocal; // my atoms api->system->N = atom->nlocal + atom->nghost; // mine + ghosts diff --git a/src/OPENMP/pair_tersoff_table_omp.cpp b/src/OPENMP/pair_tersoff_table_omp.cpp index 5367a3d043..94f9e72c3d 100644 --- a/src/OPENMP/pair_tersoff_table_omp.cpp +++ b/src/OPENMP/pair_tersoff_table_omp.cpp @@ -502,7 +502,7 @@ void PairTersoffTableOMP::eval(int iifrom, int iito, ThrData * const thr) } // loop on I } -void PairTersoffTableOMP::deallocatePreLoops(void) +void PairTersoffTableOMP::deallocatePreLoops() { memory->destroy(thrGtetaFunction); memory->destroy(thrGtetaFunctionDerived); @@ -510,7 +510,7 @@ void PairTersoffTableOMP::deallocatePreLoops(void) memory->destroy(thrCutoffFunctionDerived); } -void PairTersoffTableOMP::allocatePreLoops(void) +void PairTersoffTableOMP::allocatePreLoops() { const int nthreads = comm->nthreads; memory->create(thrGtetaFunction,nthreads,leadingDimensionInteractionList,leadingDimensionInteractionList,"tersofftable:thrGtetaFunction"); diff --git a/src/OPENMP/pair_tersoff_table_omp.h b/src/OPENMP/pair_tersoff_table_omp.h index ce5260f77f..c686087f11 100644 --- a/src/OPENMP/pair_tersoff_table_omp.h +++ b/src/OPENMP/pair_tersoff_table_omp.h @@ -37,8 +37,8 @@ class PairTersoffTableOMP : public PairTersoffTable, public ThrOMP { double ***thrGtetaFunction, ***thrGtetaFunctionDerived; double **thrCutoffFunction, **thrCutoffFunctionDerived; - void allocatePreLoops(void); - void deallocatePreLoops(void); + void allocatePreLoops(); + void deallocatePreLoops(); private: template void eval(int ifrom, int ito, ThrData *const thr); diff --git a/src/OPENMP/reaxff_nonbonded_omp.cpp b/src/OPENMP/reaxff_nonbonded_omp.cpp index a57542f550..a2888e1993 100644 --- a/src/OPENMP/reaxff_nonbonded_omp.cpp +++ b/src/OPENMP/reaxff_nonbonded_omp.cpp @@ -221,7 +221,7 @@ namespace ReaxFF { data->my_en.e_vdW = total_EvdW; data->my_en.e_ele = total_Eele; - Compute_Polarization_Energy(system, data); + Compute_Polarization_Energy(system, data, workspace); } /* ---------------------------------------------------------------------- */ @@ -343,6 +343,6 @@ namespace ReaxFF { data->my_en.e_vdW = total_EvdW; data->my_en.e_ele = total_Eele; - Compute_Polarization_Energy(system, data); + Compute_Polarization_Energy(system, data, workspace); } } diff --git a/src/OPENMP/thr_data.cpp b/src/OPENMP/thr_data.cpp index 5ff0263eea..f85b2b685f 100644 --- a/src/OPENMP/thr_data.cpp +++ b/src/OPENMP/thr_data.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ------------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -17,8 +16,8 @@ per-thread data management for LAMMPS ------------------------------------------------------------------------- */ -#include #include +#include #include "thr_data.h" @@ -29,21 +28,20 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -ThrData::ThrData(int tid, Timer *t) - : _f(0),_torque(0),_erforce(0),_de(0),_drho(0),_mu(0),_lambda(0),_rhoB(0), - _D_values(0),_rho(0),_fp(0),_rho1d(0),_drho1d(0),_rho1d_6(0),_drho1d_6(0), - _tid(tid), _timer(t) +ThrData::ThrData(int tid, Timer *t) : + _f(nullptr), _torque(nullptr), _erforce(nullptr), _de(nullptr), _drho(nullptr), _mu(nullptr), + _lambda(nullptr), _rhoB(nullptr), _D_values(nullptr), _rho(nullptr), _fp(nullptr), + _rho1d(nullptr), _drho1d(nullptr), _rho1d_6(nullptr), _drho1d_6(nullptr), _tid(tid), _timer(t) { _timer_active = 0; } - /* ---------------------------------------------------------------------- */ void ThrData::check_tid(int tid) { if (tid != _tid) - fprintf(stderr,"WARNING: external and internal tid mismatch %d != %d\n",tid,_tid); + fprintf(stderr, "WARNING: external and internal tid mismatch %d != %d\n", tid, _tid); } /* ---------------------------------------------------------------------- */ @@ -53,9 +51,7 @@ void ThrData::_stamp(enum Timer::ttype flag) // do nothing until it gets set to 0 in ::setup() if (_timer_active < 0) return; - if (flag == Timer::START) { - _timer_active = 1; - } + if (flag == Timer::START) { _timer_active = 1; } if (_timer_active) _timer->stamp(flag); } @@ -72,44 +68,49 @@ double ThrData::get_time(enum Timer::ttype flag) /* ---------------------------------------------------------------------- */ -void ThrData::init_force(int nall, double **f, double **torque, - double *erforce, double *de, double *drho) +void ThrData::init_force(int nall, double **f, double **torque, double *erforce, double *de, + double *drho) { - eng_vdwl=eng_coul=eng_bond=eng_angle=eng_dihed=eng_imprp=eng_kspce=0.0; - memset(virial_pair,0,6*sizeof(double)); - memset(virial_bond,0,6*sizeof(double)); - memset(virial_angle,0,6*sizeof(double)); - memset(virial_dihed,0,6*sizeof(double)); - memset(virial_imprp,0,6*sizeof(double)); - memset(virial_kspce,0,6*sizeof(double)); + eng_vdwl = eng_coul = eng_bond = eng_angle = eng_dihed = eng_imprp = eng_kspce = 0.0; + memset(virial_pair, 0, 6 * sizeof(double)); + memset(virial_bond, 0, 6 * sizeof(double)); + memset(virial_angle, 0, 6 * sizeof(double)); + memset(virial_dihed, 0, 6 * sizeof(double)); + memset(virial_imprp, 0, 6 * sizeof(double)); + memset(virial_kspce, 0, 6 * sizeof(double)); - eatom_pair=eatom_bond=eatom_angle=eatom_dihed=eatom_imprp=eatom_kspce=nullptr; - vatom_pair=vatom_bond=vatom_angle=vatom_dihed=vatom_imprp=vatom_kspce=nullptr; + eatom_pair = eatom_bond = eatom_angle = eatom_dihed = eatom_imprp = eatom_kspce = nullptr; + vatom_pair = vatom_bond = vatom_angle = vatom_dihed = vatom_imprp = vatom_kspce = nullptr; if (nall >= 0 && f) { - _f = f + _tid*nall; - memset(&(_f[0][0]),0,nall*3*sizeof(double)); - } else _f = nullptr; + _f = f + _tid * nall; + memset(&(_f[0][0]), 0, nall * 3 * sizeof(double)); + } else + _f = nullptr; if (nall >= 0 && torque) { - _torque = torque + _tid*nall; - memset(&(_torque[0][0]),0,nall*3*sizeof(double)); - } else _torque = nullptr; + _torque = torque + _tid * nall; + memset(&(_torque[0][0]), 0, nall * 3 * sizeof(double)); + } else + _torque = nullptr; if (nall >= 0 && erforce) { - _erforce = erforce + _tid*nall; - memset(&(_erforce[0]),0,nall*sizeof(double)); - } else _erforce = nullptr; + _erforce = erforce + _tid * nall; + memset(&(_erforce[0]), 0, nall * sizeof(double)); + } else + _erforce = nullptr; if (nall >= 0 && de) { - _de = de + _tid*nall; - memset(&(_de[0]),0,nall*sizeof(double)); - } else _de = nullptr; + _de = de + _tid * nall; + memset(&(_de[0]), 0, nall * sizeof(double)); + } else + _de = nullptr; if (nall >= 0 && drho) { - _drho = drho + _tid*nall; - memset(&(_drho[0]),0,nall*sizeof(double)); - } else _drho = nullptr; + _drho = drho + _tid * nall; + memset(&(_drho[0]), 0, nall * sizeof(double)); + } else + _drho = nullptr; } /* ---------------------------------------------------------------------- @@ -119,8 +120,8 @@ void ThrData::init_force(int nall, double **f, double **torque, void ThrData::init_eam(int nall, double *rho) { if (nall >= 0 && rho) { - _rho = rho + _tid*nall; - memset(_rho, 0, nall*sizeof(double)); + _rho = rho + _tid * nall; + memset(_rho, 0, nall * sizeof(double)); } } @@ -131,10 +132,10 @@ void ThrData::init_adp(int nall, double *rho, double **mu, double **lambda) init_eam(nall, rho); if (nall >= 0 && mu && lambda) { - _mu = mu + _tid*nall; - _lambda = lambda + _tid*nall; - memset(&(_mu[0][0]), 0, nall*3*sizeof(double)); - memset(&(_lambda[0][0]), 0, nall*6*sizeof(double)); + _mu = mu + _tid * nall; + _lambda = lambda + _tid * nall; + memset(&(_mu[0][0]), 0, nall * 3 * sizeof(double)); + memset(&(_lambda[0][0]), 0, nall * 6 * sizeof(double)); } } @@ -145,8 +146,8 @@ void ThrData::init_eim(int nall, double *rho, double *fp) init_eam(nall, rho); if (nall >= 0 && fp) { - _fp = fp + _tid*nall; - memset(_fp,0,nall*sizeof(double)); + _fp = fp + _tid * nall; + memset(_fp, 0, nall * sizeof(double)); } } @@ -166,18 +167,18 @@ void ThrData::init_pppm(int order, Memory *memory) if (order > 0) { rho1d = static_cast(_rho1d); drho1d = static_cast(_drho1d); - if (rho1d) memory->destroy2d_offset(rho1d,-order/2); - if (drho1d) memory->destroy2d_offset(drho1d,-order/2); - memory->create2d_offset(rho1d,3,-order/2,order/2,"thr_data:rho1d"); - memory->create2d_offset(drho1d,3,-order/2,order/2,"thr_data:drho1d"); + if (rho1d) memory->destroy2d_offset(rho1d, -order / 2); + if (drho1d) memory->destroy2d_offset(drho1d, -order / 2); + memory->create2d_offset(rho1d, 3, -order / 2, order / 2, "thr_data:rho1d"); + memory->create2d_offset(drho1d, 3, -order / 2, order / 2, "thr_data:drho1d"); _rho1d = static_cast(rho1d); _drho1d = static_cast(drho1d); } else { order = -order; rho1d = static_cast(_rho1d); drho1d = static_cast(_drho1d); - if (rho1d) memory->destroy2d_offset(rho1d,-order/2); - if (drho1d) memory->destroy2d_offset(drho1d,-order/2); + if (rho1d) memory->destroy2d_offset(rho1d, -order / 2); + if (drho1d) memory->destroy2d_offset(drho1d, -order / 2); _rho1d = nullptr; _drho1d = nullptr; } @@ -199,18 +200,18 @@ void ThrData::init_pppm_disp(int order_6, Memory *memory) if (order_6 > 0) { rho1d_6 = static_cast(_rho1d_6); drho1d_6 = static_cast(_drho1d_6); - if (rho1d_6) memory->destroy2d_offset(rho1d_6,-order_6/2); - if (drho1d_6) memory->destroy2d_offset(drho1d_6,-order_6/2); - memory->create2d_offset(rho1d_6,3,-order_6/2,order_6/2,"thr_data:rho1d_6"); - memory->create2d_offset(drho1d_6,3,-order_6/2,order_6/2,"thr_data:drho1d_6"); + if (rho1d_6) memory->destroy2d_offset(rho1d_6, -order_6 / 2); + if (drho1d_6) memory->destroy2d_offset(drho1d_6, -order_6 / 2); + memory->create2d_offset(rho1d_6, 3, -order_6 / 2, order_6 / 2, "thr_data:rho1d_6"); + memory->create2d_offset(drho1d_6, 3, -order_6 / 2, order_6 / 2, "thr_data:drho1d_6"); _rho1d_6 = static_cast(rho1d_6); _drho1d_6 = static_cast(drho1d_6); } else { order_6 = -order_6; rho1d_6 = static_cast(_rho1d_6); drho1d_6 = static_cast(_drho1d_6); - if (rho1d_6) memory->destroy2d_offset(rho1d_6,-order_6/2); - if (drho1d_6) memory->destroy2d_offset(drho1d_6,-order_6/2); + if (rho1d_6) memory->destroy2d_offset(rho1d_6, -order_6 / 2); + if (drho1d_6) memory->destroy2d_offset(drho1d_6, -order_6 / 2); } } @@ -227,35 +228,35 @@ void ThrData::virial_fdotr_compute(double **x, int nlocal, int nghost, int nfirs if (nfirst < 0) { int nall = nlocal + nghost; for (int i = 0; i < nall; i++) { - virial_pair[0] += _f[i][0]*x[i][0]; - virial_pair[1] += _f[i][1]*x[i][1]; - virial_pair[2] += _f[i][2]*x[i][2]; - virial_pair[3] += _f[i][1]*x[i][0]; - virial_pair[4] += _f[i][2]*x[i][0]; - virial_pair[5] += _f[i][2]*x[i][1]; + virial_pair[0] += _f[i][0] * x[i][0]; + virial_pair[1] += _f[i][1] * x[i][1]; + virial_pair[2] += _f[i][2] * x[i][2]; + virial_pair[3] += _f[i][1] * x[i][0]; + virial_pair[4] += _f[i][2] * x[i][0]; + virial_pair[5] += _f[i][2] * x[i][1]; } - // neighbor includegroup flag is set - // sum over force on initial nfirst particles and ghosts + // neighbor includegroup flag is set + // sum over force on initial nfirst particles and ghosts } else { int nall = nfirst; for (int i = 0; i < nall; i++) { - virial_pair[0] += _f[i][0]*x[i][0]; - virial_pair[1] += _f[i][1]*x[i][1]; - virial_pair[2] += _f[i][2]*x[i][2]; - virial_pair[3] += _f[i][1]*x[i][0]; - virial_pair[4] += _f[i][2]*x[i][0]; - virial_pair[5] += _f[i][2]*x[i][1]; + virial_pair[0] += _f[i][0] * x[i][0]; + virial_pair[1] += _f[i][1] * x[i][1]; + virial_pair[2] += _f[i][2] * x[i][2]; + virial_pair[3] += _f[i][1] * x[i][0]; + virial_pair[4] += _f[i][2] * x[i][0]; + virial_pair[5] += _f[i][2] * x[i][1]; } nall = nlocal + nghost; for (int i = nlocal; i < nall; i++) { - virial_pair[0] += _f[i][0]*x[i][0]; - virial_pair[1] += _f[i][1]*x[i][1]; - virial_pair[2] += _f[i][2]*x[i][2]; - virial_pair[3] += _f[i][1]*x[i][0]; - virial_pair[4] += _f[i][2]*x[i][0]; - virial_pair[5] += _f[i][2]*x[i][1]; + virial_pair[0] += _f[i][0] * x[i][0]; + virial_pair[1] += _f[i][1] * x[i][1]; + virial_pair[2] += _f[i][2] * x[i][2]; + virial_pair[3] += _f[i][1] * x[i][0]; + virial_pair[4] += _f[i][2] * x[i][0]; + virial_pair[5] += _f[i][2] * x[i][1]; } } } @@ -264,9 +265,9 @@ void ThrData::virial_fdotr_compute(double **x, int nlocal, int nghost, int nfirs double ThrData::memory_usage() { - double bytes = (7 + 6*6) * sizeof(double); - bytes += (double)2 * sizeof(double*); - bytes += (double)4 * sizeof(int); + double bytes = (7 + 6 * 6) * sizeof(double); + bytes += (double) 2 * sizeof(double *); + bytes += (double) 4 * sizeof(int); return bytes; } @@ -287,10 +288,10 @@ void LAMMPS_NS::data_reduce_thr(double *dall, int nall, int nthreads, int ndim, if (nthreads == 1) return; #pragma omp barrier { - const int nvals = ndim*nall; - const int idelta = nvals/nthreads + 1; - const int ifrom = tid*idelta; - const int ito = ((ifrom + idelta) > nvals) ? nvals : (ifrom + idelta); + const int nvals = ndim * nall; + const int idelta = nvals / nthreads + 1; + const int ifrom = tid * idelta; + const int ito = ((ifrom + idelta) > nvals) ? nvals : (ifrom + idelta); #if defined(USER_OMP_NO_UNROLL) if (ifrom < nvals) { @@ -298,8 +299,8 @@ void LAMMPS_NS::data_reduce_thr(double *dall, int nall, int nthreads, int ndim, for (m = ifrom; m < ito; ++m) { for (int n = 1; n < nthreads; ++n) { - dall[m] += dall[n*nvals + m]; - dall[n*nvals + m] = 0.0; + dall[m] += dall[n * nvals + m]; + dall[n * nvals + m] = 0.0; } } } @@ -313,47 +314,47 @@ void LAMMPS_NS::data_reduce_thr(double *dall, int nall, int nthreads, int ndim, // contiguous values in the array at a time // -- modify this code based on the size of the cache line double t0, t1, t2, t3, t4, t5, t6, t7; - for (m = ifrom; m < (ito-7); m+=8) { - t0 = dall[m ]; - t1 = dall[m+1]; - t2 = dall[m+2]; - t3 = dall[m+3]; - t4 = dall[m+4]; - t5 = dall[m+5]; - t6 = dall[m+6]; - t7 = dall[m+7]; + for (m = ifrom; m < (ito - 7); m += 8) { + t0 = dall[m]; + t1 = dall[m + 1]; + t2 = dall[m + 2]; + t3 = dall[m + 3]; + t4 = dall[m + 4]; + t5 = dall[m + 5]; + t6 = dall[m + 6]; + t7 = dall[m + 7]; for (int n = 1; n < nthreads; ++n) { - t0 += dall[n*nvals + m ]; - t1 += dall[n*nvals + m+1]; - t2 += dall[n*nvals + m+2]; - t3 += dall[n*nvals + m+3]; - t4 += dall[n*nvals + m+4]; - t5 += dall[n*nvals + m+5]; - t6 += dall[n*nvals + m+6]; - t7 += dall[n*nvals + m+7]; - dall[n*nvals + m ] = 0.0; - dall[n*nvals + m+1] = 0.0; - dall[n*nvals + m+2] = 0.0; - dall[n*nvals + m+3] = 0.0; - dall[n*nvals + m+4] = 0.0; - dall[n*nvals + m+5] = 0.0; - dall[n*nvals + m+6] = 0.0; - dall[n*nvals + m+7] = 0.0; + t0 += dall[n * nvals + m]; + t1 += dall[n * nvals + m + 1]; + t2 += dall[n * nvals + m + 2]; + t3 += dall[n * nvals + m + 3]; + t4 += dall[n * nvals + m + 4]; + t5 += dall[n * nvals + m + 5]; + t6 += dall[n * nvals + m + 6]; + t7 += dall[n * nvals + m + 7]; + dall[n * nvals + m] = 0.0; + dall[n * nvals + m + 1] = 0.0; + dall[n * nvals + m + 2] = 0.0; + dall[n * nvals + m + 3] = 0.0; + dall[n * nvals + m + 4] = 0.0; + dall[n * nvals + m + 5] = 0.0; + dall[n * nvals + m + 6] = 0.0; + dall[n * nvals + m + 7] = 0.0; } - dall[m ] = t0; - dall[m+1] = t1; - dall[m+2] = t2; - dall[m+3] = t3; - dall[m+4] = t4; - dall[m+5] = t5; - dall[m+6] = t6; - dall[m+7] = t7; + dall[m] = t0; + dall[m + 1] = t1; + dall[m + 2] = t2; + dall[m + 3] = t3; + dall[m + 4] = t4; + dall[m + 5] = t5; + dall[m + 6] = t6; + dall[m + 7] = t7; } // do the last < 8 values for (; m < ito; m++) { for (int n = 1; n < nthreads; ++n) { - dall[m] += dall[n*nvals + m]; - dall[n*nvals + m] = 0.0; + dall[m] += dall[n * nvals + m]; + dall[n * nvals + m] = 0.0; } } } diff --git a/src/OPENMP/thr_omp.cpp b/src/OPENMP/thr_omp.cpp index 7f4bc95e8c..73a5f97ca2 100644 --- a/src/OPENMP/thr_omp.cpp +++ b/src/OPENMP/thr_omp.cpp @@ -53,13 +53,6 @@ ThrOMP::ThrOMP(LAMMPS *ptr, int style) fix = static_cast(lmp->modify->fix[ifix]); } -/* ---------------------------------------------------------------------- */ - -ThrOMP::~ThrOMP() -{ - // nothing to do? -} - /* ---------------------------------------------------------------------- Hook up per thread per atom arrays into the tally infrastructure ---------------------------------------------------------------------- */ diff --git a/src/OPENMP/thr_omp.h b/src/OPENMP/thr_omp.h index c35ca9a056..78d93bd55f 100644 --- a/src/OPENMP/thr_omp.h +++ b/src/OPENMP/thr_omp.h @@ -46,7 +46,7 @@ class ThrOMP { public: ThrOMP(LAMMPS *, int); - virtual ~ThrOMP(); + virtual ~ThrOMP() = default; double memory_usage_thr(); diff --git a/src/OPT/pair_eam_opt.cpp b/src/OPT/pair_eam_opt.cpp index 08af3e7d18..998b14a5e7 100644 --- a/src/OPT/pair_eam_opt.cpp +++ b/src/OPT/pair_eam_opt.cpp @@ -349,8 +349,8 @@ void PairEAMOpt::eval() ff[i].z += tmpfz; } - free(fast_alpha); fast_alpha = 0; - free(fast_gamma); fast_gamma = 0; + free(fast_alpha); fast_alpha = nullptr; + free(fast_gamma); fast_gamma = nullptr; if (vflag_fdotr) virial_fdotr_compute(); } diff --git a/src/OPT/pair_lj_charmm_coul_long_opt.cpp b/src/OPT/pair_lj_charmm_coul_long_opt.cpp index 7b6bec5b94..186172035c 100644 --- a/src/OPT/pair_lj_charmm_coul_long_opt.cpp +++ b/src/OPT/pair_lj_charmm_coul_long_opt.cpp @@ -333,7 +333,7 @@ void PairLJCharmmCoulLongOpt::eval() ff[i].z += tmpfz; } - free(fast_alpha); fast_alpha = 0; + free(fast_alpha); fast_alpha = nullptr; if (vflag_fdotr) virial_fdotr_compute(); } diff --git a/src/OPT/pair_lj_cut_opt.cpp b/src/OPT/pair_lj_cut_opt.cpp index e0ab42b779..f272e6fc78 100644 --- a/src/OPT/pair_lj_cut_opt.cpp +++ b/src/OPT/pair_lj_cut_opt.cpp @@ -195,7 +195,7 @@ void PairLJCutOpt::eval() ff[i].z += tmpfz; } - free(fast_alpha); fast_alpha = 0; + free(fast_alpha); fast_alpha = nullptr; if (vflag_fdotr) virial_fdotr_compute(); } diff --git a/src/OPT/pair_morse_opt.cpp b/src/OPT/pair_morse_opt.cpp index 80414b40c8..04aace0d43 100644 --- a/src/OPT/pair_morse_opt.cpp +++ b/src/OPT/pair_morse_opt.cpp @@ -192,7 +192,7 @@ void PairMorseOpt::eval() ff[i].z += tmpfz; } - free(fast_alpha); fast_alpha = 0; + free(fast_alpha); fast_alpha = nullptr; if (vflag_fdotr) virial_fdotr_compute(); } diff --git a/src/OPT/pair_ufm_opt.cpp b/src/OPT/pair_ufm_opt.cpp index 3008d0af22..3502dfda6c 100644 --- a/src/OPT/pair_ufm_opt.cpp +++ b/src/OPT/pair_ufm_opt.cpp @@ -191,7 +191,7 @@ void PairUFMOpt::eval() ff[i].z += tmpfz; } - free(fast_alpha); fast_alpha = 0; + free(fast_alpha); fast_alpha = nullptr; if (vflag_fdotr) virial_fdotr_compute(); } diff --git a/src/ORIENT/fix_orient_eco.cpp b/src/ORIENT/fix_orient_eco.cpp index 6ec4e278ec..55486adc37 100644 --- a/src/ORIENT/fix_orient_eco.cpp +++ b/src/ORIENT/fix_orient_eco.cpp @@ -550,7 +550,7 @@ int FixOrientECO::get_norm() { squared_distance = delta[0] * delta[0] + delta[1] * delta[1] + delta[2] * delta[2]; // check if atom is within cutoff region - if ((squared_distance != 0.0) and (squared_distance < squared_cutoff)) { + if ((squared_distance != 0.0) && (squared_distance < squared_cutoff)) { ++neigh; squared_distance *= inv_squared_cutoff; diff --git a/src/PHONON/dynamical_matrix.cpp b/src/PHONON/dynamical_matrix.cpp index f7cb3f7f44..e236e24a15 100644 --- a/src/PHONON/dynamical_matrix.cpp +++ b/src/PHONON/dynamical_matrix.cpp @@ -55,9 +55,12 @@ DynamicalMatrix::DynamicalMatrix(LAMMPS *lmp) : Command(lmp), fp(nullptr) DynamicalMatrix::~DynamicalMatrix() { - if (fp && me == 0) fclose(fp); + if (fp && me == 0) { + if (compressed) platform::pclose(fp); + else fclose(fp); memory->destroy(groupmap); fp = nullptr; + } } /* ---------------------------------------------------------------------- @@ -208,36 +211,28 @@ void DynamicalMatrix::options(int narg, char **arg) /* ---------------------------------------------------------------------- generic opening of a file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ -void DynamicalMatrix::openfile(const char* filename) +void DynamicalMatrix::openfile(const char *filename) { // if file already opened, return - //if (me!=0) return; if (file_opened) return; + fp = nullptr; - if (compressed) { -#ifdef LAMMPS_GZIP - char gzip[128]; - sprintf(gzip,"gzip -6 > %s",filename); -#ifdef _WIN32 - fp = _popen(gzip,"wb"); -#else - fp = popen(gzip,"w"); -#endif -#else - error->one(FLERR,"Cannot open gzipped file"); -#endif - } else if (binaryflag) { + if (me == 0) { + if (compressed) { + fp = platform::compressed_write(std::string(filename)+".gz"); + if (!fp) error->one(FLERR,"Cannot open compressed file"); + } else if (binaryflag) { fp = fopen(filename,"wb"); - } else { + } else { fp = fopen(filename,"w"); + } + if (!fp) error->one(FLERR,"Cannot open dynmat file: {}", utils::getsyserror()); } - if (fp == nullptr) error->one(FLERR,"Cannot open dump file"); - file_opened = 1; } diff --git a/src/PHONON/third_order.cpp b/src/PHONON/third_order.cpp index 565e8b50e5..3206882a4a 100644 --- a/src/PHONON/third_order.cpp +++ b/src/PHONON/third_order.cpp @@ -55,7 +55,10 @@ ThirdOrder::ThirdOrder(LAMMPS *lmp) : Command(lmp), fp(nullptr) ThirdOrder::~ThirdOrder() { - if (fp && me == 0) fclose(fp); + if (fp && me == 0) { + if (compressed) platform::pclose(fp); + else fclose(fp); + } fp = nullptr; memory->destroy(groupmap); } @@ -200,14 +203,14 @@ void ThirdOrder::options(int narg, char **arg) iarg += 2; } else error->all(FLERR,"Illegal third_order command"); } - if (file_flag == 1 and me == 0) { + if (file_flag == 1 && me == 0) { openfile(filename); } } /* ---------------------------------------------------------------------- generic opening of a file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ @@ -215,27 +218,19 @@ void ThirdOrder::openfile(const char* filename) { // if file already opened, return if (file_opened) return; + fp = nullptr; - if (compressed) { -#ifdef LAMMPS_GZIP - char gzip[128]; - sprintf(gzip,"gzip -6 > %s",filename); -#ifdef _WIN32 - fp = _popen(gzip,"wb"); -#else - fp = popen(gzip,"w"); -#endif -#else - error->one(FLERR,"Cannot open gzipped file"); -#endif - } else if (binaryflag) { - fp = fopen(filename,"wb"); - } else { - fp = fopen(filename,"w"); + if (me == 0) { + if (compressed) { + fp = platform::compressed_write(std::string(filename)+".gz"); + if (!fp) error->one(FLERR,"Cannot open compressed file"); + } else if (binaryflag) { + fp = fopen(filename,"wb"); + } else { + fp = fopen(filename,"w"); + } + if (!fp) error->one(FLERR,"Cannot open third_order file: {}", utils::getsyserror()); } - - if (fp == nullptr) error->one(FLERR,"Cannot open dump file"); - file_opened = 1; } diff --git a/src/PLUGIN/plugin.cpp b/src/PLUGIN/plugin.cpp index 270c9958f5..4c20ff6fdd 100644 --- a/src/PLUGIN/plugin.cpp +++ b/src/PLUGIN/plugin.cpp @@ -25,12 +25,6 @@ #include #include -#ifdef _WIN32 -#include -#else -#include -#endif - namespace LAMMPS_NS { // list of plugin information data for loaded styles @@ -87,31 +81,28 @@ namespace LAMMPS_NS { #if defined(LMP_PLUGIN) int me = lmp->comm->me; -#if defined(WIN32) - lmp->error->all(FLERR,"Loading of plugins on Windows is not supported\n"); -#else // open DSO file from given path; load symbols globally - dlerror(); - void *dso = dlopen(file,RTLD_NOW|RTLD_GLOBAL); + platform::dlerror(); + void *dso = platform::dlopen(file); if (dso == nullptr) { if (me == 0) - utils::logmesg(lmp,"Open of file {} failed: {}\n",file,dlerror()); + utils::logmesg(lmp,"Open of file {} failed: {}\n",file,platform::dlerror()); return; } // look up lammpsplugin_init() function in DSO // function must have C bindings so there is no name mangling - dlerror(); - void *initfunc = dlsym(dso,"lammpsplugin_init"); + platform::dlerror(); + void *initfunc = platform::dlsym(dso,"lammpsplugin_init"); if (initfunc == nullptr) { - dlclose(dso); + platform::dlclose(dso); if (me == 0) utils::logmesg(lmp,"Plugin symbol lookup failure in file {}: {}\n", - file,dlerror()); + file,platform::dlerror()); return; } @@ -121,7 +112,6 @@ namespace LAMMPS_NS (*(lammpsplugin_initfunc)(initfunc))((void *)lmp, dso, (void *)&plugin_register); -#endif #endif } @@ -410,9 +400,7 @@ namespace LAMMPS_NS -- dso_refcounter[handle]; if (dso_refcounter[handle] == 0) { -#ifndef WIN32 - dlclose(handle); -#endif + platform::dlclose(handle); } #endif } @@ -476,8 +464,8 @@ namespace LAMMPS_NS const lammpsplugin_t *plugin_get_info(int idx) { int i=0; - for (auto p=pluginlist.begin(); p != pluginlist.end(); ++p) { - if (i == idx) return &(*p); + for (auto & p : pluginlist) { + if (i == idx) return &p; ++i; } return nullptr; diff --git a/src/PLUMED/fix_plumed.cpp b/src/PLUMED/fix_plumed.cpp index b38e745b7a..137cd580a8 100644 --- a/src/PLUMED/fix_plumed.cpp +++ b/src/PLUMED/fix_plumed.cpp @@ -41,7 +41,7 @@ #if defined(__PLUMED_DEFAULT_KERNEL) #define PLUMED_QUOTE_DIRECT(name) #name #define PLUMED_QUOTE(macro) PLUMED_QUOTE_DIRECT(macro) -static char plumed_default_kernel[] = "PLUMED_KERNEL=" PLUMED_QUOTE(__PLUMED_DEFAULT_KERNEL); +static const char plumed_default_kernel[] = "PLUMED_KERNEL=" PLUMED_QUOTE(__PLUMED_DEFAULT_KERNEL); #endif /* -------------------------------------------------------------------- */ @@ -68,7 +68,7 @@ FixPlumed::FixPlumed(LAMMPS *lmp, int narg, char **arg) : #if defined(__PLUMED_DEFAULT_KERNEL) if (getenv("PLUMED_KERNEL") == nullptr) - putenv(plumed_default_kernel); + platform::putenv(plumed_default_kernel); #endif p=new PLMD::Plumed; @@ -215,31 +215,13 @@ FixPlumed::FixPlumed(LAMMPS *lmp, int narg, char **arg) : // Define compute to calculate potential energy - id_pe = new char[8]; - strcpy(id_pe,"plmd_pe"); - char **newarg = new char*[3]; - newarg[0] = id_pe; - newarg[1] = (char *) "all"; - newarg[2] = (char *) "pe"; - modify->add_compute(3,newarg); - delete [] newarg; - int ipe = modify->find_compute(id_pe); - c_pe = modify->compute[ipe]; + id_pe = utils::strdup("plmd_pe"); + c_pe = modify->add_compute(std::string(id_pe) + " all pe"); // Define compute to calculate pressure tensor - id_press = new char[11]; - strcpy(id_press,"plmd_press"); - newarg = new char*[5]; - newarg[0] = id_press; - newarg[1] = (char *) "all"; - newarg[2] = (char *) "pressure"; - newarg[3] = (char *) "NULL"; - newarg[4] = (char *) "virial"; - modify->add_compute(5,newarg); - delete [] newarg; - int ipress = modify->find_compute(id_press); - c_press = modify->compute[ipress]; + id_press = utils::strdup("plmd_press"); + c_press = modify->add_compute(std::string(id_press) + " all pressure NULL virial"); for (int i = 0; i < modify->nfix; i++) { const char * const check_style = modify->fix[i]->style; diff --git a/src/POEMS/fix_poems.cpp b/src/POEMS/fix_poems.cpp index fdd8ef7a18..201e40b5b8 100644 --- a/src/POEMS/fix_poems.cpp +++ b/src/POEMS/fix_poems.cpp @@ -954,7 +954,7 @@ void FixPOEMS::readfile(char *file) int nlocal = atom->nlocal; int i,id,nlen; - while (1) { + while (true) { if (me == 0) nlen = readline(fp,&line,&maxline); MPI_Bcast(&nlen,1,MPI_INT,0,world); if (nlen == 0) break; @@ -986,7 +986,7 @@ int FixPOEMS::readline(FILE *fp, char **pline, int *pmaxline) char *line = *pline; int maxline = *pmaxline; - while (1) { + while (true) { if (n+1 >= maxline) { maxline += DELTA; memory->grow(line,maxline,"fix_poems:line"); @@ -1246,7 +1246,7 @@ int FixPOEMS::loopcheck(int nvert, int nedge, tagint **elist) int *stack = new int[nvert]; ncluster = 0; - while (1) { + while (true) { for (i = 0; i < nvert; i++) if (mark[i] == 0) break; if (i == nvert) break; diff --git a/src/PTM/ptm_convex_hull_incremental.cpp b/src/PTM/ptm_convex_hull_incremental.cpp index 580d88c578..25ff54c787 100644 --- a/src/PTM/ptm_convex_hull_incremental.cpp +++ b/src/PTM/ptm_convex_hull_incremental.cpp @@ -1,4 +1,3 @@ -// clang-format off /*Copyright (c) 2016 PM Larsen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -8,13 +7,14 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include -#include -#include #include "ptm_convex_hull_incremental.h" #include "ptm_constants.h" +#include +#include +#include +#include + namespace ptm { #define VISIBLE 1 @@ -22,354 +22,324 @@ namespace ptm { #define BOTH 3 #define TOLERANCE 1E-8 -static double norm_squared(double* p) +static double norm_squared(double *p) { - double x = p[0]; - double y = p[1]; - double z = p[2]; + double x = p[0]; + double y = p[1]; + double z = p[2]; - return x*x + y*y + z*z; + return x * x + y * y + z * z; } -static double dot_product(const double* a, const double* b) +static double dot_product(const double *a, const double *b) { - return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } -static void cross_product(double* a, double* b, double* c) +static void cross_product(double *a, double *b, double *c) { - c[0] = a[1] * b[2] - a[2] * b[1]; - c[1] = a[2] * b[0] - a[0] * b[2]; - c[2] = a[0] * b[1] - a[1] * b[0]; + c[0] = a[1] * b[2] - a[2] * b[1]; + c[1] = a[2] * b[0] - a[0] * b[2]; + c[2] = a[0] * b[1] - a[1] * b[0]; } -static void calculate_plane_normal(const double (*points)[3], int a, int b, int c, double* plane_normal) +static void calculate_plane_normal(const double (*points)[3], int a, int b, int c, + double *plane_normal) { - double u[3] = { points[b][0] - points[a][0], - points[b][1] - points[a][1], - points[b][2] - points[a][2] }; + double u[3] = {points[b][0] - points[a][0], points[b][1] - points[a][1], + points[b][2] - points[a][2]}; - double v[3] = { points[c][0] - points[a][0], - points[c][1] - points[a][1], - points[c][2] - points[a][2] }; + double v[3] = {points[c][0] - points[a][0], points[c][1] - points[a][1], + points[c][2] - points[a][2]}; - cross_product(u, v, plane_normal); - double norm = sqrt(norm_squared(plane_normal)); - plane_normal[0] /= norm; - plane_normal[1] /= norm; - plane_normal[2] /= norm; + cross_product(u, v, plane_normal); + double norm = sqrt(norm_squared(plane_normal)); + plane_normal[0] /= norm; + plane_normal[1] /= norm; + plane_normal[2] /= norm; } -static double point_plane_distance(const double* w, const double* plane_point, const double* plane_cross) +static double point_plane_distance(const double *w, const double *plane_point, + const double *plane_cross) { - return plane_cross[0] * (plane_point[0] - w[0]) - + plane_cross[1] * (plane_point[1] - w[1]) - + plane_cross[2] * (plane_point[2] - w[2]); + return plane_cross[0] * (plane_point[0] - w[0]) + plane_cross[1] * (plane_point[1] - w[1]) + + plane_cross[2] * (plane_point[2] - w[2]); } -static bool calc_max_extent(int num_points, const double (*points)[3], int* min_index, int* max_index) +static bool calc_max_extent(int num_points, const double (*points)[3], int *min_index, + int *max_index) { - for (int j=0;j<3;j++) - { - double dmin = DBL_MAX, dmax = -DBL_MAX; - int imin = 0, imax = 0; + for (int j = 0; j < 3; j++) { + double dmin = DBL_MAX, dmax = -DBL_MAX; + int imin = 0, imax = 0; - for (int i = 0;i dmax) - { - dmax = d; - imax = i; - } - } + for (int i = 0; i < num_points; i++) { + double d = points[i][j]; + if (d < dmin) { + dmin = d; + imin = i; + } + if (d > dmax) { + dmax = d; + imax = i; + } + } - if (imin == imax) - return false; //degenerate point set + if (imin == imax) return false; //degenerate point set - min_index[j] = imin; - max_index[j] = imax; - } + min_index[j] = imin; + max_index[j] = imax; + } - return true; + return true; } -static bool find_third_point(int num_points, const double (*points)[3], int a, int b, int* p_c) +static bool find_third_point(int num_points, const double (*points)[3], int a, int b, int *p_c) { - const double* x1 = points[a]; - const double* x2 = points[b]; + const double *x1 = points[a]; + const double *x2 = points[b]; - double x2x1[3] = {x2[0] - x1[0], x2[1] - x1[1], x2[2] - x1[2]}; - double ns_x2x1 = norm_squared(x2x1); + double x2x1[3] = {x2[0] - x1[0], x2[1] - x1[1], x2[2] - x1[2]}; + double ns_x2x1 = norm_squared(x2x1); - int bi = -1; - double max_dist = 0.0; - for (int i = 0;i max_dist) - { - max_dist = dist; - bi = i; - } - } + if (dist > max_dist) { + max_dist = dist; + bi = i; + } + } - *p_c = bi; - return max_dist > TOLERANCE; + *p_c = bi; + return max_dist > TOLERANCE; } -static bool find_fourth_point(int num_points, const double (*points)[3], int a, int b, int c, int* p_d) +static bool find_fourth_point(int num_points, const double (*points)[3], int a, int b, int c, + int *p_d) { - double plane_normal[3]; - calculate_plane_normal(points, a, b, c, plane_normal); + double plane_normal[3]; + calculate_plane_normal(points, a, b, c, plane_normal); + int bi = -1; + double max_dist = 0.0; + for (int i = 0; i < num_points; i++) { + if (i == a || i == b || i == c) continue; - int bi = -1; - double max_dist = 0.0; - for (int i = 0;i max_dist) { + max_dist = dist; + bi = i; + } + } - const double* x0 = points[i]; - double dist = fabs(point_plane_distance(x0, points[a], plane_normal)); - if (dist > max_dist) - { - max_dist = dist; - bi = i; - } - } - - *p_d = bi; - return max_dist > TOLERANCE; + *p_d = bi; + return max_dist > TOLERANCE; } -static int initial_simplex(int num_points, const double (*points)[3], int* initial_vertices) +static int initial_simplex(int num_points, const double (*points)[3], int *initial_vertices) { - int min_index[3] = {0}; - int max_index[3] = {0}; - if (!calc_max_extent(num_points, points, min_index, max_index)) - return -1; + int min_index[3] = {0}; + int max_index[3] = {0}; + if (!calc_max_extent(num_points, points, min_index, max_index)) return -1; - int bi = -1; - double max_dist = 0.0; - for (int i = 0;i<3;i++) - { - int a = min_index[i], b = max_index[i]; - double delta[3] = { points[a][0] - points[b][0], - points[a][1] - points[b][1], - points[a][2] - points[b][2] }; - double dist = norm_squared(delta); - if (dist > max_dist) - { - bi = i; - max_dist = dist; - } - } + int bi = -1; + double max_dist = 0.0; + for (int i = 0; i < 3; i++) { + int a = min_index[i], b = max_index[i]; + double delta[3] = {points[a][0] - points[b][0], points[a][1] - points[b][1], + points[a][2] - points[b][2]}; + double dist = norm_squared(delta); + if (dist > max_dist) { + bi = i; + max_dist = dist; + } + } - //first two points are (a, b) - int a = min_index[bi], b = max_index[bi], c = -1, d = -1; + //first two points are (a, b) + int a = min_index[bi], b = max_index[bi], c = -1, d = -1; - if (!find_third_point(num_points, points, a, b, &c)) - return -2; + if (!find_third_point(num_points, points, a, b, &c)) return -2; - if (!find_fourth_point(num_points, points, a, b, c, &d)) - return -3; + if (!find_fourth_point(num_points, points, a, b, c, &d)) return -3; - initial_vertices[0] = a; - initial_vertices[1] = b; - initial_vertices[2] = c; - initial_vertices[3] = d; - return 0; + initial_vertices[0] = a; + initial_vertices[1] = b; + initial_vertices[2] = c; + initial_vertices[3] = d; + return 0; } -static bool visible(const double* w, const double* plane_point, const double* plane_normal) +static bool visible(const double *w, const double *plane_point, const double *plane_normal) { - return point_plane_distance(w, plane_point, plane_normal) > 0; + return point_plane_distance(w, plane_point, plane_normal) > 0; } -void add_facet(const double (*points)[3], int a, int b, int c, int8_t* facet, double* plane_normal, double* barycentre) +void add_facet(const double (*points)[3], int a, int b, int c, int8_t *facet, double *plane_normal, + double *barycentre) { - calculate_plane_normal(points, a, b, c, plane_normal); - if (visible(barycentre, points[a], plane_normal)) - { - plane_normal[0] = -plane_normal[0]; - plane_normal[1] = -plane_normal[1]; - plane_normal[2] = -plane_normal[2]; + calculate_plane_normal(points, a, b, c, plane_normal); + if (visible(barycentre, points[a], plane_normal)) { + plane_normal[0] = -plane_normal[0]; + plane_normal[1] = -plane_normal[1]; + plane_normal[2] = -plane_normal[2]; - facet[0] = b; - facet[1] = a; - facet[2] = c; - } - else - { - facet[0] = a; - facet[1] = b; - facet[2] = c; - } + facet[0] = b; + facet[1] = a; + facet[2] = c; + } else { + facet[0] = a; + facet[1] = b; + facet[2] = c; + } } -static int initialize_convex_hull(int num_points, const double (*points)[3], int8_t facets[][3], double plane_normal[][3], bool* processed, int* initial_vertices, double* barycentre) +static int initialize_convex_hull(int num_points, const double (*points)[3], int8_t facets[][3], + double plane_normal[][3], bool *processed, int *initial_vertices, + double *barycentre) { - memset(processed, 0, PTM_MAX_POINTS * sizeof(bool)); - memset(barycentre, 0, 3 * sizeof(double)); - int ret = initial_simplex(num_points, points, initial_vertices); - if (ret != 0) - return ret; + memset(processed, 0, PTM_MAX_POINTS * sizeof(bool)); + memset(barycentre, 0, 3 * sizeof(double)); + int ret = initial_simplex(num_points, points, initial_vertices); + if (ret != 0) return ret; - for (int i = 0;i<4;i++) - { - int a = initial_vertices[i]; - processed[a] = true; + for (int i = 0; i < 4; i++) { + int a = initial_vertices[i]; + processed[a] = true; - barycentre[0] += points[a][0]; - barycentre[1] += points[a][1]; - barycentre[2] += points[a][2]; - } - barycentre[0] /= 4; - barycentre[1] /= 4; - barycentre[2] /= 4; + barycentre[0] += points[a][0]; + barycentre[1] += points[a][1]; + barycentre[2] += points[a][2]; + } + barycentre[0] /= 4; + barycentre[1] /= 4; + barycentre[2] /= 4; - add_facet(points, initial_vertices[0], initial_vertices[1], initial_vertices[2], facets[0], plane_normal[0], barycentre); - add_facet(points, initial_vertices[0], initial_vertices[1], initial_vertices[3], facets[1], plane_normal[1], barycentre); - add_facet(points, initial_vertices[0], initial_vertices[2], initial_vertices[3], facets[2], plane_normal[2], barycentre); - add_facet(points, initial_vertices[1], initial_vertices[2], initial_vertices[3], facets[3], plane_normal[3], barycentre); - return 0; + add_facet(points, initial_vertices[0], initial_vertices[1], initial_vertices[2], facets[0], + plane_normal[0], barycentre); + add_facet(points, initial_vertices[0], initial_vertices[1], initial_vertices[3], facets[1], + plane_normal[1], barycentre); + add_facet(points, initial_vertices[0], initial_vertices[2], initial_vertices[3], facets[2], + plane_normal[2], barycentre); + add_facet(points, initial_vertices[1], initial_vertices[2], initial_vertices[3], facets[3], + plane_normal[3], barycentre); + return 0; } -int get_convex_hull(int num_points, const double (*points)[3], convexhull_t* ch, int8_t simplex[][3]) +int get_convex_hull(int num_points, const double (*points)[3], convexhull_t *ch, + int8_t simplex[][3]) { - assert( num_points == PTM_NUM_POINTS_FCC - || num_points == PTM_NUM_POINTS_HCP - || num_points == PTM_NUM_POINTS_BCC - || num_points == PTM_NUM_POINTS_ICO - || num_points == PTM_NUM_POINTS_SC - || num_points == PTM_NUM_POINTS_DCUB - || num_points == PTM_NUM_POINTS_DHEX); + assert(num_points == PTM_NUM_POINTS_FCC || num_points == PTM_NUM_POINTS_HCP || + num_points == PTM_NUM_POINTS_BCC || num_points == PTM_NUM_POINTS_ICO || + num_points == PTM_NUM_POINTS_SC || num_points == PTM_NUM_POINTS_DCUB || + num_points == PTM_NUM_POINTS_DHEX); - int ret = 0; - int num_prev = ch->num_prev; - ch->num_prev = num_points; - if (!ch->ok || 0) - { - ret = initialize_convex_hull(num_points, points, ch->facets, ch->plane_normal, ch->processed, ch->initial_vertices, ch->barycentre); - if (ret != 0) - return ret; + int ret = 0; + int num_prev = ch->num_prev; + ch->num_prev = num_points; + if (!ch->ok) { + ret = initialize_convex_hull(num_points, points, ch->facets, ch->plane_normal, ch->processed, + ch->initial_vertices, ch->barycentre); + if (ret != 0) return ret; - ch->num_facets = 4; - num_prev = 0; - } + ch->num_facets = 4; + num_prev = 0; + } - for (int i = num_prev;iprocessed[i]) - continue; - ch->processed[i] = true; + for (int i = num_prev; i < num_points; i++) { + if (ch->processed[i]) continue; + ch->processed[i] = true; - int num_to_add = 0; - int8_t to_add[PTM_MAX_FACETS][3]; - int8_t edge_visible[PTM_MAX_POINTS][PTM_MAX_POINTS]; - memset(edge_visible, 0, sizeof(int8_t) * PTM_MAX_POINTS * PTM_MAX_POINTS); - for (int j = 0;jnum_facets;j++) - { - int a = ch->facets[j][0]; - int b = ch->facets[j][1]; - int c = ch->facets[j][2]; + int num_to_add = 0; + int8_t to_add[PTM_MAX_FACETS][3]; + int8_t edge_visible[PTM_MAX_POINTS][PTM_MAX_POINTS]; + memset(edge_visible, 0, sizeof(int8_t) * PTM_MAX_POINTS * PTM_MAX_POINTS); + for (int j = 0; j < ch->num_facets; j++) { + int a = ch->facets[j][0]; + int b = ch->facets[j][1]; + int c = ch->facets[j][2]; - int u = 0, v = 0, w = 0; + int u = 0, v = 0, w = 0; - double distance = point_plane_distance(points[i], points[a], ch->plane_normal[j]); - bool vis = distance > TOLERANCE; - if (vis) - { - u = edge_visible[a][b] |= VISIBLE; - edge_visible[b][a] |= VISIBLE; + double distance = point_plane_distance(points[i], points[a], ch->plane_normal[j]); + bool vis = distance > TOLERANCE; + if (vis) { + u = edge_visible[a][b] |= VISIBLE; + edge_visible[b][a] |= VISIBLE; - v = edge_visible[b][c] |= VISIBLE; - edge_visible[c][b] |= VISIBLE; + v = edge_visible[b][c] |= VISIBLE; + edge_visible[c][b] |= VISIBLE; - w = edge_visible[c][a] |= VISIBLE; - edge_visible[a][c] |= VISIBLE; + w = edge_visible[c][a] |= VISIBLE; + edge_visible[a][c] |= VISIBLE; - memcpy(ch->facets[j], ch->facets[ch->num_facets-1], 3 * sizeof(int8_t)); - memcpy(ch->plane_normal[j], ch->plane_normal[ch->num_facets-1], 3 * sizeof(double)); - ch->num_facets--; - j--; - } - else - { - u = edge_visible[a][b] |= INVISIBLE; - edge_visible[b][a] |= INVISIBLE; + memcpy(ch->facets[j], ch->facets[ch->num_facets - 1], 3 * sizeof(int8_t)); + memcpy(ch->plane_normal[j], ch->plane_normal[ch->num_facets - 1], 3 * sizeof(double)); + ch->num_facets--; + j--; + } else { + u = edge_visible[a][b] |= INVISIBLE; + edge_visible[b][a] |= INVISIBLE; - v = edge_visible[b][c] |= INVISIBLE; - edge_visible[c][b] |= INVISIBLE; + v = edge_visible[b][c] |= INVISIBLE; + edge_visible[c][b] |= INVISIBLE; - w = edge_visible[c][a] |= INVISIBLE; - edge_visible[a][c] |= INVISIBLE; - } + w = edge_visible[c][a] |= INVISIBLE; + edge_visible[a][c] |= INVISIBLE; + } - if (u == BOTH) - { - to_add[num_to_add][0] = i; - to_add[num_to_add][1] = a; - to_add[num_to_add][2] = b; - num_to_add++; - } + if (u == BOTH) { + to_add[num_to_add][0] = i; + to_add[num_to_add][1] = a; + to_add[num_to_add][2] = b; + num_to_add++; + } - if (v == BOTH) - { - to_add[num_to_add][0] = i; - to_add[num_to_add][1] = b; - to_add[num_to_add][2] = c; - num_to_add++; - } + if (v == BOTH) { + to_add[num_to_add][0] = i; + to_add[num_to_add][1] = b; + to_add[num_to_add][2] = c; + num_to_add++; + } - if (w == BOTH) - { - to_add[num_to_add][0] = i; - to_add[num_to_add][1] = c; - to_add[num_to_add][2] = a; - num_to_add++; - } - } + if (w == BOTH) { + to_add[num_to_add][0] = i; + to_add[num_to_add][1] = c; + to_add[num_to_add][2] = a; + num_to_add++; + } + } - for (int j = 0;jnum_facets >= PTM_MAX_FACETS) - return -4; + for (int j = 0; j < num_to_add; j++) { + if (ch->num_facets >= PTM_MAX_FACETS) return -4; - add_facet(points, to_add[j][0], to_add[j][1], to_add[j][2], ch->facets[ch->num_facets], ch->plane_normal[ch->num_facets], ch->barycentre); ch->num_facets++; - } - } + add_facet(points, to_add[j][0], to_add[j][1], to_add[j][2], ch->facets[ch->num_facets], + ch->plane_normal[ch->num_facets], ch->barycentre); + ch->num_facets++; + } + } - for (int i=0;inum_facets;i++) - { - int a = ch->facets[i][0]; - int b = ch->facets[i][1]; - int c = ch->facets[i][2]; - if (a == 0 || b == 0 || c == 0) - return 1; //central atom contained in convex hull + for (int i = 0; i < ch->num_facets; i++) { + int a = ch->facets[i][0]; + int b = ch->facets[i][1]; + int c = ch->facets[i][2]; + if (a == 0 || b == 0 || c == 0) return 1; //central atom contained in convex hull - simplex[i][0] = a - 1; - simplex[i][1] = b - 1; - simplex[i][2] = c - 1; - } - - return ret; -} + simplex[i][0] = a - 1; + simplex[i][1] = b - 1; + simplex[i][2] = c - 1; + } + return ret; } +} // namespace ptm diff --git a/src/PTM/ptm_index.cpp b/src/PTM/ptm_index.cpp index a0798b9e88..aff81af2e3 100644 --- a/src/PTM/ptm_index.cpp +++ b/src/PTM/ptm_index.cpp @@ -23,7 +23,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #include #include #include -#include +#include static double calculate_interatomic_distance(int type, double scale) { assert(type >= 1 && type <= 8); diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index a0d012bb5b..62d55cbcb3 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -23,9 +23,12 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "group.h" #include "memory.h" +#include "modify.h" #include "neigh_list.h" #include "pair.h" +#include "respa.h" #include "suffix.h" #include "text_file_reader.h" #include "update.h" @@ -39,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 qeq_parser_error : public std::exception { + std::string message; + public: + explicit qeq_parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; +} /* ---------------------------------------------------------------------- */ @@ -291,6 +296,23 @@ double FixQEq::compute_scalar() /* ---------------------------------------------------------------------- */ +void FixQEq::init() +{ + if (!atom->q_flag) + error->all(FLERR,"Fix {} requires atom attribute q", style); + + ngroup = group->count(igroup); + if (ngroup == 0) error->all(FLERR,"Fix {} group has no atoms", style); + + if ((comm->me == 0) && (modify->find_fix_by_style("^efield") >= 0)) + error->warning(FLERR,"Fix efield is ignored during charge equilibration"); + + if (utils::strmatch(update->integrate_style,"^respa")) + nlevels_respa = ((Respa *) update->integrate)->nlevels; +} + +/* ---------------------------------------------------------------------- */ + void FixQEq::init_list(int /*id*/, NeighList *ptr) { list = ptr; @@ -739,21 +761,21 @@ 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) { + while (true) { auto values = reader.next_values(0); 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; @@ -767,7 +789,7 @@ void FixQEq::read_file(char *file) for (int n=nlo; n <= nhi; ++n) zcore[n] = val; for (int n=nlo; n <= nhi; ++n) setflag[n] = 1; } - } catch (EOFException &e) { + } catch (EOFException &) { ; // catch and ignore to exit loop } catch (std::exception &e) { error->one(FLERR,e.what()); diff --git a/src/QEQ/fix_qeq.h b/src/QEQ/fix_qeq.h index f2260cbf30..bd25628508 100644 --- a/src/QEQ/fix_qeq.h +++ b/src/QEQ/fix_qeq.h @@ -1,4 +1,4 @@ -/* -*- c++ -*- ---------------------------------------------------------- +/* -*- c++ -*- --------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov @@ -39,7 +39,7 @@ class FixQEq : public Fix { // derived child classes must provide these functions - virtual void init() = 0; + virtual void init(); virtual void pre_force(int) = 0; virtual int pack_forward_comm(int, int *, double *, int, int *); diff --git a/src/QEQ/fix_qeq_dynamic.cpp b/src/QEQ/fix_qeq_dynamic.cpp index 06cfe0d0bd..689ecfb026 100644 --- a/src/QEQ/fix_qeq_dynamic.cpp +++ b/src/QEQ/fix_qeq_dynamic.cpp @@ -22,12 +22,10 @@ #include "comm.h" #include "error.h" #include "force.h" -#include "group.h" #include "kspace.h" #include "neigh_list.h" #include "neigh_request.h" #include "neighbor.h" -#include "respa.h" #include "update.h" #include @@ -66,11 +64,7 @@ FixQEqDynamic::FixQEqDynamic(LAMMPS *lmp, int narg, char **arg) : void FixQEqDynamic::init() { - if (!atom->q_flag) - error->all(FLERR,"Fix qeq/dynamic requires atom attribute q"); - - ngroup = group->count(igroup); - if (ngroup == 0) error->all(FLERR,"Fix qeq/dynamic group has no atoms"); + FixQEq::init(); int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->pair = 0; @@ -82,10 +76,6 @@ void FixQEqDynamic::init() if (comm->me == 0) error->warning(FLERR,"Fix qeq/dynamic tolerance may be too small" " for damped dynamics"); - - if (utils::strmatch(update->integrate_style,"^respa")) - nlevels_respa = ((Respa *) update->integrate)->nlevels; - } /* ---------------------------------------------------------------------- */ diff --git a/src/QEQ/fix_qeq_fire.cpp b/src/QEQ/fix_qeq_fire.cpp index 77a5ae36a1..4e42ebc05e 100644 --- a/src/QEQ/fix_qeq_fire.cpp +++ b/src/QEQ/fix_qeq_fire.cpp @@ -22,14 +22,12 @@ #include "comm.h" #include "error.h" #include "force.h" -#include "group.h" #include "kspace.h" #include "neigh_list.h" #include "neigh_request.h" #include "neighbor.h" #include "pair_comb.h" #include "pair_comb3.h" -#include "respa.h" #include "update.h" #include @@ -76,11 +74,7 @@ FixQEqFire::FixQEqFire(LAMMPS *lmp, int narg, char **arg) : void FixQEqFire::init() { - if (!atom->q_flag) - error->all(FLERR,"Fix qeq/fire requires atom attribute q"); - - ngroup = group->count(igroup); - if (ngroup == 0) error->all(FLERR,"Fix qeq/fire group has no atoms"); + FixQEq::init(); int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->pair = 0; @@ -93,9 +87,6 @@ void FixQEqFire::init() error->warning(FLERR,"Fix qeq/fire tolerance may be too small" " for damped fires"); - if (utils::strmatch(update->integrate_style,"^respa")) - nlevels_respa = ((Respa *) update->integrate)->nlevels; - comb3 = (PairComb3 *) force->pair_match("^comb3",0); if (!comb3) comb = (PairComb *) force->pair_match("^comb",0); } diff --git a/src/QEQ/fix_qeq_point.cpp b/src/QEQ/fix_qeq_point.cpp index 3ad76b74d9..0c9115994c 100644 --- a/src/QEQ/fix_qeq_point.cpp +++ b/src/QEQ/fix_qeq_point.cpp @@ -22,13 +22,11 @@ #include "comm.h" #include "error.h" #include "force.h" -#include "group.h" #include "kspace.h" #include "memory.h" #include "neigh_list.h" #include "neigh_request.h" #include "neighbor.h" -#include "respa.h" #include "update.h" #include @@ -51,11 +49,7 @@ FixQEqPoint::FixQEqPoint(LAMMPS *lmp, int narg, char **arg) : void FixQEqPoint::init() { - if (!atom->q_flag) - error->all(FLERR,"Fix qeq/point requires atom attribute q"); - - ngroup = group->count(igroup); - if (ngroup == 0) error->all(FLERR,"Fix qeq/point group has no atoms"); + FixQEq::init(); int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->pair = 0; @@ -65,10 +59,6 @@ void FixQEqPoint::init() int ntypes = atom->ntypes; memory->create(shld,ntypes+1,ntypes+1,"qeq:shielding"); - - if (utils::strmatch(update->integrate_style,"^respa")) - nlevels_respa = ((Respa *) update->integrate)->nlevels; - } /* ---------------------------------------------------------------------- */ diff --git a/src/QEQ/fix_qeq_shielded.cpp b/src/QEQ/fix_qeq_shielded.cpp index 8c1b95996b..f2738051e8 100644 --- a/src/QEQ/fix_qeq_shielded.cpp +++ b/src/QEQ/fix_qeq_shielded.cpp @@ -22,14 +22,12 @@ #include "comm.h" #include "error.h" #include "force.h" -#include "group.h" #include "kspace.h" #include "memory.h" #include "neigh_list.h" #include "neigh_request.h" #include "neighbor.h" #include "pair.h" -#include "respa.h" #include "update.h" #include @@ -53,11 +51,7 @@ FixQEqShielded::FixQEqShielded(LAMMPS *lmp, int narg, char **arg) : void FixQEqShielded::init() { - if (!atom->q_flag) - error->all(FLERR,"Fix qeq/shielded requires atom attribute q"); - - ngroup = group->count(igroup); - if (ngroup == 0) error->all(FLERR,"Fix qeq/shielded group has no atoms"); + FixQEq::init(); int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->pair = 0; @@ -75,10 +69,6 @@ void FixQEqShielded::init() if (gamma[i] == 0.0) error->all(FLERR,"Invalid param file for fix qeq/shielded"); } - - if (utils::strmatch(update->integrate_style,"^respa")) - nlevels_respa = ((Respa *) update->integrate)->nlevels; - } /* ---------------------------------------------------------------------- */ diff --git a/src/QEQ/fix_qeq_slater.cpp b/src/QEQ/fix_qeq_slater.cpp index d491b301d5..e276727f01 100644 --- a/src/QEQ/fix_qeq_slater.cpp +++ b/src/QEQ/fix_qeq_slater.cpp @@ -22,14 +22,12 @@ #include "comm.h" #include "error.h" #include "force.h" -#include "group.h" #include "kspace.h" #include "math_const.h" #include "neigh_list.h" #include "neigh_request.h" #include "neighbor.h" #include "pair.h" -#include "respa.h" #include "update.h" #include @@ -67,11 +65,7 @@ FixQEqSlater::FixQEqSlater(LAMMPS *lmp, int narg, char **arg) : void FixQEqSlater::init() { - if (!atom->q_flag) - error->all(FLERR,"Fix qeq/slater requires atom attribute q"); - - ngroup = group->count(igroup); - if (ngroup == 0) error->all(FLERR,"Fix qeq/slater group has no atoms"); + FixQEq::init(); int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->pair = 0; @@ -84,9 +78,6 @@ void FixQEqSlater::init() if (zeta[i] == 0.0) error->all(FLERR,"Invalid param file for fix qeq/slater"); } - - if (utils::strmatch(update->integrate_style,"^respa")) - nlevels_respa = ((Respa *) update->integrate)->nlevels; } /* ---------------------------------------------------------------------- */ diff --git a/src/QMMM/fix_qmmm.cpp b/src/QMMM/fix_qmmm.cpp index 4222a82247..8c59077c7d 100644 --- a/src/QMMM/fix_qmmm.cpp +++ b/src/QMMM/fix_qmmm.cpp @@ -822,7 +822,7 @@ void FixQMMM::post_force(int vflag) /* ---------------------------------------------------------------------- */ /* local memory usage. approximately. */ -double FixQMMM::memory_usage(void) +double FixQMMM::memory_usage() { double bytes; diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index 69c9c87ddf..dbee51e034 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -49,6 +49,7 @@ Contributing Author: Jacob Gissinger (jacob.r.gissinger@gmail.com) #include #include +#include using namespace LAMMPS_NS; using namespace FixConst; @@ -1380,6 +1381,10 @@ void FixBondReact::superimpose_algorithm() if (!rxnflag) return; + // C++11 and later compatible version of Park pRNG + std::random_device rnd; + std::minstd_rand park_rng(rnd()); + // check if we overstepped our reaction limit for (int i = 0; i < nreacts; i++) { if (reaction_count_total[i] > max_rxn[i]) { @@ -1400,7 +1405,7 @@ void FixBondReact::superimpose_algorithm() for (int j = 0; j < nprocs; j++) for (int k = 0; k < local_rxncounts[j]; k++) rxn_by_proc[itemp++] = j; - std::random_shuffle(&rxn_by_proc[0],&rxn_by_proc[delta_rxn]); + std::shuffle(&rxn_by_proc[0],&rxn_by_proc[delta_rxn], park_rng); for (int j = 0; j < nprocs; j++) all_localskips[j] = 0; nghostlyskips[i] = 0; @@ -2234,8 +2239,7 @@ double FixBondReact::custom_constraint(std::string varstr) } evlstr.push_back(varstr.substr(prev3+1)); - for (int i = 0; i < evlstr.size(); i++) - evlcat += evlstr[i]; + for (auto & evl : evlstr) evlcat += evl; char *cstr = utils::strdup(evlcat); val = input->variable->compute_equal(cstr); @@ -3758,7 +3762,7 @@ void FixBondReact::read(int myrxn) // stop when read an unrecognized line ncreate = 0; - while (1) { + while (true) { readline(line); diff --git a/src/REAXFF/fix_acks2_reaxff.cpp b/src/REAXFF/fix_acks2_reaxff.cpp new file mode 100644 index 0000000000..b6789b1b2e --- /dev/null +++ b/src/REAXFF/fix_acks2_reaxff.cpp @@ -0,0 +1,1074 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Stan Moore (Sandia) +------------------------------------------------------------------------- */ + +#include "fix_acks2_reaxff.h" + +#include "atom.h" +#include "citeme.h" +#include "comm.h" +#include "error.h" +#include "fix_efield.h" +#include "force.h" +#include "group.h" +#include "memory.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "neighbor.h" +#include "pair.h" +#include "pair_reaxff.h" +#include "reaxff_api.h" +#include "respa.h" +#include "text_file_reader.h" +#include "update.h" +#include "utils.h" + +#include +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +static const char cite_fix_acks2_reax[] = + "fix acks2/reaxff command:\n\n" + "@Article{O'Hearn2020,\n" + " author = {K. A. O'Hearn, A. Alperen, and H. M. Aktulga},\n" + " title = {Fast Solvers for Charge Distribution Models on Shared Memory Platforms},\n" + " journal = {SIAM J. Sci. Comput.},\n" + " year = 2020,\n" + " volume = 42,\n" + " pages = {1--22}\n" + "}\n\n"; + +/* ---------------------------------------------------------------------- */ + +FixACKS2ReaxFF::FixACKS2ReaxFF(LAMMPS *lmp, int narg, char **arg) : + FixQEqReaxFF(lmp, narg, arg) +{ + bcut = nullptr; + + X_diag = nullptr; + Xdia_inv = nullptr; + + // BiCGStab + g = nullptr; + q_hat = nullptr; + r_hat = nullptr; + y = nullptr; + z = nullptr; + + // X matrix + X.firstnbr = nullptr; + X.numnbrs = nullptr; + X.jlist = nullptr; + X.val = nullptr; + + // Update comm sizes for this fix + comm_forward = comm_reverse = 2; + + s_hist_X = s_hist_last = nullptr; + + last_rows_rank = 0; + last_rows_flag = (comm->me == last_rows_rank); +} + +/* ---------------------------------------------------------------------- */ + +FixACKS2ReaxFF::~FixACKS2ReaxFF() +{ + if (copymode) return; + + memory->destroy(bcut); + + if (!reaxflag) + memory->destroy(bcut_acks2); + + memory->destroy(s_hist_X); + memory->destroy(s_hist_last); + + deallocate_storage(); + deallocate_matrix(); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::post_constructor() +{ + if (lmp->citeme) lmp->citeme->add(cite_fix_acks2_reax); + + memory->create(s_hist_last,2,nprev,"acks2/reax:s_hist_last"); + for (int i = 0; i < 2; i++) + for (int j = 0; j < nprev; ++j) + s_hist_last[i][j] = 0.0; + + grow_arrays(atom->nmax); + for (int i = 0; i < atom->nmax; i++) + for (int j = 0; j < nprev; ++j) + s_hist[i][j] = s_hist_X[i][j] = 0.0; + + pertype_parameters(pertype_option); + if (dual_enabled) + error->all(FLERR,"Dual keyword only supported with fix qeq/reax/omp"); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::pertype_parameters(char *arg) +{ + // match either new keyword "reaxff" or old keyword "reax/c" + if (utils::strmatch(arg,"^reax..$")) { + reaxflag = 1; + Pair *pair = force->pair_match("^reax..",0); + if (!pair) error->all(FLERR,"No reaxff pair style for fix qeq/reaxff"); + + int tmp; + chi = (double *) pair->extract("chi",tmp); + eta = (double *) pair->extract("eta",tmp); + gamma = (double *) pair->extract("gamma",tmp); + bcut_acks2 = (double *) pair->extract("bcut_acks2",tmp); + double* bond_softness_ptr = (double *) pair->extract("bond_softness",tmp); + + if (chi == nullptr || eta == nullptr || gamma == nullptr || + bcut_acks2 == nullptr || bond_softness_ptr == nullptr) + error->all(FLERR, + "Fix acks2/reaxff could not extract params from pair reaxff"); + bond_softness = *bond_softness_ptr; + return; + } + + reaxflag = 0; + const int ntypes = atom->ntypes; + + memory->create(chi,ntypes+1,"acks2/reaxff:chi"); + memory->create(eta,ntypes+1,"acks2/reaxff:eta"); + memory->create(gamma,ntypes+1,"acks2/reaxff:gamma"); + memory->create(bcut_acks2,ntypes+1,"acks2/reaxff:bcut_acks2"); + + if (comm->me == 0) { + bond_softness = chi[0] = eta[0] = gamma[0] = 0.0; + try { + TextFileReader reader(arg,"acks2/reaxff parameter"); + reader.ignore_comments = false; + + const char *line = reader.next_line(); + if (!line) + throw TokenizerException("Invalid parameter file for fix acks2/reaxff",""); + ValueTokenizer values(line); + + if (values.count() != 1) + 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 TokenizerException("Fix acks2/reaxff: Incorrect parameter file format",""); + ValueTokenizer values(line); + + if (values.count() != 5) + throw TokenizerException("Fix acks2/reaxff: Incorrect parameter file format",""); + + int itype = values.next_int(); + if ((itype < 1) || (itype > ntypes)) + 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(); + gamma[itype] = values.next_double(); + bcut_acks2[itype] = values.next_double(); + } + } catch (std::exception &e) { + error->one(FLERR,e.what()); + } + } + + MPI_Bcast(chi,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(eta,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(gamma,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(bcut_acks2,ntypes+1,MPI_DOUBLE,0,world); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::allocate_storage() +{ + nmax = atom->nmax; + int size = nmax*2 + 2; + + // 0 to nn-1: owned atoms related to H matrix + // nn to NN-1: ghost atoms related to H matrix + // NN to NN+nn-1: owned atoms related to X matrix + // NN+nn to 2*NN-1: ghost atoms related X matrix + // 2*NN to 2*NN+1: last two rows, owned by proc 0 + + memory->create(s,size,"acks2:s"); + memory->create(b_s,size,"acks2:b_s"); + + memory->create(Hdia_inv,nmax,"acks2:Hdia_inv"); + memory->create(chi_field,nmax,"acks2:chi_field"); + + memory->create(X_diag,nmax,"acks2:X_diag"); + memory->create(Xdia_inv,nmax,"acks2:Xdia_inv"); + + memory->create(p,size,"acks2:p"); + memory->create(q,size,"acks2:q"); + memory->create(r,size,"acks2:r"); + memory->create(d,size,"acks2:d"); + + memory->create(g,size,"acks2:g"); + memory->create(q_hat,size,"acks2:q_hat"); + memory->create(r_hat,size,"acks2:r_hat"); + memory->create(y,size,"acks2:y"); + memory->create(z,size,"acks2:z"); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::deallocate_storage() +{ + FixQEqReaxFF::deallocate_storage(); + + memory->destroy(X_diag); + memory->destroy(Xdia_inv); + + memory->destroy(g); + memory->destroy(q_hat); + memory->destroy(r_hat); + memory->destroy(y); + memory->destroy(z); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::allocate_matrix() +{ + FixQEqReaxFF::allocate_matrix(); + + X.n = n_cap; + X.m = m_cap; + memory->create(X.firstnbr,n_cap,"acks2:X.firstnbr"); + memory->create(X.numnbrs,n_cap,"acks2:X.numnbrs"); + memory->create(X.jlist,m_cap,"acks2:X.jlist"); + memory->create(X.val,m_cap,"acks2:X.val"); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::deallocate_matrix() +{ + FixQEqReaxFF::deallocate_matrix(); + + memory->destroy(X.firstnbr); + memory->destroy(X.numnbrs); + memory->destroy(X.jlist); + memory->destroy(X.val); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::init() +{ + FixQEqReaxFF::init(); + + init_bondcut(); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::init_bondcut() +{ + int i,j; + int ntypes; + + ntypes = atom->ntypes; + if (bcut == nullptr) + memory->create(bcut,ntypes+1,ntypes+1,"acks2:bondcut"); + + for (i = 1; i <= ntypes; ++i) + for (j = 1; j <= ntypes; ++j) { + bcut[i][j] = 0.5*(bcut_acks2[i] + bcut_acks2[j]); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::init_storage() +{ + if (efield) get_chi_field(); + + for (int ii = 0; ii < NN; ii++) { + int i = ilist[ii]; + if (atom->mask[i] & groupbit) { + b_s[i] = -chi[atom->type[i]]; + if (efield) b_s[i] -= chi_field[i]; + b_s[NN + i] = 0.0; + s[i] = 0.0; + s[NN + i] = 0.0; + } + } + + for (int i = 0; i < 2; i++) { + b_s[2*NN + i] = 0.0; + s[2*NN + i] = 0.0; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::pre_force(int /*vflag*/) +{ + if (update->ntimestep % nevery) return; + + int n = atom->nlocal; + + if (reaxff) { + nn = reaxff->list->inum; + NN = reaxff->list->inum + reaxff->list->gnum; + ilist = reaxff->list->ilist; + numneigh = reaxff->list->numneigh; + firstneigh = reaxff->list->firstneigh; + } else { + nn = list->inum; + NN = list->inum + list->gnum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + } + + // grow arrays if necessary + // need to be atom->nmax in length + + if (atom->nmax > nmax) reallocate_storage(); + if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) + reallocate_matrix(); + + if (efield) get_chi_field(); + + init_matvec(); + + matvecs = BiCGStab(b_s, s); // BiCGStab on s - parallel + + calculate_Q(); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::init_matvec() +{ + /* fill-in H matrix */ + compute_H(); + + /* fill-in X matrix */ + compute_X(); + pack_flag = 4; + comm->reverse_comm_fix(this); //Coll_Vector(X_diag); + + int ii, i; + + for (ii = 0; ii < nn; ++ii) { + if (X_diag[ii] == 0.0) + Xdia_inv[ii] = 1.0; + else + Xdia_inv[ii] = 1.0 / X_diag[ii]; + + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + + /* init pre-conditioner for H and init solution vectors */ + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -chi[atom->type[i]]; + if (efield) b_s[i] -= chi_field[i]; + b_s[NN+i] = 0.0; + + /* cubic extrapolation for s from previous solutions */ + s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); + s[NN+i] = 4*(s_hist_X[i][0]+s_hist_X[i][2])-(6*s_hist_X[i][1]+s_hist_X[i][3]); + } + } + + // last two rows + if (last_rows_flag) { + for (i = 0; i < 2; i++) { + b_s[2*NN+i] = 0.0; + s[2*NN+i] = 4*(s_hist_last[i][0]+s_hist_last[i][2])-(6*s_hist_last[i][1]+s_hist_last[i][3]); + } + } + + pack_flag = 2; + comm->forward_comm_fix(this); //Dist_vector(s); + more_forward_comm(s); +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::compute_X() +{ + int jnum; + int i, j, ii, jj, flag; + double dx, dy, dz, r_sqr; + const double SMALL = 0.0001; + + int *type = atom->type; + tagint *tag = atom->tag; + double **x = atom->x; + int *mask = atom->mask; + + memset(X_diag,0.0,atom->nmax*sizeof(double)); + + // fill in the X matrix + m_fill = 0; + r_sqr = 0; + for (ii = 0; ii < nn; ii++) { + i = ilist[ii]; + if (mask[i] & groupbit) { + jlist = firstneigh[i]; + jnum = numneigh[i]; + X.firstnbr[i] = m_fill; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + dx = x[j][0] - x[i][0]; + dy = x[j][1] - x[i][1]; + dz = x[j][2] - x[i][2]; + r_sqr = SQR(dx) + SQR(dy) + SQR(dz); + + flag = 0; + if (r_sqr <= SQR(swb)) { + if (j < atom->nlocal) flag = 1; + else if (tag[i] < tag[j]) flag = 1; + else if (tag[i] == tag[j]) { + if (dz > SMALL) flag = 1; + else if (fabs(dz) < SMALL) { + if (dy > SMALL) flag = 1; + else if (fabs(dy) < SMALL && dx > SMALL) + flag = 1; + } + } + } + + if (flag) { + double bcutoff = bcut[type[i]][type[j]]; + double bcutoff2 = bcutoff*bcutoff; + if (r_sqr <= bcutoff2) { + X.jlist[m_fill] = j; + double X_val = calculate_X(sqrt(r_sqr), bcutoff); + X.val[m_fill] = X_val; + X_diag[i] -= X_val; + X_diag[j] -= X_val; + m_fill++; + } + } + } + + X.numnbrs[i] = m_fill - X.firstnbr[i]; + } + } + + if (m_fill >= X.m) + error->all(FLERR,"Fix acks2/reaxff has insufficient ACKS2 X matrix size: m_fill={} X.m={}\n",m_fill,X.m); +} + +/* ---------------------------------------------------------------------- */ + +double FixACKS2ReaxFF::calculate_X(double r, double bcut) +{ + double d = r/bcut; + double d3 = d*d*d; + double omd = 1.0 - d; + double omd2 = omd*omd; + double omd6 = omd2*omd2*omd2; + + return bond_softness*d3*omd6; +} + +/* ---------------------------------------------------------------------- */ + +int FixACKS2ReaxFF::BiCGStab(double *b, double *x) +{ + int i, j; + double tmp, alpha, beta, omega, sigma, rho, rho_old, rnorm, bnorm; + + int jj; + + sparse_matvec_acks2(&H, &X, x, d); + pack_flag = 1; + comm->reverse_comm_fix(this); //Coll_Vector(d); + more_reverse_comm(d); + + vector_sum(r , 1., b, -1., d, nn); + bnorm = parallel_norm(b, nn); + rnorm = parallel_norm(r, nn); + + if (bnorm == 0.0) bnorm = 1.0; + vector_copy(r_hat, r, nn); + omega = 1.0; + rho = 1.0; + + for (i = 1; i < imax && rnorm / bnorm > tolerance; ++i) { + rho = parallel_dot(r_hat, r, nn); + if (rho == 0.0) break; + + if (i > 1) { + beta = (rho / rho_old) * (alpha / omega); + vector_sum(q , 1., p, -omega, z, nn); + vector_sum(p , 1., r, beta, q, nn); + } else { + vector_copy(p, r, nn); + } + + // pre-conditioning + for (jj = 0; jj < nn; ++jj) { + j = ilist[jj]; + if (atom->mask[j] & groupbit) { + d[j] = p[j] * Hdia_inv[j]; + d[NN+j] = p[NN+j] * Xdia_inv[j]; + } + } + // last two rows + if (last_rows_flag) { + d[2*NN] = p[2*NN]; + d[2*NN + 1] = p[2*NN + 1]; + } + + pack_flag = 1; + comm->forward_comm_fix(this); //Dist_vector(d); + more_forward_comm(d); + sparse_matvec_acks2(&H, &X, d, z); + pack_flag = 2; + comm->reverse_comm_fix(this); //Coll_vector(z); + more_reverse_comm(z); + + tmp = parallel_dot(r_hat, z, nn); + alpha = rho / tmp; + + vector_sum(q , 1., r, -alpha, z, nn); + + tmp = parallel_dot(q, q, nn); + + // early convergence check + if (tmp < tolerance) { + vector_add(x, alpha, d, nn); + break; + } + + // pre-conditioning + for (jj = 0; jj < nn; ++jj) { + j = ilist[jj]; + if (atom->mask[j] & groupbit) { + q_hat[j] = q[j] * Hdia_inv[j]; + q_hat[NN+j] = q[NN+j] * Xdia_inv[j]; + } + } + // last two rows + if (last_rows_flag) { + q_hat[2*NN] = q[2*NN]; + q_hat[2*NN + 1] = q[2*NN + 1]; + } + + pack_flag = 3; + comm->forward_comm_fix(this); //Dist_vector(q_hat); + more_forward_comm(q_hat); + sparse_matvec_acks2(&H, &X, q_hat, y); + pack_flag = 3; + comm->reverse_comm_fix(this); //Dist_vector(y); + more_reverse_comm(y); + + sigma = parallel_dot(y, q, nn); + tmp = parallel_dot(y, y, nn); + omega = sigma / tmp; + + vector_sum(g , alpha, d, omega, q_hat, nn); + vector_add(x, 1., g, nn); + vector_sum(r , 1., q, -omega, y, nn); + + rnorm = parallel_norm(r, nn); + if (omega == 0) break; + rho_old = rho; + } + + if (comm->me == 0) { + if (omega == 0 || rho == 0) { + error->warning(FLERR,"Fix acks2/reaxff BiCGStab numerical breakdown, omega = {:.8}, rho = {:.8}", + omega,rho); + } else if (i >= imax) { + error->warning(FLERR,"Fix acks2/reaxff BiCGStab convergence failed after {} iterations " + "at step {}", i, update->ntimestep); + } + } + + return i; +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::sparse_matvec_acks2(sparse_matrix *H, sparse_matrix *X, double *x, double *b) +{ + int i, j, itr_j; + int ii; + + for (ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + b[i] = eta[atom->type[i]] * x[i]; + b[NN + i] = X_diag[i] * x[NN + i]; + } + } + + for (ii = nn; ii < NN; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + b[i] = 0; + b[NN + i] = 0; + } + } + // last two rows + b[2*NN] = 0; + b[2*NN + 1] = 0; + + for (ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + // H Matrix + for (itr_j=H->firstnbr[i]; itr_jfirstnbr[i]+H->numnbrs[i]; itr_j++) { + j = H->jlist[itr_j]; + b[i] += H->val[itr_j] * x[j]; + b[j] += H->val[itr_j] * x[i]; + } + + // X Matrix + for (itr_j=X->firstnbr[i]; itr_jfirstnbr[i]+X->numnbrs[i]; itr_j++) { + j = X->jlist[itr_j]; + b[NN + i] += X->val[itr_j] * x[NN + j]; + b[NN + j] += X->val[itr_j] * x[NN + i]; + } + + // Identity Matrix + b[NN + i] += x[i]; + b[i] += x[NN + i]; + + // Second-to-last row/column + b[2*NN] += x[NN + i]; + b[NN + i] += x[2*NN]; + + // Last row/column + b[2*NN + 1] += x[i]; + b[i] += x[2*NN + 1]; + } + } + +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::calculate_Q() +{ + int i, k; + + for (int ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + + /* backup s */ + for (k = nprev-1; k > 0; --k) { + s_hist[i][k] = s_hist[i][k-1]; + s_hist_X[i][k] = s_hist_X[i][k-1]; + } + s_hist[i][0] = s[i]; + s_hist_X[i][0] = s[NN+i]; + } + } + // last two rows + if (last_rows_flag) { + for (int i = 0; i < 2; ++i) { + for (k = nprev-1; k > 0; --k) + s_hist_last[i][k] = s_hist_last[i][k-1]; + s_hist_last[i][0] = s[2*NN+i]; + } + } + + pack_flag = 2; + comm->forward_comm_fix(this); //Dist_vector(s); + + for (int ii = 0; ii < NN; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) + atom->q[i] = s[i]; + } +} + +/* ---------------------------------------------------------------------- */ + +int FixACKS2ReaxFF::pack_forward_comm(int n, int *list, double *buf, + int /*pbc_flag*/, int * /*pbc*/) +{ + int m = 0; + + if (pack_flag == 1) { + for(int i = 0; i < n; i++) { + int j = list[i]; + buf[m++] = d[j]; + buf[m++] = d[NN+j]; + } + } else if (pack_flag == 2) { + for(int i = 0; i < n; i++) { + int j = list[i]; + buf[m++] = s[j]; + buf[m++] = s[NN+j]; + } + } else if (pack_flag == 3) { + for(int i = 0; i < n; i++) { + int j = list[i]; + buf[m++] = q_hat[j]; + buf[m++] = q_hat[NN+j]; + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::unpack_forward_comm(int n, int first, double *buf) +{ + int i, m; + + int last = first + n; + m = 0; + + if (pack_flag == 1) { + for(i = first; i < last; i++) { + d[i] = buf[m++]; + d[NN+i] = buf[m++]; + } + } else if (pack_flag == 2) { + for(i = first; i < last; i++) { + s[i] = buf[m++]; + s[NN+i] = buf[m++]; + } + } else if (pack_flag == 3) { + for(i = first; i < last; i++) { + q_hat[i] = buf[m++]; + q_hat[NN+i] = buf[m++]; + } + } +} + +/* ---------------------------------------------------------------------- */ + +int FixACKS2ReaxFF::pack_reverse_comm(int n, int first, double *buf) +{ + int i, m; + m = 0; + int last = first + n; + + if (pack_flag == 1) { + for(i = first; i < last; i++) { + buf[m++] = d[i]; + buf[m++] = d[NN+i]; + } + } else if (pack_flag == 2) { + for(i = first; i < last; i++) { + buf[m++] = z[i]; + buf[m++] = z[NN+i]; + } + } else if (pack_flag == 3) { + for(i = first; i < last; i++) { + buf[m++] = y[i]; + buf[m++] = y[NN+i]; + } + } else if (pack_flag == 4) { + for(i = first; i < last; i++) + buf[m++] = X_diag[i]; + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::unpack_reverse_comm(int n, int *list, double *buf) +{ + int j; + int m = 0; + if (pack_flag == 1) { + for(int i = 0; i < n; i++) { + j = list[i]; + d[j] += buf[m++]; + d[NN+j] += buf[m++]; + } + } else if (pack_flag == 2) { + for(int i = 0; i < n; i++) { + j = list[i]; + z[j] += buf[m++]; + z[NN+j] += buf[m++]; + } + } else if (pack_flag == 3) { + for(int i = 0; i < n; i++) { + j = list[i]; + y[j] += buf[m++]; + y[NN+j] += buf[m++]; + } + } else if (pack_flag == 4) { + for(int i = 0; i < n; i++) { + j = list[i]; + X_diag[j] += buf[m++]; + } + } +} + +/* ---------------------------------------------------------------------- + one proc broadcasts last two rows of vector to everyone else +------------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::more_forward_comm(double *vec) +{ + MPI_Bcast(&vec[2*NN],2,MPI_DOUBLE,last_rows_rank,world); +} + +/* ---------------------------------------------------------------------- + reduce last two rows of vector and give to one proc +------------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::more_reverse_comm(double *vec) +{ + if (last_rows_flag) + MPI_Reduce(MPI_IN_PLACE,&vec[2*NN],2,MPI_DOUBLE,MPI_SUM,last_rows_rank,world); + else + MPI_Reduce(&vec[2*NN],nullptr,2,MPI_DOUBLE,MPI_SUM,last_rows_rank,world); +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ + +double FixACKS2ReaxFF::memory_usage() +{ + double bytes; + const double size = 2.0*nmax + 2.0; + + bytes = size*nprev * sizeof(double); // s_hist + bytes += nmax*4.0 * sizeof(double); // storage + bytes += size*11.0 * sizeof(double); // storage + bytes += n_cap*4.0 * sizeof(int); // matrix... + bytes += m_cap*2.0 * sizeof(int); + bytes += m_cap*2.0 * sizeof(double); + + return bytes; +} + +/* ---------------------------------------------------------------------- + allocate solution history array +------------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::grow_arrays(int nmax) +{ + memory->grow(s_hist,nmax,nprev,"acks2:s_hist"); + memory->grow(s_hist_X,nmax,nprev,"acks2:s_hist_X"); +} + +/* ---------------------------------------------------------------------- + copy values within solution history array +------------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::copy_arrays(int i, int j, int /*delflag*/) +{ + for (int m = 0; m < nprev; m++) { + s_hist[j][m] = s_hist[i][m]; + s_hist_X[j][m] = s_hist_X[i][m]; + } +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange with another proc +------------------------------------------------------------------------- */ + +int FixACKS2ReaxFF::pack_exchange(int i, double *buf) +{ + for (int m = 0; m < nprev; m++) buf[m] = s_hist[i][m]; + for (int m = 0; m < nprev; m++) buf[nprev+m] = s_hist_X[i][m]; + return nprev*2; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange with another proc +------------------------------------------------------------------------- */ + +int FixACKS2ReaxFF::unpack_exchange(int nlocal, double *buf) +{ + for (int m = 0; m < nprev; m++) s_hist[nlocal][m] = buf[m]; + for (int m = 0; m < nprev; m++) s_hist_X[nlocal][m] = buf[nprev+m]; + return nprev*2; +} + +/* ---------------------------------------------------------------------- */ + +double FixACKS2ReaxFF::parallel_norm(double *v, int n) +{ + int i; + double my_sum, norm_sqr; + + int ii; + + my_sum = 0.0; + norm_sqr = 0.0; + for (ii = 0; ii < n; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + my_sum += SQR(v[i]); + my_sum += SQR(v[NN+i]); + } + } + + // last two rows + if (last_rows_flag) { + my_sum += SQR(v[2*NN]); + my_sum += SQR(v[2*NN + 1]); + } + + MPI_Allreduce(&my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); + + return sqrt(norm_sqr); +} + +/* ---------------------------------------------------------------------- */ + +double FixACKS2ReaxFF::parallel_dot(double *v1, double *v2, int n) +{ + int i; + double my_dot, res; + + int ii; + + my_dot = 0.0; + res = 0.0; + for (ii = 0; ii < n; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + my_dot += v1[i] * v2[i]; + my_dot += v1[NN+i] * v2[NN+i]; + } + } + + // last two rows + if (last_rows_flag) { + my_dot += v1[2*NN] * v2[2*NN]; + my_dot += v1[2*NN + 1] * v2[2*NN + 1]; + } + + MPI_Allreduce(&my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world); + + return res; +} + +/* ---------------------------------------------------------------------- */ + +double FixACKS2ReaxFF::parallel_vector_acc(double *v, int n) +{ + int i; + double my_acc, res; + + int ii; + + my_acc = 0.0; + res = 0.0; + for (ii = 0; ii < n; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + my_acc += v[i]; + my_acc += v[NN+i]; + } + } + + // last two rows + if (last_rows_flag) { + my_acc += v[2*NN]; + my_acc += v[2*NN + 1]; + } + + MPI_Allreduce(&my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world); + + return res; +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::vector_sum(double* dest, double c, double* v, + double d, double* y, int k) +{ + int kk; + + for (--k; k>=0; --k) { + kk = ilist[k]; + if (atom->mask[kk] & groupbit) { + dest[kk] = c * v[kk] + d * y[kk]; + dest[NN + kk] = c * v[NN + kk] + d * y[NN + kk]; + } + } + + // last two rows + if (last_rows_flag) { + dest[2*NN] = c * v[2*NN] + d * y[2*NN]; + dest[2*NN + 1] = c * v[2*NN + 1] + d * y[2*NN + 1]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::vector_add(double* dest, double c, double* v, int k) +{ + int kk; + + for (--k; k>=0; --k) { + kk = ilist[k]; + if (atom->mask[kk] & groupbit) { + dest[kk] += c * v[kk]; + dest[NN + kk] += c * v[NN + kk]; + } + } + + // last two rows + if (last_rows_flag) { + dest[2*NN] += c * v[2*NN]; + dest[2*NN + 1] += c * v[2*NN + 1]; + } +} + + +/* ---------------------------------------------------------------------- */ + +void FixACKS2ReaxFF::vector_copy(double* dest, double* v, int k) +{ + int kk; + + for (--k; k>=0; --k) { + kk = ilist[k]; + if (atom->mask[kk] & groupbit) { + dest[kk] = v[kk]; + dest[NN + kk] = v[NN + kk]; + } + } + + // last two rows + if (last_rows_flag) { + dest[2*NN] = v[2*NN]; + dest[2*NN + 1] = v[2*NN + 1]; + } +} + diff --git a/src/REAXFF/fix_acks2_reaxff.h b/src/REAXFF/fix_acks2_reaxff.h new file mode 100644 index 0000000000..6c4b85e23e --- /dev/null +++ b/src/REAXFF/fix_acks2_reaxff.h @@ -0,0 +1,91 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(acks2/reax,FixACKS2ReaxFF); +FixStyle(acks2/reaxff,FixACKS2ReaxFF); +// clang-format on +#else + +#ifndef LMP_FIX_ACKS2_REAXFF_H +#define LMP_FIX_ACKS2_REAXFF_H + +#include "fix_qeq_reaxff.h" + +namespace LAMMPS_NS { + +class FixACKS2ReaxFF : public FixQEqReaxFF { + public: + FixACKS2ReaxFF(class LAMMPS *, int, char **); + virtual ~FixACKS2ReaxFF(); + void post_constructor(); + virtual void init(); + void init_storage(); + virtual void pre_force(int); + + double *get_s() { return s; } + + protected: + int last_rows_rank, last_rows_flag; + + double **s_hist_X, **s_hist_last; + double *bcut_acks2, bond_softness, **bcut; // acks2 parameters + + sparse_matrix X; + double *Xdia_inv; + double *X_diag; + + //BiCGStab storage + double *g, *q_hat, *r_hat, *y, *z; + + void pertype_parameters(char *); + void init_bondcut(); + void allocate_storage(); + void deallocate_storage(); + void allocate_matrix(); + void deallocate_matrix(); + + void init_matvec(); + void compute_X(); + double calculate_X(double, double); + void calculate_Q(); + + int BiCGStab(double *, double *); + void sparse_matvec_acks2(sparse_matrix *, sparse_matrix *, double *, double *); + + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); + void more_forward_comm(double *); + void more_reverse_comm(double *); + double memory_usage(); + virtual void grow_arrays(int); + virtual void copy_arrays(int, int, int); + virtual int pack_exchange(int, double *); + virtual int unpack_exchange(int, double *); + + double parallel_norm(double *, int); + double parallel_dot(double *, double *, int); + double parallel_vector_acc(double *, int); + + void vector_sum(double *, double, double *, double, double *, int); + void vector_add(double *, double, double *, int); + void vector_copy(double *, double *, int); +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index b58d10a643..874a10bbae 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -24,7 +24,9 @@ #include "atom.h" #include "citeme.h" #include "comm.h" +#include "domain.h" #include "error.h" +#include "fix_efield.h" #include "force.h" #include "group.h" #include "memory.h" @@ -32,6 +34,7 @@ #include "neigh_request.h" #include "neighbor.h" #include "pair.h" +#include "region.h" #include "respa.h" #include "text_file_reader.h" #include "update.h" @@ -42,18 +45,13 @@ #include #include #include +#include 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(); } -}; - static constexpr double EV_TO_KCAL_PER_MOL = 14.4; +static constexpr double SMALL = 1.0e-14; static const char cite_fix_qeq_reaxff[] = "fix qeq/reaxff command:\n\n" @@ -97,10 +95,10 @@ FixQEqReaxFF::FixQEqReaxFF(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg],"nowarn") == 0) maxwarn = 0; else if (strcmp(arg[iarg],"maxiter") == 0) { if (iarg+1 > narg-1) - error->all(FLERR,"Illegal fix qeq/reaxff command"); + error->all(FLERR,"Illegal fix {} command", style); imax = utils::numeric(FLERR,arg[iarg+1],false,lmp); iarg++; - } else error->all(FLERR,"Illegal fix qeq/reaxff command"); + } else error->all(FLERR,"Illegal fix {} command", style); iarg++; } shld = nullptr; @@ -115,6 +113,7 @@ FixQEqReaxFF::FixQEqReaxFF(LAMMPS *lmp, int narg, char **arg) : Hdia_inv = nullptr; b_s = nullptr; + chi_field = nullptr; b_t = nullptr; b_prc = nullptr; b_prm = nullptr; @@ -236,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(); @@ -271,6 +271,7 @@ void FixQEqReaxFF::allocate_storage() memory->create(Hdia_inv,nmax,"qeq:Hdia_inv"); memory->create(b_s,nmax,"qeq:b_s"); + memory->create(chi_field,nmax,"qeq:chi_field"); memory->create(b_t,nmax,"qeq:b_t"); memory->create(b_prc,nmax,"qeq:b_prc"); memory->create(b_prm,nmax,"qeq:b_prm"); @@ -297,6 +298,7 @@ void FixQEqReaxFF::deallocate_storage() memory->destroy(b_t); memory->destroy(b_prc); memory->destroy(b_prm); + memory->destroy(chi_field); memory->destroy(p); memory->destroy(q); @@ -373,12 +375,40 @@ void FixQEqReaxFF::reallocate_matrix() void FixQEqReaxFF::init() { if (!atom->q_flag) - error->all(FLERR,"Fix qeq/reaxff requires atom attribute q"); + error->all(FLERR,"Fix {} requires atom attribute q", style); if (group->count(igroup) == 0) - error->all(FLERR,"Fix qeq/reaxff group has no atoms"); + error->all(FLERR,"Fix {} group has no atoms", style); - // need a half neighbor list w/ Newton off and ghost neighbors + // there may be only one instance of fix efield + + int num_efield = 0; + for (int ifix = 0; ifix < modify->nfix; ++ifix) { + if (utils::strmatch(modify->fix[ifix]->style, "^efield")) ++num_efield; + } + if (num_efield > 1) + error->all(FLERR, "There may be only one fix efield instance used with fix {}", style); + + efield = nullptr; + int ifix = modify->find_fix_by_style("^efield"); + if (ifix >= 0) efield = (FixEfield *) modify->fix[ifix]; + + // ensure that fix efield is properly initialized before accessing its data and check some settings + if (efield) { + efield->init(); + if (strcmp(update->unit_style,"real") != 0) + error->all(FLERR,"Must use unit_style real with fix {} and external fields", style); + if (efield->varflag != FixEfield::CONSTANT) + error->all(FLERR,"Cannot (yet) use fix {} with variable efield", style); + + if (((fabs(efield->ex) > SMALL) && domain->xperiodic) || + ((fabs(efield->ey) > SMALL) && domain->yperiodic) || + ((fabs(efield->ez) > SMALL) && domain->zperiodic)) + error->all(FLERR,"Must not have electric field component in direction of periodic " + "boundary when using charge equilibration with ReaxFF."); + } + + // we need a half neighbor list w/ Newton off and ghost neighbors // built whenever re-neighboring occurs int irequest = neighbor->request(this,instance_me); @@ -502,22 +532,14 @@ void FixQEqReaxFF::min_setup_pre_force(int vflag) void FixQEqReaxFF::init_storage() { - int NN; - int *ilist; - - if (reaxff) { - NN = reaxff->list->inum + reaxff->list->gnum; - ilist = reaxff->list->ilist; - } else { - NN = list->inum + list->gnum; - ilist = list->ilist; - } + if (efield) get_chi_field(); for (int ii = 0; ii < NN; ii++) { int i = ilist[ii]; if (atom->mask[i] & groupbit) { Hdia_inv[i] = 1. / eta[atom->type[i]]; b_s[i] = -chi[atom->type[i]]; + if (efield) b_s[i] -= chi_field[i]; b_t[i] = -1.0; b_prc[i] = 0; b_prm[i] = 0; @@ -555,6 +577,8 @@ void FixQEqReaxFF::pre_force(int /*vflag*/) if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) reallocate_matrix(); + if (efield) get_chi_field(); + init_matvec(); matvecs_s = CG(b_s, s); // CG on s - parallel @@ -594,6 +618,7 @@ void FixQEqReaxFF::init_matvec() /* init pre-conditioner for H and init solution vectors */ Hdia_inv[i] = 1. / eta[atom->type[i]]; b_s[i] = -chi[atom->type[i]]; + if (efield) b_s[i] -= chi_field[i]; b_t[i] = -1.0; /* quadratic extrapolation for s & t from previous solutions */ @@ -1060,3 +1085,50 @@ void FixQEqReaxFF::vector_add(double* dest, double c, double* v, int k) } } +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxFF::get_chi_field() +{ + memset(&chi_field[0],0.0,atom->nmax*sizeof(double)); + if (!efield) return; + + const double * const *x = (const double * const *)atom->x; + const int *mask = atom->mask; + const imageint *image = atom->image; + const int nlocal = atom->nlocal; + + + // update electric field region if necessary + + Region *region = nullptr; + if (efield->iregion >= 0) { + region = domain->regions[efield->iregion]; + region->prematch(); + } + + // efield energy is in real units of kcal/mol/angstrom, need to convert to eV + + const double factor = -1.0/force->qe2f; + + // currently we only support constant efield + // atom selection is for the group of fix efield + + if (efield->varflag == FixEfield::CONSTANT) { + double unwrap[3]; + const double fx = efield->ex; + const double fy = efield->ey; + const double fz = efield->ez; + const int efgroupbit = efield->groupbit; + + // charge interactions + // force = qE, potential energy = F dot x in unwrapped coords + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & efgroupbit) { + if (region && !region->match(x[i][0],x[i][1],x[i][2])) continue; + domain->unmap(x[i],image[i],unwrap); + chi_field[i] = factor*(fx*unwrap[0] + fy*unwrap[1] + fz*unwrap[2]); + } + } + } +} diff --git a/src/REAXFF/fix_qeq_reaxff.h b/src/REAXFF/fix_qeq_reaxff.h index ab037aea6b..ac54ff72ca 100644 --- a/src/REAXFF/fix_qeq_reaxff.h +++ b/src/REAXFF/fix_qeq_reaxff.h @@ -45,7 +45,7 @@ class FixQEqReaxFF : public Fix { virtual void init(); void init_list(int, class NeighList *); virtual void init_storage(); - void setup_pre_force(int); + virtual void setup_pre_force(int); virtual void pre_force(int); void setup_pre_force_respa(int, int); @@ -65,6 +65,7 @@ class FixQEqReaxFF : public Fix { int nlevels_respa; class NeighList *list; class PairReaxFF *reaxff; + class FixEfield *efield; int *ilist, *jlist, *numneigh, **firstneigh; double swa, swb; // lower/upper Taper cutoff radius @@ -92,6 +93,7 @@ class FixQEqReaxFF : public Fix { double *Hdia_inv; double *b_s, *b_t; double *b_prc, *b_prm; + double *chi_field; //CG storage double *p, *q, *r, *d; @@ -105,7 +107,7 @@ class FixQEqReaxFF : public Fix { virtual void deallocate_storage(); void reallocate_storage(); virtual void allocate_matrix(); - void deallocate_matrix(); + virtual void deallocate_matrix(); void reallocate_matrix(); virtual void init_matvec(); @@ -134,6 +136,8 @@ class FixQEqReaxFF : public Fix { virtual void vector_sum(double *, double, double *, double, double *, int); virtual void vector_add(double *, double, double *, int); + virtual void get_chi_field(); + // dual CG support int dual_enabled; // 0: Original, separate s & t optimization; 1: dual optimization int matvecs_s, matvecs_t; // Iteration count for each system diff --git a/src/REAXFF/fix_reaxff_bonds.cpp b/src/REAXFF/fix_reaxff_bonds.cpp index f13056c5b6..740a32a0a6 100644 --- a/src/REAXFF/fix_reaxff_bonds.cpp +++ b/src/REAXFF/fix_reaxff_bonds.cpp @@ -45,30 +45,21 @@ FixReaxFFBonds::FixReaxFFBonds(LAMMPS *lmp, int narg, char **arg) : MPI_Comm_size(world,&nprocs); ntypes = atom->ntypes; nmax = atom->nmax; + compressed = 0; nevery = utils::inumeric(FLERR,arg[3],false,lmp); - if (nevery <= 0) - error->all(FLERR,"Illegal fix reaxff/bonds command"); + if (nevery <= 0) error->all(FLERR,"Illegal fix reaxff/bonds command"); if (me == 0) { - char *suffix = strrchr(arg[4],'.'); - if (suffix && strcmp(suffix,".gz") == 0) { -#ifdef LAMMPS_GZIP - auto gzip = fmt::format("gzip -6 > {}",arg[4]); -#ifdef _WIN32 - fp = _popen(gzip.c_str(),"wb"); -#else - fp = popen(gzip.c_str(),"w"); -#endif -#else - error->one(FLERR,"Cannot open gzipped file"); -#endif + if (platform::has_compress_extension(arg[4])) { + compressed = 1; + fp = platform::compressed_write(arg[4]); + if (!fp) error->one(FLERR,"Cannot open compressed file"); } else fp = fopen(arg[4],"w"); - if (!fp) - error->one(FLERR,fmt::format("Cannot open fix reaxff/bonds file {}: " - "{}",arg[4],utils::getsyserror())); + if (!fp) error->one(FLERR,fmt::format("Cannot open fix reaxff/bonds file {}: " + "{}",arg[4],utils::getsyserror())); } if (atom->tag_consecutive() == 0) diff --git a/src/REAXFF/fix_reaxff_bonds.h b/src/REAXFF/fix_reaxff_bonds.h index 4c2fd535ea..4c40017e43 100644 --- a/src/REAXFF/fix_reaxff_bonds.h +++ b/src/REAXFF/fix_reaxff_bonds.h @@ -36,7 +36,7 @@ class FixReaxFFBonds : public Fix { void end_of_step(); protected: - int me, nprocs, nmax, ntypes, maxsize; + int me, nprocs, nmax, ntypes, maxsize, compressed; int *numneigh; tagint **neighid; double **abo; diff --git a/src/REAXFF/fix_reaxff_species.cpp b/src/REAXFF/fix_reaxff_species.cpp index 4fc08975a8..a839469d35 100644 --- a/src/REAXFF/fix_reaxff_species.cpp +++ b/src/REAXFF/fix_reaxff_species.cpp @@ -56,6 +56,7 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : size_peratom_cols = 0; peratom_freq = 1; + compressed = 0; nvalid = -1; MPI_Comm_rank(world,&me); @@ -95,34 +96,19 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : rene_flag = 1; } - if (me == 0 && rene_flag) { - error->warning(FLERR,"Resetting reneighboring criteria for fix reaxff/species"); - } - - tmparg = nullptr; - memory->create(tmparg,4,4,"reaxff/species:tmparg"); - strcpy(tmparg[0],arg[3]); - strcpy(tmparg[1],arg[4]); - strcpy(tmparg[2],arg[5]); + if (me == 0 && rene_flag) + error->warning(FLERR,"Resetting reneighboring criteria to 'delay {} every {} check no' " + "for fix reaxff/species",neighbor->delay, neighbor->every); if (me == 0) { - char *suffix = strrchr(arg[6],'.'); - if (suffix && strcmp(suffix,".gz") == 0) { -#ifdef LAMMPS_GZIP - auto gzip = fmt::format("gzip -6 > {}",arg[6]); -#ifdef _WIN32 - fp = _popen(gzip.c_str(),"wb"); -#else - fp = popen(gzip.c_str(),"w"); -#endif -#else - error->one(FLERR,"Cannot open gzipped file"); -#endif + if (platform::has_compress_extension(arg[6])) { + fp = platform::compressed_write(arg[6]); + compressed = 1; + if (!fp) error->one(FLERR,"Cannot open compressed file"); } else fp = fopen(arg[6],"w"); if (!fp) - error->one(FLERR,fmt::format("Cannot open fix reaxff/species file {}: " - "{}",arg[6],utils::getsyserror())); + error->one(FLERR,"Cannot open fix reaxff/species file {}: {}",arg[6],utils::getsyserror()); } x0 = nullptr; @@ -251,13 +237,15 @@ FixReaxFFSpecies::~FixReaxFFSpecies() memory->destroy(NMol); memory->destroy(MolType); memory->destroy(MolName); - memory->destroy(tmparg); if (filepos) delete [] filepos; - if (me == 0) fclose(fp); - if (me == 0 && posflag && multipos_opened) fclose(pos); + if (me == 0) { + if (compressed) platform::pclose(fp); + else fclose(fp); + if (posflag && multipos_opened) fclose(pos); + } modify->delete_compute("SPECATOM"); modify->delete_fix("SPECBOND"); @@ -314,7 +302,7 @@ void FixReaxFFSpecies::init() "abo15 abo16 abo17 abo18 abo19 abo20 abo21 abo22 abo23 abo24"); // create a fix to point to fix_ave_atom for averaging stored properties - auto fixcmd = fmt::format("SPECBOND all ave/atom {} {} {}",tmparg[0],tmparg[1],tmparg[2]); + auto fixcmd = fmt::format("SPECBOND all ave/atom {} {} {}",nevery,nrepeat,nfreq); for (int i = 1; i < 32; ++i) fixcmd += " c_SPECATOM[" + std::to_string(i) + "]"; f_SPECBOND = (FixAveAtom *) modify->add_fix(fixcmd); setupflag = 1; @@ -428,12 +416,12 @@ void FixReaxFFSpecies::FindMolecule () } loop = 0; - while (1) { + while (true) { comm->forward_comm_fix(this); loop ++; change = 0; - while (1) { + while (true) { done = 1; for (ii = 0; ii < inum; ii++) { @@ -683,8 +671,7 @@ void FixReaxFFSpecies::OpenPos() char *ptr = strchr(filepos,'*'); *ptr = '\0'; if (padflag == 0) - sprintf(filecurrent,"%s" BIGINT_FORMAT "%s", - filepos,ntimestep,ptr+1); + sprintf(filecurrent,"%s" BIGINT_FORMAT "%s",filepos,ntimestep,ptr+1); else { char bif[8],pad[16]; strcpy(bif,BIGINT_FORMAT); diff --git a/src/REAXFF/fix_reaxff_species.h b/src/REAXFF/fix_reaxff_species.h index bcfcf2b6dd..ca5e0e512d 100644 --- a/src/REAXFF/fix_reaxff_species.h +++ b/src/REAXFF/fix_reaxff_species.h @@ -45,7 +45,7 @@ class FixReaxFFSpecies : public Fix { protected: int me, nprocs, nmax, nlocal, ntypes, ntotal; - int nrepeat, nfreq, posfreq; + int nrepeat, nfreq, posfreq, compressed; int Nmoltype, vector_nmole, vector_nspec; int *Name, *MolName, *NMol, *nd, *MolType, *molmap; double *clusterID; @@ -53,7 +53,6 @@ class FixReaxFFSpecies : public Fix { double bg_cut; double **BOCut; - char **tmparg; FILE *fp, *pos; int eleflag, posflag, multipos, padflag, setupflag; diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index a8cc249e58..1c6665b604 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -36,10 +36,10 @@ #include "neigh_request.h" #include "neighbor.h" #include "update.h" +#include "fix_acks2_reaxff.h" #include #include -#include // for strcasecmp() #include "reaxff_api.h" @@ -155,6 +155,7 @@ PairReaxFF::~PairReaxFF() delete [] chi; delete [] eta; delete [] gamma; + delete [] bcut_acks2; } memory->destroy(tmpid); @@ -179,6 +180,7 @@ void PairReaxFF::allocate() chi = new double[n+1]; eta = new double[n+1]; gamma = new double[n+1]; + bcut_acks2 = new double[n+1]; } /* ---------------------------------------------------------------------- */ @@ -299,7 +301,7 @@ void PairReaxFF::coeff(int nargs, char **args) // pair_coeff element map for (int i = 3; i < nargs; i++) for (int j = 0; j < nreax_types; j++) - if (strcasecmp(args[i],api->system->reax_param.sbp[j].name) == 0) { + if (utils::lowercase(args[i]) == utils::lowercase(api->system->reax_param.sbp[j].name)) { map[i-2] = j; itmp ++; } @@ -334,9 +336,19 @@ void PairReaxFF::init_style() error->all(FLERR,"Pair style reaxff requires atom attribute q"); bool have_qeq = ((modify->find_fix_by_style("^qeq/reax") != -1) - || (modify->find_fix_by_style("^qeq/shielded") != -1)); + || (modify->find_fix_by_style("^qeq/shielded") != -1) + || (modify->find_fix_by_style("^acks2/reax") != -1)); if (!have_qeq && qeqflag == 1) - error->all(FLERR,"Pair reaxff requires use of fix qeq/reaxff or qeq/shielded"); + error->all(FLERR,"Pair reax/c requires use of fix qeq/reax or qeq/shielded" + " or fix acks2/reax"); + + int have_acks2 = (modify->find_fix_by_style("^acks2/reax") != -1); + api->system->acks2_flag = have_acks2; + if (api->system->acks2_flag) { + int ifix = modify->find_fix_by_style("^acks2/reax"); + FixACKS2ReaxFF* acks2_fix = (FixACKS2ReaxFF*) modify->fix[ifix]; + api->workspace->s = acks2_fix->get_s(); + } api->system->n = atom->nlocal; // my atoms api->system->N = atom->nlocal + atom->nghost; // mine + ghosts @@ -463,6 +475,12 @@ void PairReaxFF::compute(int eflag, int vflag) api->system->N = atom->nlocal + atom->nghost; // mine + ghosts api->system->bigN = static_cast (atom->natoms); // all atoms in the system + if (api->system->acks2_flag) { + int ifix = modify->find_fix_by_style("^acks2/reax"); + FixACKS2ReaxFF* acks2_fix = (FixACKS2ReaxFF*) modify->fix[ifix]; + api->workspace->s = acks2_fix->get_s(); + } + // setup data structures setup(); @@ -728,6 +746,16 @@ void *PairReaxFF::extract(const char *str, int &dim) if (map[i] >= 0) gamma[i] = api->system->reax_param.sbp[map[i]].gamma; else gamma[i] = 0.0; return (void *) gamma; + } + if (strcmp(str,"bcut_acks2") == 0 && bcut_acks2) { + for (int i = 1; i <= atom->ntypes; i++) + if (map[i] >= 0) bcut_acks2[i] = api->system->reax_param.sbp[map[i]].bcut_acks2; + else bcut_acks2[i] = 0.0; + return (void *) bcut_acks2; + } + if (strcmp(str,"bond_softness") == 0) { + double* bond_softness = &api->system->reax_param.gp.l[34]; + return (void *) bond_softness; } return nullptr; } diff --git a/src/REAXFF/pair_reaxff.h b/src/REAXFF/pair_reaxff.h index 846d4e8408..23b2ae894a 100644 --- a/src/REAXFF/pair_reaxff.h +++ b/src/REAXFF/pair_reaxff.h @@ -63,7 +63,7 @@ class PairReaxFF : public Pair { double cutmax; class FixReaxFF *fix_reaxff; - double *chi, *eta, *gamma; + double *chi, *eta, *gamma, *bcut_acks2; int qeqflag; int setup_flag; int firstwarn; diff --git a/src/REAXFF/reaxff_allocate.cpp b/src/REAXFF/reaxff_allocate.cpp index cbb53420ba..16b71d041c 100644 --- a/src/REAXFF/reaxff_allocate.cpp +++ b/src/REAXFF/reaxff_allocate.cpp @@ -231,14 +231,11 @@ namespace ReaxFF { auto error = system->error_ptr; reallocate_data *wsr = &(workspace->realloc); - if (system->n >= DANGER_ZONE * system->local_cap || - (0 && system->n <= LOOSE_ZONE * system->local_cap)) { + if (system->n >= DANGER_ZONE * system->local_cap) system->local_cap = MAX((int)(system->n * safezone), mincap); - } int Nflag = 0; - if (system->N >= DANGER_ZONE * system->total_cap || - (0 && system->N <= LOOSE_ZONE * system->total_cap)) { + if (system->N >= DANGER_ZONE * system->total_cap) { Nflag = 1; system->total_cap = MAX((int)(system->N * safezone), mincap); } @@ -271,8 +268,7 @@ namespace ReaxFF { /* hydrogen bonds list */ if (control->hbond_cut > 0) { Hflag = 0; - if (system->numH >= DANGER_ZONE * system->Hcap || - (0 && system->numH <= LOOSE_ZONE * system->Hcap)) { + if (system->numH >= DANGER_ZONE * system->Hcap) { Hflag = 1; system->Hcap = int(MAX(system->numH * saferzone, mincap)); } diff --git a/src/REAXFF/reaxff_api.h b/src/REAXFF/reaxff_api.h index 043a1ebbf6..33436304f1 100644 --- a/src/REAXFF/reaxff_api.h +++ b/src/REAXFF/reaxff_api.h @@ -125,7 +125,7 @@ extern void Atom_Energy(reax_system *, control_params *, simulation_data *, stor // nonbonded -extern void Compute_Polarization_Energy(reax_system *, simulation_data *); +extern void Compute_Polarization_Energy(reax_system *, simulation_data *, storage *); extern void vdW_Coulomb_Energy(reax_system *, control_params *, simulation_data *, storage *, reax_list **); extern void Tabulated_vdW_Coulomb_Energy(reax_system *, control_params *, simulation_data *, diff --git a/src/REAXFF/reaxff_control.cpp b/src/REAXFF/reaxff_control.cpp index 2020e8a5c3..62a45b0dc7 100644 --- a/src/REAXFF/reaxff_control.cpp +++ b/src/REAXFF/reaxff_control.cpp @@ -54,10 +54,12 @@ namespace ReaxFF { "energy_update_freq", "atom_info", "atom_velocities", "atom_forces", "bond_info", "angle_info" }; - class parser_error : public std::exception { + class control_parser_error : public std::exception { std::string message; public: - parser_error(const std::string &mesg) { message = mesg; } + 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(); } }; @@ -81,7 +83,7 @@ namespace ReaxFF { LAMMPS_NS::TextFileReader reader(control_file, "ReaxFF control"); reader.ignore_comments = false; - while (1) { + while (true) { auto values = reader.next_values(0); // empty line @@ -90,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 " @@ -112,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 6297f4cf94..34db1c232d 100644 --- a/src/REAXFF/reaxff_ffield.cpp +++ b/src/REAXFF/reaxff_ffield.cpp @@ -32,7 +32,6 @@ #include "text_file_reader.h" #include "utils.h" -#include #include #include #include @@ -40,13 +39,14 @@ using LAMMPS_NS::utils::open_potential; using LAMMPS_NS::utils::getsyserror; +using LAMMPS_NS::utils::uppercase; namespace ReaxFF { - class parser_error : public std::exception { + 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(); } }; @@ -61,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); @@ -161,11 +161,10 @@ namespace ReaxFF { if (values.count() < 9) THROW_ERROR("Invalid force field file format"); - auto element = values.next_string(); - int len = MIN(element.size(),3); // truncate stored element symbol if necessary - for (j = 0; j < len; ++j) - sbp[i].name[j] = toupper(element[j]); - sbp[i].name[len] = '\0'; + // 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(),3); + sbp[i].name[3] = '\0'; sbp[i].r_s = values.next_double(); sbp[i].valency = values.next_double(); @@ -206,6 +205,7 @@ namespace ReaxFF { sbp[i].b_o_131 = values.next_double(); sbp[i].b_o_132 = values.next_double(); sbp[i].b_o_133 = values.next_double(); + sbp[i].bcut_acks2 = values.next_double(); // line four diff --git a/src/REAXFF/reaxff_nonbonded.cpp b/src/REAXFF/reaxff_nonbonded.cpp index 8a1e41da29..7acab9915a 100644 --- a/src/REAXFF/reaxff_nonbonded.cpp +++ b/src/REAXFF/reaxff_nonbonded.cpp @@ -32,7 +32,7 @@ #include namespace ReaxFF { - void Compute_Polarization_Energy(reax_system *system, simulation_data *data) + void Compute_Polarization_Energy(reax_system *system, simulation_data *data, storage *workspace) { int i, type_i; double q, en_tmp; @@ -45,6 +45,12 @@ namespace ReaxFF { en_tmp = KCALpMOL_to_EV * (system->reax_param.sbp[type_i].chi * q + (system->reax_param.sbp[type_i].eta / 2.) * SQR(q)); + + if (system->acks2_flag) { + /* energy due to coupling with kinetic energy potential */ + en_tmp += KCALpMOL_to_EV * q * workspace->s[ system->N + i ]; + } + data->my_en.e_pol += en_tmp; /* tally energy into global or per-atom energy accumulators */ @@ -67,6 +73,7 @@ namespace ReaxFF { double dr3gamij_1, dr3gamij_3; double e_ele, e_vdW, e_core, SMALL = 0.0001; double e_lg, de_lg, r_ij5, r_ij6, re6; + double bond_softness, d_bond_softness, d, effpot_diff; two_body_parameters *twbp; far_neighbor_data *nbr_pj; reax_list *far_nbrs; @@ -207,7 +214,83 @@ namespace ReaxFF { } } - Compute_Polarization_Energy(system, data); + /* contribution to energy and gradients (atoms and cell) + * due to geometry-dependent terms in the ACKS2 + * kinetic energy */ + if (system->acks2_flag) + for( i = 0; i < natoms; ++i ) { + if (system->my_atoms[i].type < 0) continue; + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + orig_i = system->my_atoms[i].orig_id; + + for( pj = start_i; pj < end_i; ++pj ) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + if (system->my_atoms[j].type < 0) continue; + orig_j = system->my_atoms[j].orig_id; + + flag = 0; + + /* kinetic energy terms */ + double xcut = 0.5 * ( system->reax_param.sbp[ system->my_atoms[i].type ].bcut_acks2 + + system->reax_param.sbp[ system->my_atoms[j].type ].bcut_acks2 ); + + if(nbr_pj->d <= xcut) { + if (j < natoms) flag = 1; + else if (orig_i < orig_j) flag = 1; + else if (orig_i == orig_j) { + if (nbr_pj->dvec[2] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[2]) < SMALL) { + if (nbr_pj->dvec[1] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) + flag = 1; + } + } + } + + if (flag) { + + d = nbr_pj->d / xcut; + bond_softness = system->reax_param.gp.l[34] * pow( d, 3.0 ) + * pow( 1.0 - d, 6.0 ); + + if ( bond_softness > 0.0 ) + { + /* Coulombic energy contribution */ + effpot_diff = workspace->s[system->N + i] + - workspace->s[system->N + j]; + e_ele = -0.5 * KCALpMOL_to_EV * bond_softness + * SQR( effpot_diff ); + + data->my_en.e_ele += e_ele; + + /* forces contribution */ + d_bond_softness = system->reax_param.gp.l[34] + * 3.0 / xcut * pow( d, 2.0 ) + * pow( 1.0 - d, 5.0 ) * (1.0 - 3.0 * d); + d_bond_softness = -0.5 * d_bond_softness + * SQR( effpot_diff ); + d_bond_softness = KCALpMOL_to_EV * d_bond_softness + / nbr_pj->d; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + rvec_ScaledSum( delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x ); + f_tmp = -d_bond_softness; + system->pair_ptr->ev_tally(i,j,natoms,1,0.0,e_ele, + f_tmp,delij[0],delij[1],delij[2]); + } + + rvec_ScaledAdd( workspace->f[i], -d_bond_softness, nbr_pj->dvec ); + rvec_ScaledAdd( workspace->f[j], d_bond_softness, nbr_pj->dvec ); + } + } + } + } + + Compute_Polarization_Energy( system, data, workspace ); } void Tabulated_vdW_Coulomb_Energy(reax_system *system, control_params *control, @@ -222,6 +305,7 @@ namespace ReaxFF { double e_vdW, e_ele; double CEvd, CEclmb, SMALL = 0.0001; double f_tmp, delij[3]; + double bond_softness, d_bond_softness, d, effpot_diff; far_neighbor_data *nbr_pj; reax_list *far_nbrs; @@ -306,7 +390,83 @@ namespace ReaxFF { } } - Compute_Polarization_Energy(system, data); + /* contribution to energy and gradients (atoms and cell) + * due to geometry-dependent terms in the ACKS2 + * kinetic energy */ + if (system->acks2_flag) + for( i = 0; i < natoms; ++i ) { + if (system->my_atoms[i].type < 0) continue; + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + orig_i = system->my_atoms[i].orig_id; + + for( pj = start_i; pj < end_i; ++pj ) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + if (system->my_atoms[j].type < 0) continue; + orig_j = system->my_atoms[j].orig_id; + + flag = 0; + + /* kinetic energy terms */ + double xcut = 0.5 * ( system->reax_param.sbp[ system->my_atoms[i].type ].bcut_acks2 + + system->reax_param.sbp[ system->my_atoms[j].type ].bcut_acks2 ); + + if(nbr_pj->d <= xcut) { + if (j < natoms) flag = 1; + else if (orig_i < orig_j) flag = 1; + else if (orig_i == orig_j) { + if (nbr_pj->dvec[2] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[2]) < SMALL) { + if (nbr_pj->dvec[1] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) + flag = 1; + } + } + } + + if (flag) { + + d = nbr_pj->d / xcut; + bond_softness = system->reax_param.gp.l[34] * pow( d, 3.0 ) + * pow( 1.0 - d, 6.0 ); + + if ( bond_softness > 0.0 ) + { + /* Coulombic energy contribution */ + effpot_diff = workspace->s[system->N + i] + - workspace->s[system->N + j]; + e_ele = -0.5 * KCALpMOL_to_EV * bond_softness + * SQR( effpot_diff ); + + data->my_en.e_ele += e_ele; + + /* forces contribution */ + d_bond_softness = system->reax_param.gp.l[34] + * 3.0 / xcut * pow( d, 2.0 ) + * pow( 1.0 - d, 5.0 ) * (1.0 - 3.0 * d); + d_bond_softness = -0.5 * d_bond_softness + * SQR( effpot_diff ); + d_bond_softness = KCALpMOL_to_EV * d_bond_softness + / nbr_pj->d; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + rvec_ScaledSum( delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x ); + f_tmp = -d_bond_softness; + system->pair_ptr->ev_tally(i,j,natoms,1,0.0,e_ele, + f_tmp,delij[0],delij[1],delij[2]); + } + + rvec_ScaledAdd( workspace->f[i], -d_bond_softness, nbr_pj->dvec ); + rvec_ScaledAdd( workspace->f[j], d_bond_softness, nbr_pj->dvec ); + } + } + } + } + + Compute_Polarization_Energy(system, data, workspace); } void LR_vdW_Coulomb(reax_system *system, storage *workspace, diff --git a/src/REAXFF/reaxff_types.h b/src/REAXFF/reaxff_types.h index c124a2639d..1eac663e52 100644 --- a/src/REAXFF/reaxff_types.h +++ b/src/REAXFF/reaxff_types.h @@ -77,6 +77,7 @@ struct single_body_parameters { double b_o_131; double b_o_132; double b_o_133; + double bcut_acks2; // ACKS2 bond cutoff /* Line four in the field file */ double p_ovun2; @@ -212,6 +213,7 @@ struct reax_system { LR_lookup_table **LR; int omp_active; + int acks2_flag; }; /* system control parameters */ @@ -340,6 +342,9 @@ struct storage { double *CdDeltaReduction; int *valence_angle_atom_myoffset; + /* acks2 */ + double *s; + reallocate_data realloc; }; diff --git a/src/REPLICA/fix_hyper_local.cpp b/src/REPLICA/fix_hyper_local.cpp index 4a477fad8d..b506ef4f4a 100644 --- a/src/REPLICA/fix_hyper_local.cpp +++ b/src/REPLICA/fix_hyper_local.cpp @@ -447,7 +447,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) int *ilist,*jlist,*numneigh,**firstneigh; //double time1,time2,time3,time4,time5,time6,time7,time8; - //time1 = MPI_Wtime(); + //time1 = platform::walltime(); nostrainyet = 0; @@ -520,7 +520,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) maxhalfstrain[iold] = halfstrain; } - //time2 = MPI_Wtime(); + //time2 = platform::walltime(); // reverse comm acquires maxstrain of all current owned atoms // needed b/c only saw half the bonds of each atom @@ -531,7 +531,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) comm->reverse_comm_fix(this); comm->forward_comm_fix(this); - //time3 = MPI_Wtime(); + //time3 = platform::walltime(); // ------------------------------------------------------------- // stage 2: @@ -636,7 +636,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) maxstrain_domain[i] = emax; } - //time4 = MPI_Wtime(); + //time4 = platform::walltime(); // reverse comm to acquire maxstrain_domain from ghost atoms // needed b/c neigh list may refer to old owned atoms that are now ghost @@ -646,7 +646,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) comm->reverse_comm_fix(this); comm->forward_comm_fix(this); - //time5 = MPI_Wtime(); + //time5 = platform::walltime(); // ------------------------------------------------------------- // stage 3: @@ -672,7 +672,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) bias[nbias++] = maxhalf[iold]; } - //time6 = MPI_Wtime(); + //time6 = platform::walltime(); // ------------------------------------------------------------- // stage 4: @@ -724,7 +724,7 @@ void FixHyperLocal::pre_reverse(int /* eflag */, int /* vflag */) // myboost += exp(beta * biascoeff[m]*vbias); } - //time7 = MPI_Wtime(); + //time7 = platform::walltime(); // ------------------------------------------------------------- // stage 5: @@ -887,7 +887,7 @@ void FixHyperLocal::build_bond_list(int natom) int *ilist,*jlist,*numneigh,**firstneigh; double time1,time2; - time1 = MPI_Wtime(); + time1 = platform::walltime(); if (natom) { nevent++; @@ -980,7 +980,7 @@ void FixHyperLocal::build_bond_list(int natom) "hyper/local:clist"); } - while (1) { + while (true) { if (firstflag) break; for (i = 0; i < nall; i++) numcoeff[i] = 0; for (i = 0; i < nall; i++) clist[i] = nullptr; @@ -1185,7 +1185,7 @@ void FixHyperLocal::build_bond_list(int natom) // DEBUG //if (me == 0) printf("TOTAL BOND COUNT = %ld\n",allbonds); - time2 = MPI_Wtime(); + time2 = platform::walltime(); if (firstflag) nnewbond = 0; else { diff --git a/src/REPLICA/fix_pimd.cpp b/src/REPLICA/fix_pimd.cpp index bb4af16f1b..d4b3447f15 100644 --- a/src/REPLICA/fix_pimd.cpp +++ b/src/REPLICA/fix_pimd.cpp @@ -676,16 +676,11 @@ void FixPIMD::comm_exec(double **ptr) int index = atom->map(tag_send[i]); if (index < 0) { - char error_line[256]; - - sprintf(error_line, - "Atom " TAGINT_FORMAT " is missing at world [%d] " - "rank [%d] required by rank [%d] (" TAGINT_FORMAT ", " TAGINT_FORMAT - ", " TAGINT_FORMAT ").\n", - tag_send[i], universe->iworld, comm->me, plan_recv[iplan], atom->tag[0], - atom->tag[1], atom->tag[2]); - - error->universe_one(FLERR, error_line); + auto mesg = fmt::format("Atom {} is missing at world [{}] rank [{}] " + "required by rank [{}] ({}, {}, {}).\n", + tag_send[i], universe->iworld, comm->me, + plan_recv[iplan], atom->tag[0], atom->tag[1], atom->tag[2]); + error->universe_one(FLERR, mesg); } memcpy(wrap_ptr, ptr[index], ncpy); diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 9e6e32772d..e730aac351 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -94,7 +94,10 @@ NEB::~NEB() MPI_Comm_free(&roots); memory->destroy(all); delete[] rdist; - if (fp) fclose(fp); + if (fp) { + if (compressed) platform::pclose(fp); + else fclose(fp); + } } /* ---------------------------------------------------------------------- @@ -389,7 +392,7 @@ void NEB::readfile(char *file, int flag) if (flag == 0) { if (me_universe == 0) { open(file); - while (1) { + while (true) { eof = fgets(line,MAXLINE,fp); if (eof == nullptr) error->one(FLERR,"Unexpected end of NEB file"); start = &line[strspn(line," \t\n\v\f\r")]; @@ -405,7 +408,7 @@ void NEB::readfile(char *file, int flag) if (me == 0) { if (ireplica) { open(file); - while (1) { + while (true) { eof = fgets(line,MAXLINE,fp); if (eof == nullptr) error->one(FLERR,"Unexpected end of NEB file"); start = &line[strspn(line," \t\n\v\f\r")]; @@ -525,12 +528,12 @@ void NEB::readfile(char *file, int flag) if (flag == 0) { if (me_universe == 0) { - if (compressed) pclose(fp); + if (compressed) platform::pclose(fp); else fclose(fp); } } else { if (me == 0 && ireplica) { - if (compressed) pclose(fp); + if (compressed) platform::pclose(fp); else fclose(fp); } } @@ -539,28 +542,17 @@ void NEB::readfile(char *file, int flag) /* ---------------------------------------------------------------------- universe proc 0 opens NEB data file - test if gzipped + test if compressed ------------------------------------------------------------------------- */ void NEB::open(char *file) { compressed = 0; - char *suffix = file + strlen(file) - 3; - if (suffix > file && strcmp(suffix,".gz") == 0) compressed = 1; - if (!compressed) fp = fopen(file,"r"); - else { -#ifdef LAMMPS_GZIP - auto gunzip = std::string("gzip -c -d ") + file; -#ifdef _WIN32 - fp = _popen(gunzip.c_str(),"rb"); -#else - fp = popen(gunzip.c_str(),"r"); -#endif - -#else - error->one(FLERR,"Cannot open gzipped file"); -#endif - } + if (platform::has_compress_extension(file)) { + compressed = 1; + fp = platform::compressed_read(file); + if (!fp) error->one(FLERR,"Cannot open compressed file"); + } else fp = fopen(file,"r"); if (fp == nullptr) error->one(FLERR,"Cannot open file {}: {}",file,utils::getsyserror()); diff --git a/src/REPLICA/tad.cpp b/src/REPLICA/tad.cpp index 9b6ecf0b0c..0b1cc915c6 100644 --- a/src/REPLICA/tad.cpp +++ b/src/REPLICA/tad.cpp @@ -710,7 +710,7 @@ void TAD::perform_neb(int ievent) // time_neb += timer->get_wall(Timer::TOTAL); MPI_Barrier(world); - double time_tmp = MPI_Wtime(); + double time_tmp = platform::walltime(); double dt_hold = update->dt; update->dt = dt_neb; @@ -718,7 +718,7 @@ void TAD::perform_neb(int ievent) update->dt = dt_hold; MPI_Barrier(world); - time_neb += MPI_Wtime() - time_tmp; + time_neb += platform::walltime() - time_tmp; if (universe->me == 0) { universe->ulogfile = ulogfile_lammps; @@ -840,11 +840,9 @@ void TAD::initialize_event_list() { void TAD::delete_event_list() { - for (int i = 0; i < n_event_list; i++) { - char str[128]; - sprintf(str,"tad_event_%d",i); - modify->delete_fix(str); - } + for (int i = 0; i < n_event_list; i++) + modify->delete_fix(fmt::format("tad_event_{}",i)); + memory->sfree(fix_event_list); fix_event_list = nullptr; n_event_list = 0; diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index db9767d01e..9c39518508 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -2281,7 +2281,7 @@ void FixRigid::readfile(int which, double *vec, if (fp == nullptr) error->one(FLERR,"Cannot open fix rigid file {}: {}", inpfile,utils::getsyserror()); - while (1) { + while (true) { eof = fgets(line,MAXLINE,fp); if (eof == nullptr) error->one(FLERR,"Unexpected end of fix rigid file"); start = &line[strspn(line," \t\n\v\f\r")]; diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 7216c56c83..5db24a96d5 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -391,14 +391,14 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // sets bodytag for owned atoms // body attributes are computed later by setup_bodies() - double time1 = MPI_Wtime(); + double time1 = platform::walltime(); create_bodies(bodyID); if (customflag) delete [] bodyID; if (comm->me == 0) utils::logmesg(lmp," create bodies CPU = {:.3f} seconds\n", - MPI_Wtime()-time1); + platform::walltime()-time1); // set nlocal_body and allocate bodies I own @@ -2451,7 +2451,7 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody) if (fp == nullptr) error->one(FLERR,"Cannot open fix rigid/small file {}: {}", inpfile,utils::getsyserror()); - while (1) { + while (true) { eof = fgets(line,MAXLINE,fp); if (eof == nullptr) error->one(FLERR,"Unexpected end of fix rigid/small file"); @@ -2563,8 +2563,7 @@ void FixRigidSmall::write_restart_file(const char *file) auto outfile = std::string(file) + ".rigid"; fp = fopen(outfile.c_str(),"w"); if (fp == nullptr) - error->one(FLERR,"Cannot open fix rigid restart file {}: {}", - outfile,utils::getsyserror()); + error->one(FLERR,"Cannot open fix rigid restart file {}: {}",outfile,utils::getsyserror()); fmt::print(fp,"# fix rigid mass, COM, inertia tensor info for " "{} bodies on timestep {}\n\n",nbody,update->ntimestep); diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index f1c1d30fc5..9e45ec13d8 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -222,13 +222,13 @@ FixShake::FixShake(LAMMPS *lmp, int narg, char **arg) : // identify all SHAKE clusters - double time1 = MPI_Wtime(); + double time1 = platform::walltime(); find_clusters(); if (comm->me == 0) utils::logmesg(lmp," find clusters CPU = {:.3f} seconds\n", - MPI_Wtime()-time1); + platform::walltime()-time1); // initialize list of SHAKE clusters to constrain diff --git a/src/SMTBQ/pair_smtbq.cpp b/src/SMTBQ/pair_smtbq.cpp index 4b7a1f2ac5..8922173433 100644 --- a/src/SMTBQ/pair_smtbq.cpp +++ b/src/SMTBQ/pair_smtbq.cpp @@ -2426,7 +2426,7 @@ void PairSMTBQ::Charge() ilist = list->ilist; - if (me == 0) t_init = MPI_Wtime(); + if (me == 0) t_init = platform::walltime(); if (step == 0) cluster = 0; // --------------------------- @@ -2729,7 +2729,7 @@ void PairSMTBQ::Charge() printf (" convergence : %f - %f\n",enegchk[gp],enegmax[gp]); } - t_end = MPI_Wtime(); + t_end = platform::walltime(); dt = t_end - t_init; printf (" temps dans charges : %f seconde. \n",dt); printf (" ======================================================== \n"); diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index fe24235a98..0ed3ad28c3 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -79,7 +79,10 @@ NEBSpin::~NEBSpin() MPI_Comm_free(&roots); memory->destroy(all); delete[] rdist; - if (fp) fclose(fp); + if (fp) { + if (compressed) platform::pclose(fp); + else fclose(fp); + } } /* ---------------------------------------------------------------------- @@ -384,7 +387,7 @@ void NEBSpin::readfile(char *file, int flag) if (flag == 0) { if (me_universe == 0) { open(file); - while (1) { + while (true) { eof = fgets(line,MAXLINE,fp); if (eof == nullptr) error->one(FLERR,"Unexpected end of neb/spin file"); start = &line[strspn(line," \t\n\v\f\r")]; @@ -398,7 +401,7 @@ void NEBSpin::readfile(char *file, int flag) if (me == 0) { if (ireplica) { open(file); - while (1) { + while (true) { eof = fgets(line,MAXLINE,fp); if (eof == nullptr) error->one(FLERR,"Unexpected end of neb/spin file"); start = &line[strspn(line," \t\n\v\f\r")]; @@ -552,12 +555,12 @@ void NEBSpin::readfile(char *file, int flag) if (flag == 0) { if (me_universe == 0) { - if (compressed) pclose(fp); + if (compressed) platform::pclose(fp); else fclose(fp); } } else { if (me == 0 && ireplica) { - if (compressed) pclose(fp); + if (compressed) platform::pclose(fp); else fclose(fp); } } @@ -684,28 +687,16 @@ int NEBSpin::initial_rotation(double *spi, double *sploc, double fraction) /* ---------------------------------------------------------------------- universe proc 0 opens NEBSpin data file - test if gzipped + test if compressed ------------------------------------------------------------------------- */ void NEBSpin::open(char *file) { compressed = 0; - char *suffix = file + strlen(file) - 3; - if (suffix > file && strcmp(suffix,".gz") == 0) compressed = 1; - if (!compressed) fp = fopen(file,"r"); - else { -#ifdef LAMMPS_GZIP - auto gunzip = std::string("gzip -c -d ") + file; -#ifdef _WIN32 - fp = _popen(gunzip.c_str(),"rb"); -#else - fp = popen(gunzip.c_str(),"r"); -#endif - -#else - error->one(FLERR,"Cannot open gzipped file"); -#endif - } + if (platform::has_compress_extension(file)) { + fp = platform::compressed_read(file); + if (!fp) error->one(FLERR,"Cannot open compressed file"); + } else fp = fopen(file,"r"); if (fp == nullptr) error->one(FLERR,"Cannot open file {}: {}",file,utils::getsyserror()); diff --git a/src/SPIN/pair_spin.cpp b/src/SPIN/pair_spin.cpp index 9731a447a6..74f7aaaf77 100644 --- a/src/SPIN/pair_spin.cpp +++ b/src/SPIN/pair_spin.cpp @@ -53,10 +53,6 @@ PairSpin::PairSpin(LAMMPS *lmp) : Pair(lmp), emag(nullptr) lattice_flag = 0; } -/* ---------------------------------------------------------------------- */ - -PairSpin::~PairSpin() {} - /* ---------------------------------------------------------------------- global settings ------------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin.h b/src/SPIN/pair_spin.h index 91262cdb5d..a9341bcb71 100644 --- a/src/SPIN/pair_spin.h +++ b/src/SPIN/pair_spin.h @@ -23,7 +23,7 @@ class PairSpin : public Pair { public: PairSpin(class LAMMPS *); - virtual ~PairSpin(); + virtual ~PairSpin() = default; virtual void settings(int, char **); virtual void coeff(int, char **) {} virtual void init_style(); diff --git a/src/SRD/fix_srd.cpp b/src/SRD/fix_srd.cpp index f1e17eaa24..48d7d55663 100644 --- a/src/SRD/fix_srd.cpp +++ b/src/SRD/fix_srd.cpp @@ -1433,7 +1433,7 @@ void FixSRD::collisions_multi() jlast = -1; dt = dt_big; - while (1) { + while (true) { nbig = nbinbig[ibin]; if (ibounce == 0) ncheck += nbig; @@ -2263,7 +2263,7 @@ void FixSRD::slip(double *vs, double *vb, double *xb, Big *big, double *xsurf, d double tangent[3], vsurf[3]; double *omega = big->omega; - while (1) { + while (true) { r1 = sigma * random->gaussian(); r2 = sigma * random->gaussian(); vnmag = sqrt(r1 * r1 + r2 * r2); @@ -2319,7 +2319,7 @@ void FixSRD::slip_wall(double *vs, int iwall, double *norm, double *vsnew) tangent2[1] = norm[2] * tangent1[0] - norm[0] * tangent1[2]; tangent2[2] = norm[0] * tangent1[1] - norm[1] * tangent1[0]; - while (1) { + while (true) { r1 = sigma * random->gaussian(); r2 = sigma * random->gaussian(); vnmag = sqrt(r1 * r1 + r2 * r2); @@ -2370,7 +2370,7 @@ void FixSRD::noslip(double *vs, double *vb, double *xb, Big *big, int iwall, dou tangent2[1] = norm[2] * tangent1[0] - norm[0] * tangent1[2]; tangent2[2] = norm[0] * tangent1[1] - norm[1] * tangent1[0]; - while (1) { + while (true) { r1 = sigma * random->gaussian(); r2 = sigma * random->gaussian(); vnmag = sqrt(r1 * r1 + r2 * r2); diff --git a/src/STUBS/mpi.cpp b/src/STUBS/mpi.cpp index e5cd50629e..3f4cc5964f 100644 --- a/src/STUBS/mpi.cpp +++ b/src/STUBS/mpi.cpp @@ -21,7 +21,13 @@ #include #include #include + +#if defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#else #include +#endif /* data structure for double/int */ @@ -167,7 +173,7 @@ int MPI_Finalize() double MPI_Wtime() { -#if defined(_MSC_VER) +#if defined(_WIN32) double t; t = GetTickCount(); diff --git a/src/VTK/dump_vtk.cpp b/src/VTK/dump_vtk.cpp index a7aabe3f51..54dc0d4b0e 100644 --- a/src/VTK/dump_vtk.cpp +++ b/src/VTK/dump_vtk.cpp @@ -31,6 +31,7 @@ #include "domain.h" #include "error.h" #include "fix.h" +#include "fix_store.h" #include "force.h" #include "group.h" #include "input.h" @@ -87,9 +88,9 @@ enum{X,Y,Z, // required for vtk, must come first Q,MUX,MUY,MUZ,MU,RADIUS,DIAMETER, OMEGAX,OMEGAY,OMEGAZ,ANGMOMX,ANGMOMY,ANGMOMZ, TQX,TQY,TQZ, - VARIABLE,COMPUTE,FIX,INAME,DNAME, + COMPUTE,FIX,VARIABLE,IVEC,DVEC,IARRAY,DARRAY, ATTRIBUTES}; // must come last -enum{LT,LE,GT,GE,EQ,NEQ}; +enum{LT,LE,GT,GE,EQ,NEQ,XOR}; enum{VTK,VTP,VTU,PVTP,PVTU}; // file formats #define ONEFIELD 32 @@ -119,11 +120,10 @@ DumpVTK::DumpVTK(LAMMPS *lmp, int narg, char **arg) : // ioptional = start of additional optional args // only dump image and dump movie styles process optional args - ioptional = parse_fields(narg,arg); + ioptional = parse_fields(nargnew,earg); - if (ioptional < narg && - strcmp(style,"image") != 0 && strcmp(style,"movie") != 0) - error->all(FLERR,"Invalid attribute in dump vtk command"); + if (ioptional < nargnew) + error->all(FLERR,"Invalid attribute {} in dump vtk command", earg[ioptional]); size_one = pack_choice.size(); current_pack_choice_key = -1; @@ -210,38 +210,40 @@ void DumpVTK::init_style() else write_choice = &DumpVTK::write_vtk; - // find current ptr for each compute,fix,variable + // find current ptr for each compute,fix,variable and custom atom property // check that fix frequency is acceptable - int icompute; for (int i = 0; i < ncompute; i++) { - icompute = modify->find_compute(id_compute[i]); + int icompute = modify->find_compute(id_compute[i]); if (icompute < 0) error->all(FLERR,"Could not find dump vtk compute ID"); compute[i] = modify->compute[icompute]; } - int ifix; for (int i = 0; i < nfix; i++) { - ifix = modify->find_fix(id_fix[i]); + int ifix = modify->find_fix(id_fix[i]); if (ifix < 0) error->all(FLERR,"Could not find dump vtk fix ID"); fix[i] = modify->fix[ifix]; if (nevery % modify->fix[ifix]->peratom_freq) error->all(FLERR,"Dump vtk and fix not computed at compatible times"); } - int ivariable; for (int i = 0; i < nvariable; i++) { - ivariable = input->variable->find(id_variable[i]); + int ivariable = input->variable->find(id_variable[i]); if (ivariable < 0) error->all(FLERR,"Could not find dump vtk variable name"); variable[i] = ivariable; } - int icustom; + int icustom,flag,cols; for (int i = 0; i < ncustom; i++) { - icustom = atom->find_custom(id_custom[i],flag_custom[i]); + icustom = atom->find_custom(id_custom[i],flag,cols); if (icustom < 0) error->all(FLERR,"Could not find custom per-atom property ID"); + custom[i] = icustom; + if (!flag && !cols) custom_flag[i] = IVEC; + else if (flag && !cols) custom_flag[i] = DVEC; + else if (!flag && cols) custom_flag[i] = IARRAY; + else if (flag && cols) custom_flag[i] = DARRAY; } // set index and check validity of region @@ -275,7 +277,7 @@ int DumpVTK::count() // grow choose and variable vbuf arrays if needed - int nlocal = atom->nlocal; + const int nlocal = atom->nlocal; if (atom->nmax > maxlocal) { maxlocal = atom->nmax; @@ -345,10 +347,10 @@ int DumpVTK::count() // un-choose if any threshold criterion isn't met if (nthresh) { - double *ptr; + double *ptr,*ptrhold; + double *values; double value; - int nstride; - int nlocal = atom->nlocal; + int nstride,lastflag; for (int ithresh = 0; ithresh < nthresh; ithresh++) { @@ -635,26 +637,22 @@ int DumpVTK::count() nstride = 1; } else if (thresh_array[ithresh] == MUX) { if (!atom->mu_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][0]; nstride = 4; } else if (thresh_array[ithresh] == MUY) { if (!atom->mu_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][1]; nstride = 4; } else if (thresh_array[ithresh] == MUZ) { if (!atom->mu_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][2]; nstride = 4; } else if (thresh_array[ithresh] == MU) { if (!atom->mu_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][3]; nstride = 4; @@ -753,9 +751,8 @@ int DumpVTK::count() nstride = 1; } else if (thresh_array[ithresh] == IVEC) { - int iwhich,flag,cols i = ATTRIBUTES + nfield + ithresh; - iwhich = atom->find_custom(id_custom[field2index[i]],flag,cols); + int iwhich = custom[field2index[i]]; int *ivector = atom->ivector[iwhich]; for (i = 0; i < nlocal; i++) dchoose[i] = ivector[i]; @@ -763,16 +760,14 @@ int DumpVTK::count() nstride = 1; } else if (thresh_array[ithresh] == DVEC) { - int iwhich,flag,cols; i = ATTRIBUTES + nfield + ithresh; - iwhich = atom->find_custom(id_custom[field2index[i]],flag,cols); + int iwhich = custom[field2index[i]]; ptr = atom->dvector[iwhich]; nstride = 1; } else if (thresh_array[ithresh] == IARRAY) { - int iwhich,flag,cols; i = ATTRIBUTES + nfield + ithresh; - iwhich = atom->find_custom(id_custom[field2index[i]],flag,cols); + int iwhich = custom[field2index[i]]; int **iarray = atom->iarray[iwhich]; int icol = argindex[i] - 1; for (i = 0; i < nlocal; i++) @@ -781,43 +776,99 @@ int DumpVTK::count() nstride = 1; } else if (thresh_array[ithresh] == DARRAY) { - int iwhich,flag,cols; i = ATTRIBUTES + nfield + ithresh; - iwhich = atom->find_custom(id_custom[field2index[i]],flag,cols) + int iwhich = custom[field2index[i]]; double **darray = atom->darray[iwhich]; ptr = &darray[0][argindex[i]-1]; nstride = atom->dcols[iwhich]; } // unselect atoms that don't meet threshold criterion + // compare to single value or values stored in threshfix + // copy ptr attribute into thresh_fix if this is first comparison - value = thresh_value[ithresh]; + if (thresh_last[ithresh] < 0) { + lastflag = 0; + value = thresh_value[ithresh]; + } else { + lastflag = 1; + int ilast = thresh_last[ithresh]; + values = thresh_fix[ilast]->vstore; + ptrhold = ptr; + if (thresh_first[ilast]) { + thresh_first[ilast] = 0; + for (i = 0; i < nlocal; i++, ptr += nstride) values[i] = *ptr; + ptr = ptrhold; + } + } - switch (thresh_op[ithresh]) { - case LT: - for (i = 0; i < nlocal; i++, ptr += nstride) - if (choose[i] && *ptr >= value) choose[i] = 0; - break; - case LE: - for (i = 0; i < nlocal; i++, ptr += nstride) - if (choose[i] && *ptr > value) choose[i] = 0; - break; - case GT: - for (i = 0; i < nlocal; i++, ptr += nstride) - if (choose[i] && *ptr <= value) choose[i] = 0; - break; - case GE: - for (i = 0; i < nlocal; i++, ptr += nstride) - if (choose[i] && *ptr < value) choose[i] = 0; - break; - case EQ: - for (i = 0; i < nlocal; i++, ptr += nstride) - if (choose[i] && *ptr != value) choose[i] = 0; - break; - case NEQ: - for (i = 0; i < nlocal; i++, ptr += nstride) - if (choose[i] && *ptr == value) choose[i] = 0; - break; + if (thresh_op[ithresh] == LT) { + if (lastflag) { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr >= values[i]) choose[i] = 0; + } else { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr >= value) choose[i] = 0; + } + } else if (thresh_op[ithresh] == LE) { + if (lastflag) { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr > values[i]) choose[i] = 0; + } else { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr > value) choose[i] = 0; + } + } else if (thresh_op[ithresh] == GT) { + if (lastflag) { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr <= values[i]) choose[i] = 0; + } else { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr <= value) choose[i] = 0; + } + } else if (thresh_op[ithresh] == GE) { + if (lastflag) { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr < values[i]) choose[i] = 0; + } else { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr < value) choose[i] = 0; + } + } else if (thresh_op[ithresh] == EQ) { + if (lastflag) { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr != values[i]) choose[i] = 0; + } else { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr != value) choose[i] = 0; + } + } else if (thresh_op[ithresh] == NEQ) { + if (lastflag) { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr == values[i]) choose[i] = 0; + } else { + for (i = 0; i < nlocal; i++, ptr += nstride) + if (choose[i] && *ptr == value) choose[i] = 0; + } + } else if (thresh_op[ithresh] == XOR) { + if (lastflag) { + for (i = 0; i < nlocal; i++, ptr += nstride) + if ((choose[i] && *ptr == 0.0 && values[i] == 0.0) || + (*ptr != 0.0 && values[i] != 0.0)) + choose[i] = 0; + } else { + for (i = 0; i < nlocal; i++, ptr += nstride) + if ((choose[i] && *ptr == 0.0 && value == 0.0) || + (*ptr != 0.0 && value != 0.0)) + choose[i] = 0; + } + } + + // update values stored in threshfix + + if (lastflag) { + ptr = ptrhold; + for (i = 0; i < nlocal; i++, ptr += nstride) values[i] = *ptr; } } } @@ -1754,15 +1805,16 @@ int DumpVTK::parse_fields(int narg, char **arg) } else { - int n,tmp; + int n,flag,cols; ArgInfo argi(arg[iarg],ArgInfo::COMPUTE|ArgInfo::FIX|ArgInfo::VARIABLE - |ArgInfo::DVEC|ArgInfo::IVEC); + |ArgInfo::DNAME|ArgInfo::INAME); argindex[ATTRIBUTES+i] = argi.get_index1(); + auto aname = argi.get_name(); switch (argi.get_type()) { case ArgInfo::UNKNOWN: - error->all(FLERR,"Invalid attribute in dump vtk command"); + error->all(FLERR,"Invalid attribute in dump vtk command: {}",arg[iarg]); break; // compute value = c_ID @@ -1772,21 +1824,19 @@ int DumpVTK::parse_fields(int narg, char **arg) pack_choice[ATTRIBUTES+i] = &DumpVTK::pack_compute; vtype[ATTRIBUTES+i] = Dump::DOUBLE; - n = modify->find_compute(argi.get_name()); - if (n < 0) error->all(FLERR,"Could not find dump vtk compute ID"); + n = modify->find_compute(aname); + if (n < 0) error->all(FLERR,"Could not find dump vtk compute ID: {}",aname); if (modify->compute[n]->peratom_flag == 0) - error->all(FLERR,"Dump vtk compute does not compute per-atom info"); + error->all(FLERR,"Dump vtk compute {} does not compute per-atom info",aname); if (argi.get_dim() == 0 && modify->compute[n]->size_peratom_cols > 0) - error->all(FLERR, - "Dump vtk compute does not calculate per-atom vector"); + error->all(FLERR,"Dump vtk compute {} does not calculate per-atom vector",aname); if (argi.get_dim() > 0 && modify->compute[n]->size_peratom_cols == 0) - error->all(FLERR, - "Dump vtk compute does not calculate per-atom array"); + error->all(FLERR,"Dump vtk compute {} does not calculate per-atom array",aname); if (argi.get_dim() > 0 && argi.get_index1() > modify->compute[n]->size_peratom_cols) - error->all(FLERR,"Dump vtk compute vector is accessed out-of-range"); + error->all(FLERR,"Dump vtk compute {} vector is accessed out-of-range",aname); - field2index[ATTRIBUTES+i] = add_compute(argi.get_name()); + field2index[ATTRIBUTES+i] = add_compute(aname); name[ATTRIBUTES+i] = arg[iarg]; break; @@ -1797,19 +1847,19 @@ int DumpVTK::parse_fields(int narg, char **arg) pack_choice[ATTRIBUTES+i] = &DumpVTK::pack_fix; vtype[ATTRIBUTES+i] = Dump::DOUBLE; - n = modify->find_fix(argi.get_name()); - if (n < 0) error->all(FLERR,"Could not find dump vtk fix ID"); + n = modify->find_fix(aname); + if (n < 0) error->all(FLERR,"Could not find dump vtk fix ID: {}",aname); if (modify->fix[n]->peratom_flag == 0) - error->all(FLERR,"Dump vtk fix does not compute per-atom info"); + error->all(FLERR,"Dump vtk fix {} does not compute per-atom info",aname); if (argi.get_dim() == 0 && modify->fix[n]->size_peratom_cols > 0) - error->all(FLERR,"Dump vtk fix does not compute per-atom vector"); + error->all(FLERR,"Dump vtk fix {} does not compute per-atom vector",aname); if (argi.get_dim() > 0 && modify->fix[n]->size_peratom_cols == 0) - error->all(FLERR,"Dump vtk fix does not compute per-atom array"); + error->all(FLERR,"Dump vtk fix {} does not compute per-atom array",aname); if (argi.get_dim() > 0 && argi.get_index1() > modify->fix[n]->size_peratom_cols) - error->all(FLERR,"Dump vtk fix vector is accessed out-of-range"); + error->all(FLERR,"Dump vtk fix {} vector is accessed out-of-range",aname); - field2index[ATTRIBUTES+i] = add_fix(argi.get_name()); + field2index[ATTRIBUTES+i] = add_fix(aname); name[ATTRIBUTES+i] = arg[iarg]; break; @@ -1819,61 +1869,62 @@ int DumpVTK::parse_fields(int narg, char **arg) pack_choice[ATTRIBUTES+i] = &DumpVTK::pack_variable; vtype[ATTRIBUTES+i] = Dump::DOUBLE; - n = input->variable->find(argi.get_name()); - if (n < 0) error->all(FLERR,"Could not find dump vtk variable name"); + n = input->variable->find(aname); + if (n < 0) error->all(FLERR,"Could not find dump vtk variable name {}",aname); if (input->variable->atomstyle(n) == 0) - error->all(FLERR,"Dump vtk variable is not atom-style variable"); + error->all(FLERR,"Dump vtk variable {} is not atom-style variable",aname); - field2index[ATTRIBUTES+i] = add_variable(argi.get_name()); + field2index[ATTRIBUTES+i] = add_variable(aname); name[ATTRIBUTES+i] = arg[iarg]; break; - // custom per-atom integer vector = i_ID - - case ArgInfo::INAME: - pack_choice[ATTRIBUTES+i] = &DumpVTK::pack_custom; - vtype[ATTRIBUTES+i] = Dump::INT; - - tmp = -1; - n = atom->find_custom(argi.get_name(),tmp); - if (n < 0) - error->all(FLERR,"Could not find custom per-atom property ID"); - - if (tmp != 0) - error->all(FLERR,"Custom per-atom property ID is not integer"); - - field2index[ATTRIBUTES+i] = add_custom(argi.get_name(),0); - name[ATTRIBUTES+i] = arg[iarg]; - break; - - // custom per-atom floating point vector = d_ID + // custom per-atom floating point vector or array = d_ID d2_ID case ArgInfo::DNAME: pack_choice[ATTRIBUTES+i] = &DumpVTK::pack_custom; vtype[ATTRIBUTES+i] = Dump::DOUBLE; - tmp = -1; - n = atom->find_custom(argi.get_name(),tmp); + n = atom->find_custom(aname,flag,cols); + if (n < 0) - error->all(FLERR,"Could not find custom per-atom property ID"); - - if (tmp != 1) - error->all(FLERR,"Custom per-atom property ID is not floating point"); - - field2index[ATTRIBUTES+i] = add_custom(argi.get_name(),1); + error->all(FLERR,"Could not find custom per-atom property ID: {}", aname); + if (argindex[ATTRIBUTES+i] == 0) { + if (!flag || cols) + error->all(FLERR,"Property double vector {} for dump vtk does not exist",aname); + } else { + if (!flag || !cols) + error->all(FLERR,"Property double array {} for dump vtk does not exist",aname); + if (argindex[ATTRIBUTES+i] > atom->dcols[n]) + error->all(FLERR,"Dump vtk property array {} is accessed out-of-range",aname); + } + field2index[ATTRIBUTES+i] = add_custom(aname,1); name[ATTRIBUTES+i] = arg[iarg]; break; - // NEWSTYLE - // custom per-atom integer array = i2_ID + // custom per-atom integer vector or array = i_ID or i2_ID - case ArgInfo::IARRAY: - return iarg; + case ArgInfo::INAME: + pack_choice[ATTRIBUTES+i] = &DumpVTK::pack_custom; + vtype[ATTRIBUTES+i] = Dump::INT; - // custom per-atom floating point array = d2_ID + n = atom->find_custom(aname,flag,cols); - case ArgInfo::DARRAY: - return iarg; + if (n < 0) + error->all(FLERR,"Could not find custom per-atom property ID: {}", aname); + if (argindex[ATTRIBUTES+i] == 0) { + if (flag || cols) + error->all(FLERR,"Property integer vector {} for dump vtk does not exist",aname); + } else { + if (flag || !cols) + error->all(FLERR,"Property integer array {} for dump vtk does not exist",aname); + if (argindex[ATTRIBUTES+i] > atom->icols[n]) + error->all(FLERR,"Dump vtk property array {} is accessed out-of-range",aname); + } + field2index[ATTRIBUTES+i] = add_custom(aname,0); + name[ATTRIBUTES+i] = arg[iarg]; + break; + + // no match default: return iarg; @@ -1948,12 +1999,10 @@ int DumpVTK::add_compute(const char *id) id_compute = (char **) memory->srealloc(id_compute,(ncompute+1)*sizeof(char *),"dump:id_compute"); - delete [] compute; + delete[] compute; compute = new Compute*[ncompute+1]; - int n = strlen(id) + 1; - id_compute[ncompute] = new char[n]; - strcpy(id_compute[ncompute],id); + id_compute[ncompute] = utils::strdup(id); ncompute++; return ncompute-1; } @@ -1973,12 +2022,10 @@ int DumpVTK::add_fix(const char *id) id_fix = (char **) memory->srealloc(id_fix,(nfix+1)*sizeof(char *),"dump:id_fix"); - delete [] fix; + delete[] fix; fix = new Fix*[nfix+1]; - int n = strlen(id) + 1; - id_fix[nfix] = new char[n]; - strcpy(id_fix[nfix],id); + id_fix[nfix] = utils::strdup(id); nfix++; return nfix-1; } @@ -1999,22 +2046,20 @@ int DumpVTK::add_variable(const char *id) id_variable = (char **) memory->srealloc(id_variable,(nvariable+1)*sizeof(char *), "dump:id_variable"); - delete [] variable; + delete[] variable; variable = new int[nvariable+1]; - delete [] vbuf; + delete[] vbuf; vbuf = new double*[nvariable+1]; for (int i = 0; i <= nvariable; i++) vbuf[i] = nullptr; - int n = strlen(id) + 1; - id_variable[nvariable] = new char[n]; - strcpy(id_variable[nvariable],id); + id_variable[nvariable] = utils::strdup(id); nvariable++; return nvariable-1; } /* ---------------------------------------------------------------------- add custom atom property to list used by dump - return index of where this property is in list + return index of where this property is in Atom class custom lists if already in list, do not add, just return index, else add to list ------------------------------------------------------------------------- */ @@ -2022,21 +2067,17 @@ int DumpVTK::add_custom(const char *id, int flag) { int icustom; for (icustom = 0; icustom < ncustom; icustom++) - if ((strcmp(id,id_custom[icustom]) == 0) - && (flag == flag_custom[icustom])) break; + if (strcmp(id,id_custom[icustom]) == 0) break; if (icustom < ncustom) return icustom; - id_custom = (char **) - memory->srealloc(id_custom,(ncustom+1)*sizeof(char *),"dump:id_custom"); - flag_custom = (int *) - memory->srealloc(flag_custom,(ncustom+1)*sizeof(int),"dump:flag_custom"); - - int n = strlen(id) + 1; - id_custom[ncustom] = new char[n]; - strcpy(id_custom[ncustom],id); - flag_custom[ncustom] = flag; + id_custom = (char **) memory->srealloc(id_custom,(ncustom+1)*sizeof(char *),"dump:id_custom"); + custom = (int *) memory->srealloc(custom,(ncustom+1)*sizeof(int),"dump:custom"); + custom_flag = (int *) memory->srealloc(custom_flag,(ncustom+1)*sizeof(int),"dump:custom_flag"); + id_custom[ncustom] = utils::strdup(id); + custom_flag[ncustom] = flag; ncustom++; + return ncustom-1; } @@ -2050,21 +2091,17 @@ int DumpVTK::modify_param(int narg, char **arg) else { iregion = domain->find_region(arg[1]); if (iregion == -1) - error->all(FLERR,"Dump_modify region ID does not exist"); - delete [] idregion; - int n = strlen(arg[1]) + 1; - idregion = new char[n]; - strcpy(idregion,arg[1]); + error->all(FLERR,"Dump_modify region ID {} does not exist",arg[1]); + delete[] idregion; + idregion = utils::strdup(arg[1]); } return 2; } if (strcmp(arg[0],"label") == 0) { if (narg < 2) error->all(FLERR,"Illegal dump_modify command [label]"); - delete [] label; - int n = strlen(arg[1]) + 1; - label = new char[n]; - strcpy(label,arg[1]); + delete[] label; + label = utils::strdup(arg[1]); return 2; } @@ -2076,23 +2113,29 @@ int DumpVTK::modify_param(int narg, char **arg) if (strcmp(arg[0],"element") == 0) { if (narg < ntypes+1) - error->all(FLERR,"Dump modify: number of element names do not match atom types"); - - if (typenames) { - for (int i = 1; i <= ntypes; i++) delete [] typenames[i]; - delete [] typenames; - typenames = nullptr; - } + error->all(FLERR,"Number of dump_modify element names does not match number of atom types"); + for (int i = 1; i <= ntypes; i++) delete[] typenames[i]; + delete[] typenames; typenames = new char*[ntypes+1]; for (int itype = 1; itype <= ntypes; itype++) { - int n = strlen(arg[itype]) + 1; - typenames[itype] = new char[n]; - strcpy(typenames[itype],arg[itype]); + typenames[itype] = utils::strdup(arg[itype]); } return ntypes+1; } + if (strcmp(arg[0],"refresh") == 0) { + if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); + ArgInfo argi(arg[1],ArgInfo::COMPUTE); + if ((argi.get_type() != ArgInfo::COMPUTE) || (argi.get_dim() != 0)) + error->all(FLERR,"Illegal dump_modify command"); + if (refreshflag) error->all(FLERR,"Dump_modify can only have one refresh"); + + refreshflag = 1; + refresh = argi.copy_name(); + return 2; + } + if (strcmp(arg[0],"thresh") == 0) { if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); if (strcmp(arg[1],"none") == 0) { @@ -2103,8 +2146,16 @@ int DumpVTK::modify_param(int narg, char **arg) thresh_array = nullptr; thresh_op = nullptr; thresh_value = nullptr; + thresh_last = nullptr; + for (int i = 0; i < nthreshlast; i++) { + modify->delete_fix(thresh_fixID[i]); + delete[] thresh_fixID[i]; + } + thresh_fix = nullptr; + thresh_fixID = nullptr; + thresh_first = nullptr; } - nthresh = 0; + nthresh = nthreshlast = 0; return 2; } @@ -2115,6 +2166,7 @@ int DumpVTK::modify_param(int narg, char **arg) memory->grow(thresh_array,nthresh+1,"dump:thresh_array"); memory->grow(thresh_op,(nthresh+1),"dump:thresh_op"); memory->grow(thresh_value,(nthresh+1),"dump:thresh_value"); + memory->grow(thresh_last,(nthresh+1),"dump:thresh_last"); // set attribute type of threshold // customize by adding to if statement @@ -2197,98 +2249,125 @@ int DumpVTK::modify_param(int narg, char **arg) else if (strcmp(arg[1],"tqy") == 0) thresh_array[nthresh] = TQY; else if (strcmp(arg[1],"tqz") == 0) thresh_array[nthresh] = TQZ; - // compute value = c_ID - // if no trailing [], then arg is set to 0, else arg is between [] + // compute or fix or variable or custom vector/array - else if (strncmp(arg[1],"c_",2) == 0) { - thresh_array[nthresh] = COMPUTE; - int n = strlen(arg[1]); - char *suffix = new char[n]; - strcpy(suffix,&arg[1][2]); + else { + int n,flag,cols; + ArgInfo argi(arg[1],ArgInfo::COMPUTE|ArgInfo::FIX|ArgInfo::VARIABLE + |ArgInfo::DNAME|ArgInfo::INAME); + argindex[ATTRIBUTES+nfield+nthresh] = argi.get_index1(); + auto aname = argi.get_name(); - char *ptr = strchr(suffix,'['); - if (ptr) { - if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Invalid attribute in dump modify command"); - argindex[ATTRIBUTES+nfield+nthresh] = atoi(ptr+1); - *ptr = '\0'; - } else argindex[ATTRIBUTES+nfield+nthresh] = 0; + switch (argi.get_type()) { - n = modify->find_compute(suffix); - if (n < 0) error->all(FLERR,"Could not find dump modify compute ID"); + case ArgInfo::UNKNOWN: + error->all(FLERR,"Invalid attribute in dump modify command"); + break; - if (modify->compute[n]->peratom_flag == 0) - error->all(FLERR, - "Dump modify compute ID does not compute per-atom info"); - if (argindex[ATTRIBUTES+nfield+nthresh] == 0 && - modify->compute[n]->size_peratom_cols > 0) - error->all(FLERR, - "Dump modify compute ID does not compute per-atom vector"); - if (argindex[ATTRIBUTES+nfield+nthresh] > 0 && - modify->compute[n]->size_peratom_cols == 0) - error->all(FLERR, - "Dump modify compute ID does not compute per-atom array"); - if (argindex[ATTRIBUTES+nfield+nthresh] > 0 && - argindex[ATTRIBUTES+nfield+nthresh] > modify->compute[n]->size_peratom_cols) - error->all(FLERR,"Dump modify compute ID vector is not large enough"); + // compute value = c_ID + // if no trailing [], then arg is set to 0, else arg is between [] - field2index[ATTRIBUTES+nfield+nthresh] = add_compute(suffix); - delete [] suffix; + case ArgInfo::COMPUTE: + thresh_array[nthresh] = COMPUTE; + n = modify->find_compute(aname); + if (n < 0) error->all(FLERR,"Could not find dump modify compute ID: {}",aname); - // fix value = f_ID - // if no trailing [], then arg is set to 0, else arg is between [] + if (modify->compute[n]->peratom_flag == 0) + error->all(FLERR,"Dump modify compute ID {} does not compute per-atom info",aname); + if (argi.get_dim() == 0 && modify->compute[n]->size_peratom_cols > 0) + error->all(FLERR,"Dump modify compute ID {} does not compute per-atom vector",aname); + if (argi.get_index1() > 0 && modify->compute[n]->size_peratom_cols == 0) + error->all(FLERR,"Dump modify compute ID {} does not compute per-atom array",aname); + if (argi.get_index1() > 0 && + argi.get_index1() > modify->compute[n]->size_peratom_cols) + error->all(FLERR,"Dump modify compute ID {} vector is not large enough",aname); - } else if (strncmp(arg[1],"f_",2) == 0) { - thresh_array[nthresh] = FIX; - int n = strlen(arg[1]); - char *suffix = new char[n]; - strcpy(suffix,&arg[1][2]); + field2index[ATTRIBUTES+nfield+nthresh] = add_compute(aname); + break; - char *ptr = strchr(suffix,'['); - if (ptr) { - if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Invalid attribute in dump modify command"); - argindex[ATTRIBUTES+nfield+nthresh] = atoi(ptr+1); - *ptr = '\0'; - } else argindex[ATTRIBUTES+nfield+nthresh] = 0; + // fix value = f_ID + // if no trailing [], then arg is set to 0, else arg is between [] - n = modify->find_fix(suffix); - if (n < 0) error->all(FLERR,"Could not find dump modify fix ID"); + case ArgInfo::FIX: + thresh_array[nthresh] = FIX; + n = modify->find_fix(aname); + if (n < 0) error->all(FLERR,"Could not find dump modify fix ID: {}",aname); - if (modify->fix[n]->peratom_flag == 0) - error->all(FLERR,"Dump modify fix ID does not compute per-atom info"); - if (argindex[ATTRIBUTES+nfield+nthresh] == 0 && - modify->fix[n]->size_peratom_cols > 0) - error->all(FLERR,"Dump modify fix ID does not compute per-atom vector"); - if (argindex[ATTRIBUTES+nfield+nthresh] > 0 && - modify->fix[n]->size_peratom_cols == 0) - error->all(FLERR,"Dump modify fix ID does not compute per-atom array"); - if (argindex[ATTRIBUTES+nfield+nthresh] > 0 && - argindex[ATTRIBUTES+nfield+nthresh] > modify->fix[n]->size_peratom_cols) - error->all(FLERR,"Dump modify fix ID vector is not large enough"); + if (modify->fix[n]->peratom_flag == 0) + error->all(FLERR,"Dump modify fix ID {} does not compute per-atom info",aname); + if (argi.get_dim() == 0 && modify->fix[n]->size_peratom_cols > 0) + error->all(FLERR,"Dump modify fix ID {} does not compute per-atom vector",aname); + if (argi.get_index1() > 0 && modify->fix[n]->size_peratom_cols == 0) + error->all(FLERR,"Dump modify fix ID {} does not compute per-atom array",aname); + if (argi.get_index1() > 0 && argi.get_index1() > modify->fix[n]->size_peratom_cols) + error->all(FLERR,"Dump modify fix ID {} vector is not large enough",aname); - field2index[ATTRIBUTES+nfield+nthresh] = add_fix(suffix); - delete [] suffix; + field2index[ATTRIBUTES+nfield+nthresh] = add_fix(aname); + break; - // variable value = v_ID + // variable value = v_ID - } else if (strncmp(arg[1],"v_",2) == 0) { - thresh_array[nthresh] = VARIABLE; - int n = strlen(arg[1]); - char *suffix = new char[n]; - strcpy(suffix,&arg[1][2]); + case ArgInfo::VARIABLE: + thresh_array[nthresh] = VARIABLE; + n = input->variable->find(aname); + if (n < 0) error->all(FLERR,"Could not find dump modify variable name: {}",aname); + if (input->variable->atomstyle(n) == 0) + error->all(FLERR,"Dump modify variable {} is not atom-style variable",aname); - argindex[ATTRIBUTES+nfield+nthresh] = 0; + field2index[ATTRIBUTES+nfield+nthresh] = add_variable(aname); + break; - n = input->variable->find(suffix); - if (n < 0) error->all(FLERR,"Could not find dump modify variable name"); - if (input->variable->atomstyle(n) == 0) - error->all(FLERR,"Dump modify variable is not atom-style variable"); + // custom per atom floating point vector or array - field2index[ATTRIBUTES+nfield+nthresh] = add_variable(suffix); - delete [] suffix; + case ArgInfo::DNAME: + n = atom->find_custom(aname,flag,cols); - } else error->all(FLERR,"Invalid dump_modify threshold operator"); + if (n < 0) + error->all(FLERR,"Could not find custom per-atom property ID: {}", aname); + if (argindex[ATTRIBUTES+nfield+nthresh] == 0) { + if (!flag || cols) + error->all(FLERR,"Property double vector for dump custom does not exist"); + thresh_array[nthresh] = DVEC; + } else { + if (!flag || !cols) + error->all(FLERR,"Property double array for dump custom does not exist"); + if (argindex[ATTRIBUTES+nfield+nthresh] > atom->dcols[n]) + error->all(FLERR,"Dump custom property array is accessed out-of-range"); + thresh_array[nthresh] = DARRAY; + } + + field2index[ATTRIBUTES+nfield+nthresh] = add_custom(aname,thresh_array[nthresh]); + break; + + // custom per atom integer vector or array + + case ArgInfo::INAME: + n = atom->find_custom(aname,flag,cols); + + if (n < 0) + error->all(FLERR,"Could not find custom per-atom property ID: {}", aname); + if (argindex[ATTRIBUTES+nfield+nthresh] == 0) { + if (flag || cols) + error->all(FLERR,"Property integer vector for dump custom does not exist"); + thresh_array[nthresh] = IVEC; + } else { + if (flag || !cols) + error->all(FLERR,"Property integer array for dump custom does not exist"); + if (argindex[ATTRIBUTES+nfield+nthresh] > atom->icols[n]) + error->all(FLERR,"Dump custom property array is accessed out-of-range"); + thresh_array[nthresh] = IARRAY; + } + + field2index[ATTRIBUTES+nfield+nthresh] = add_custom(aname,thresh_array[nthresh]); + break; + + // no match + + default: + error->all(FLERR,"Invalid dump_modify thresh attribute: {}",aname); + break; + } + } // set operation type of threshold @@ -2298,11 +2377,32 @@ int DumpVTK::modify_param(int narg, char **arg) else if (strcmp(arg[2],">=") == 0) thresh_op[nthresh] = GE; else if (strcmp(arg[2],"==") == 0) thresh_op[nthresh] = EQ; else if (strcmp(arg[2],"!=") == 0) thresh_op[nthresh] = NEQ; - else error->all(FLERR,"Invalid dump_modify threshold operator"); + else if (strcmp(arg[2],"|^") == 0) thresh_op[nthresh] = XOR; + else error->all(FLERR,"Invalid dump_modify thresh operator"); - // set threshold value + // set threshold value as number or special LAST keyword + // create FixStore to hold LAST values, should work with restart + // id = dump-ID + nthreshlast + DUMP_STORE, fix group = dump group - thresh_value[nthresh] = utils::numeric(FLERR,arg[3],false,lmp); + if (strcmp(arg[3],"LAST") != 0) { + thresh_value[nthresh] = utils::numeric(FLERR,arg[3],false,lmp); + thresh_last[nthresh] = -1; + } else { + thresh_fix = (FixStore **) + memory->srealloc(thresh_fix,(nthreshlast+1)*sizeof(FixStore *),"dump:thresh_fix"); + thresh_fixID = (char **) + memory->srealloc(thresh_fixID,(nthreshlast+1)*sizeof(char *),"dump:thresh_fixID"); + memory->grow(thresh_first,(nthreshlast+1),"dump:thresh_first"); + + std::string threshid = fmt::format("{}{}_DUMP_STORE",id,nthreshlast); + thresh_fixID[nthreshlast] = utils::strdup(threshid); + threshid += fmt::format(" {} STORE peratom 1 1", group->names[igroup]); + thresh_fix[nthreshlast] = (FixStore *) modify->add_fix(threshid); + + thresh_last[nthreshlast] = nthreshlast; + thresh_first[nthreshlast] = 1; + nthreshlast++; + } nthresh++; return 4; @@ -2387,25 +2487,35 @@ void DumpVTK::pack_variable(int n) void DumpVTK::pack_custom(int n) { - int index = field2index[n]; - - if (flag_custom[index] == 0) { // integer - int iwhich,tmp; - iwhich = atom->find_custom(id_custom[index],tmp); + int flag = custom_flag[field2index[current_pack_choice_key]]; + int iwhich = custom[field2index[current_pack_choice_key]]; + int index = argindex[current_pack_choice_key]; + if (flag == IVEC) { int *ivector = atom->ivector[iwhich]; for (int i = 0; i < nchoose; i++) { buf[n] = ivector[clist[i]]; n += size_one; } - } else if (flag_custom[index] == 1) { // double - int iwhich,tmp; - iwhich = atom->find_custom(id_custom[index],tmp); - + } else if (flag == DVEC) { double *dvector = atom->dvector[iwhich]; for (int i = 0; i < nchoose; i++) { buf[n] = dvector[clist[i]]; n += size_one; } + } else if (flag == IARRAY) { + index--; + int **iarray = atom->iarray[iwhich]; + for (int i = 0; i < nchoose; i++) { + buf[n] = iarray[clist[i]][index]; + n += size_one; + } + } else if (flag == DARRAY) { + index--; + double **darray = atom->darray[iwhich]; + for (int i = 0; i < nchoose; i++) { + buf[n] = darray[clist[i]][index]; + n += size_one; + } } } diff --git a/src/atom.cpp b/src/atom.cpp index 03c9cdda8a..080a57394c 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -266,6 +266,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp) map_hash = nullptr; unique_tags = nullptr; + reset_image_flag[0] = reset_image_flag[1] = reset_image_flag[2] = false; atom_style = nullptr; avec = nullptr; @@ -1147,7 +1148,6 @@ void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset, // remap atom into simulation box // if atom is in my sub-domain, unpack its values - int flagx = 0, flagy = 0, flagz = 0; for (int i = 0; i < n; i++) { next = strchr(buf,'\n'); @@ -1167,9 +1167,9 @@ void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset, imz = utils::inumeric(FLERR,values[iptr+2],false,lmp); if ((domain->dimension == 2) && (imz != 0)) error->all(FLERR,"Z-direction image flag must be 0 for 2d-systems"); - if ((!domain->xperiodic) && (imx != 0)) { flagx = 1; imx = 0; } - if ((!domain->yperiodic) && (imy != 0)) { flagy = 1; imy = 0; } - if ((!domain->zperiodic) && (imz != 0)) { flagz = 1; imz = 0; } + if ((!domain->xperiodic) && (imx != 0)) { reset_image_flag[0] = true; imx = 0; } + if ((!domain->yperiodic) && (imy != 0)) { reset_image_flag[1] = true; imy = 0; } + if ((!domain->zperiodic) && (imz != 0)) { reset_image_flag[2] = true; imz = 0; } } imagedata = ((imageint) (imx + IMGMAX) & IMGMASK) | (((imageint) (imy + IMGMAX) & IMGMASK) << IMGBITS) | @@ -1206,23 +1206,6 @@ void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset, buf = next + 1; } - - // warn if reading data with non-zero image flags for non-periodic boundaries. - // we may want to turn this into an error at some point, since this essentially - // creates invalid position information that works by accident most of the time. - - if (comm->me == 0) { - if (flagx) - error->warning(FLERR,"Non-zero imageflag(s) in x direction for " - "non-periodic boundary reset to zero"); - if (flagy) - error->warning(FLERR,"Non-zero imageflag(s) in y direction for " - "non-periodic boundary reset to zero"); - if (flagz) - error->warning(FLERR,"Non-zero imageflag(s) in z direction for " - "non-periodic boundary reset to zero"); - } - delete [] values; } @@ -1941,7 +1924,7 @@ void Atom::add_molecule(int narg, char **arg) int ifile = 1; int index = 1; - while (1) { + while (true) { molecules = (Molecule **) memory->srealloc(molecules,(nmolecule+1)*sizeof(Molecule *), "atom::molecules"); diff --git a/src/atom.h b/src/atom.h index 3046eb83ed..b90e1a1d70 100644 --- a/src/atom.h +++ b/src/atom.h @@ -277,6 +277,10 @@ class Atom : protected Pointers { int *sametag; // sametag[I] = next atom with same ID, -1 if no more + // true if image flags were reset to 0 during data_atoms() + + bool reset_image_flag[3]; + // AtomVec factory types and map typedef AtomVec *(*AtomVecCreator)(LAMMPS *); diff --git a/src/atom_vec_body.cpp b/src/atom_vec_body.cpp index a1ef126069..6308153be6 100644 --- a/src/atom_vec_body.cpp +++ b/src/atom_vec_body.cpp @@ -105,7 +105,7 @@ void AtomVecBody::process_args(int narg, char **arg) if (narg < 1) error->all(FLERR,"Invalid atom_style body command"); - if (0) { + if (false) { bptr = nullptr; #define BODY_CLASS diff --git a/src/balance.cpp b/src/balance.cpp index 06a3463db5..3f325dffe6 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -259,7 +259,7 @@ void Balance::command(int narg, char **arg) // must reset atom map after exchange() since it clears it MPI_Barrier(world); - double start_time = MPI_Wtime(); + double start_time = platform::walltime(); lmp->init(); @@ -386,7 +386,7 @@ void Balance::command(int narg, char **arg) if (me == 0) { std::string mesg = fmt::format(" rebalancing time: {:.3f} seconds\n", - MPI_Wtime()-start_time); + platform::walltime()-start_time); mesg += fmt::format(" iteration count = {}\n",niter); for (int i = 0; i < nimbalance; ++i) mesg += imbalances[i]->info(); mesg += fmt::format(" initial/final maximal load/proc = {:.8} {:.8}\n" @@ -930,7 +930,7 @@ int Balance::shift() // else add split I-1 or J+1 to set and try again // delta = size of expanded split set that will satisy criterion - while (1) { + while (true) { delta = (j-i) * close; midpt = 0.5 * (split[i]+split[j]); start = midpt - 0.5*delta; diff --git a/src/bond.cpp b/src/bond.cpp index e636ae9bf8..fb313f0170 100644 --- a/src/bond.cpp +++ b/src/bond.cpp @@ -270,7 +270,7 @@ void Bond::write_file(int narg, char **arg) // write out a line with "DATE:" and "UNITS:" tags // - if the file already exists, print a message about appending // while printing the date and check that units are consistent. - if (utils::file_is_readable(table_file)) { + if (platform::file_is_readable(table_file)) { std::string units = utils::get_potential_units(table_file,"table"); if (!units.empty() && (units != update->unit_style)) { error->one(FLERR,"Trying to append to a table file with UNITS: {} while units are {}", diff --git a/src/comm_tiled.cpp b/src/comm_tiled.cpp index 482b90c4c2..28ef37b008 100644 --- a/src/comm_tiled.cpp +++ b/src/comm_tiled.cpp @@ -1884,7 +1884,7 @@ void CommTiled::box_drop_brick(int idim, double *lo, double *hi, int &indexme) if (index < 0 || index > procgrid[idim]) error->one(FLERR,"Comm tiled invalid index in box drop brick"); - while (1) { + while (true) { lower = boxlo[idim] + prd[idim]*split[index]; if (index < procgrid[idim]-1) upper = boxlo[idim] + prd[idim]*split[index+1]; diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index 818d8657b8..cb39f61ce0 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -166,7 +166,7 @@ void ComputeAggregateAtom::compute_peratom() int change,done,anychange; - while (1) { + while (true) { comm->forward_comm_compute(this); // reverse communication when bonds are not stored on every processor @@ -175,7 +175,7 @@ void ComputeAggregateAtom::compute_peratom() comm->reverse_comm_compute(this); change = 0; - while (1) { + while (true) { done = 1; for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index 476af0bfa2..ca3fe1f453 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -164,11 +164,11 @@ void ComputeClusterAtom::compute_peratom() int change,done,anychange; - while (1) { + while (true) { comm->forward_comm_compute(this); change = 0; - while (1) { + while (true) { done = 1; for (ii = 0; ii < inum; ii++) { i = ilist[ii]; diff --git a/src/compute_fragment_atom.cpp b/src/compute_fragment_atom.cpp index 9ed57fef60..d361e29d41 100644 --- a/src/compute_fragment_atom.cpp +++ b/src/compute_fragment_atom.cpp @@ -150,7 +150,7 @@ void ComputeFragmentAtom::compute_peratom() int iteration = 0; - while (1) { + while (true) { iteration++; comm->forward_comm_compute(this); diff --git a/src/compute_orientorder_atom.cpp b/src/compute_orientorder_atom.cpp index d4291251b6..fd020e1865 100644 --- a/src/compute_orientorder_atom.cpp +++ b/src/compute_orientorder_atom.cpp @@ -181,6 +181,8 @@ void ComputeOrientOrderAtom::init() error->all(FLERR,"Compute orientorder/atom cutoff is " "longer than pairwise cutoff"); + memory->destroy(qnm_r); + memory->destroy(qnm_i); memory->create(qnm_r,nqlist,2*qmax+1,"orientorder/atom:qnm_r"); memory->create(qnm_i,nqlist,2*qmax+1,"orientorder/atom:qnm_i"); @@ -652,6 +654,7 @@ void ComputeOrientOrderAtom::init_clebsch_gordan() idxcg_count++; } idxcg_max = idxcg_count; + memory->destroy(cglist); memory->create(cglist, idxcg_max, "computeorientorderatom:cglist"); idxcg_count = 0; diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 8baf6f88f7..f21d1fc23d 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -378,7 +378,7 @@ void CreateAtoms::command(int narg, char **arg) // Record wall time for atom creation MPI_Barrier(world); - double time1 = MPI_Wtime(); + double time1 = platform::walltime(); // clear ghost count and any ghost bonus data internal to AtomVec // same logic as beginning of Comm::exchange() @@ -591,7 +591,7 @@ void CreateAtoms::command(int narg, char **arg) if (scaleflag) domain->print_box(" using lattice units in "); else domain->print_box(" using box units in "); utils::logmesg(lmp," create_atoms CPU = {:.3f} seconds\n", - MPI_Wtime() - time1); + platform::walltime() - time1); } } @@ -693,7 +693,7 @@ void CreateAtoms::add_random() int valid; for (int i = 0; i < nrandom; i++) { - while (1) { + while (true) { xone[0] = xlo + random->uniform() * (xhi-xlo); xone[1] = ylo + random->uniform() * (yhi-ylo); xone[2] = zlo + random->uniform() * (zhi-zlo); diff --git a/src/dump.cpp b/src/dump.cpp index 647fd3d38d..d00c42086d 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -108,9 +108,8 @@ Dump::Dump(LAMMPS *lmp, int /*narg*/, char **arg) : Pointers(lmp) // if contains '%', write one file per proc and replace % with proc-ID // if contains '*', write one file per timestep and replace * with timestep // check file suffixes - // if ends in .bin = binary file - // else if ends in .gz = gzipped text file - // else if ends in .zst = Zstd compressed text file + // if ends in .bin -> binary file + // else if ends in .gz or other known extensions -> compressed text file // else ASCII text file fp = nullptr; @@ -144,8 +143,7 @@ Dump::Dump(LAMMPS *lmp, int /*narg*/, char **arg) : Pointers(lmp) if (strchr(filename,'*')) multifile = 1; if (utils::strmatch(filename, "\\.bin$")) binary = 1; - if (utils::strmatch(filename, "\\.gz$") - || utils::strmatch(filename, "\\.zst$")) compressed = 1; + if (platform::has_compress_extension(filename)) compressed = 1; } /* ---------------------------------------------------------------------- */ @@ -198,7 +196,7 @@ Dump::~Dump() if (multifile == 0 && fp != nullptr) { if (compressed) { - if (filewriter) pclose(fp); + if (filewriter) platform::pclose(fp); } else { if (filewriter) fclose(fp); } @@ -520,7 +518,7 @@ void Dump::write() if (multifile) { if (compressed) { - if (filewriter && fp != nullptr) pclose(fp); + if (filewriter && fp != nullptr) platform::pclose(fp); } else { if (filewriter && fp != nullptr) fclose(fp); } @@ -530,7 +528,7 @@ void Dump::write() /* ---------------------------------------------------------------------- generic opening of a dump file - ASCII or binary or gzipped + ASCII or binary or compressed some derived classes override this function ------------------------------------------------------------------------- */ @@ -580,16 +578,7 @@ void Dump::openfile() if (filewriter) { if (compressed) { -#ifdef LAMMPS_GZIP - auto gzip = fmt::format("gzip -6 > {}",filecurrent); -#ifdef _WIN32 - fp = _popen(gzip.c_str(),"wb"); -#else - fp = popen(gzip.c_str(),"w"); -#endif -#else - error->one(FLERR,"Cannot open gzipped file"); -#endif + fp = platform::compressed_write(filecurrent); } else if (binary) { fp = fopen(filecurrent,"wb"); } else if (append_flag) { diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index b2acdbfc51..0e47671bb9 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -131,7 +131,7 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) : if (ioptional < nfield && strcmp(style,"image") != 0 && strcmp(style,"movie") != 0) - error->all(FLERR,"Invalid attribute in dump custom command"); + error->all(FLERR,"Invalid attribute {} in dump {} command",earg[ioptional],style); // noptional = # of optional args // reset nfield to subtract off optional args @@ -238,9 +238,8 @@ DumpCustom::~DumpCustom() for (int i = 0; i < ncustom; i++) delete[] id_custom[i]; memory->sfree(id_custom); - delete [] custom; - delete [] custom_flag; - + memory->sfree(custom); + memory->sfree(custom_flag); memory->destroy(choose); memory->destroy(dchoose); memory->destroy(clist); @@ -909,32 +908,27 @@ int DumpCustom::count() } else if (thresh_array[ithresh] == Q) { if (!atom->q_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = atom->q; nstride = 1; } else if (thresh_array[ithresh] == MUX) { if (!atom->mu_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][0]; nstride = 4; } else if (thresh_array[ithresh] == MUY) { if (!atom->mu_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][1]; nstride = 4; } else if (thresh_array[ithresh] == MUZ) { if (!atom->mu_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][2]; nstride = 4; } else if (thresh_array[ithresh] == MU) { if (!atom->mu_flag) - error->all(FLERR, - "Threshold for an atom property that isn't allocated"); + error->all(FLERR,"Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][3]; nstride = 4; @@ -1521,7 +1515,7 @@ int DumpCustom::parse_fields(int narg, char **arg) field2index[iarg] = add_variable(name); break; - // custom per-atom floating point vector or array + // custom per-atom floating point vector or array = d_ID d2_ID case ArgInfo::DNAME: pack_choice[iarg] = &DumpCustom::pack_custom; @@ -1533,18 +1527,18 @@ int DumpCustom::parse_fields(int narg, char **arg) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); if (argindex[iarg] == 0) { if (!flag || cols) - error->all(FLERR,"Property double vector for dump custom does not exist"); + error->all(FLERR,"Property double vector {} for dump custom does not exist",name); } else { if (!flag || !cols) - error->all(FLERR,"Property double array for dump custom does not exist"); + error->all(FLERR,"Property double array {} for dump custom does not exist",name); if (argindex[iarg] > atom->dcols[n]) - error->all(FLERR,"Dump custom property array is accessed out-of-range"); + error->all(FLERR,"Dump custom property array {} is accessed out-of-range",name); } field2index[iarg] = add_custom(name,1); break; - // custom per-atom integer vector or array + // custom per-atom integer vector or array = i_ID or i2_ID case ArgInfo::INAME: pack_choice[iarg] = &DumpCustom::pack_custom; @@ -1556,15 +1550,12 @@ int DumpCustom::parse_fields(int narg, char **arg) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); if (argindex[iarg] == 0) { if (flag || cols) - error->all(FLERR, - "Property integer vector for dump custom does not exist"); + error->all(FLERR,"Property integer vector {} for dump custom does not exist",name); } else { if (flag || !cols) - error->all(FLERR, - "Property integer array for dump custom does not exist"); + error->all(FLERR,"Property integer array {} for dump custom does not exist",name); if (argindex[iarg] > atom->icols[n]) - error->all(FLERR, - "Dump custom property array is accessed out-of-range"); + error->all(FLERR,"Dump custom property array {} is accessed out-of-range",name); } field2index[iarg] = add_custom(name,0); @@ -1574,6 +1565,7 @@ int DumpCustom::parse_fields(int narg, char **arg) default: return iarg; + break; } } } @@ -1667,13 +1659,9 @@ int DumpCustom::add_custom(const char *id, int flag) if (strcmp(id,id_custom[icustom]) == 0) break; if (icustom < ncustom) return icustom; - id_custom = (char **) - memory->srealloc(id_custom,(ncustom+1)*sizeof(char *),"dump:id_custom"); - - delete [] custom; - custom = new int[ncustom+1]; - delete [] custom_flag; - custom_flag = new int[ncustom+1]; + id_custom = (char **) memory->srealloc(id_custom,(ncustom+1)*sizeof(char *),"dump:id_custom"); + custom = (int *) memory->srealloc(custom,(ncustom+1)*sizeof(int),"dump:custom"); + custom_flag = (int *) memory->srealloc(custom_flag,(ncustom+1)*sizeof(int),"dump:custom_flag"); id_custom[ncustom] = utils::strdup(id); custom_flag[ncustom] = flag; @@ -1962,21 +1950,18 @@ int DumpCustom::modify_param(int narg, char **arg) if (n < 0) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); if (argindex[nfield+nthresh] == 0) { - if (flag || cols) - error->all(FLERR, - "Property double vector for dump custom does not exist"); + if (!flag || cols) + error->all(FLERR,"Property double vector for dump custom does not exist"); thresh_array[nthresh] = DVEC; } else { - if (flag || !cols) - error->all(FLERR, - "Property double array for dump custom does not exist"); + if (!flag || !cols) + error->all(FLERR,"Property double array for dump custom does not exist"); if (argindex[nfield+nthresh] > atom->dcols[n]) - error->all(FLERR, - "Dump custom property array is accessed out-of-range"); + error->all(FLERR,"Dump custom property array is accessed out-of-range"); thresh_array[nthresh] = DARRAY; } - field2index[nfield+nthresh] = add_custom(name,0); + field2index[nfield+nthresh] = add_custom(name,thresh_array[nthresh]); break; // custom per atom integer vector or array @@ -1988,20 +1973,17 @@ int DumpCustom::modify_param(int narg, char **arg) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); if (argindex[nfield+nthresh] == 0) { if (flag || cols) - error->all(FLERR, - "Property integer vector for dump custom does not exist"); + error->all(FLERR,"Property integer vector for dump custom does not exist"); thresh_array[nthresh] = IVEC; } else { if (flag || !cols) - error->all(FLERR, - "Property integer array for dump custom does not exist"); + error->all(FLERR,"Property integer array for dump custom does not exist"); if (argindex[nfield+nthresh] > atom->icols[n]) - error->all(FLERR, - "Dump custom property array is accessed out-of-range"); + error->all(FLERR,"Dump custom property array is accessed out-of-range"); thresh_array[nthresh] = IARRAY; } - field2index[nfield+nthresh] = add_custom(name,0); + field2index[nfield+nthresh] = add_custom(name,thresh_array[nthresh]); break; // no match diff --git a/src/dump_movie.cpp b/src/dump_movie.cpp index fb834b5fb0..52c0522289 100644 --- a/src/dump_movie.cpp +++ b/src/dump_movie.cpp @@ -41,28 +41,29 @@ DumpMovie::DumpMovie(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ +DumpMovie::~DumpMovie() +{ + if (fp) platform::pclose(fp); + fp = nullptr; +} + +/* ---------------------------------------------------------------------- */ + void DumpMovie::openfile() { - char moviecmd[1024]; - if ((comm->me == 0) && (fp == nullptr)) { #ifdef LAMMPS_FFMPEG - sprintf(moviecmd,"ffmpeg -v error -y -r %.2f -f image2pipe -c:v ppm -i - " - "-r 24.0 -b:v %dk %s ", framerate, bitrate, filename); + auto moviecmd = fmt::format("ffmpeg -v error -y -r {:.2f} -f image2pipe -c:v ppm -i - " + "-r 24.0 -b:v {}k {}", framerate, bitrate, filename); + fp = platform::popen(moviecmd,"w"); #else + fp = nullptr; error->one(FLERR,"Support for writing movies not included"); #endif -#if defined(_WIN32) - fp = _popen(moviecmd,"wb"); -#else - fp = popen(moviecmd,"w"); -#endif - if (fp == nullptr) - error->one(FLERR,"Failed to open FFmpeg pipeline to " - "file {}",filename); + error->one(FLERR,"Failed to open FFmpeg pipeline to file {}",filename); } } /* ---------------------------------------------------------------------- */ @@ -100,4 +101,3 @@ int DumpMovie::modify_param(int narg, char **arg) return 0; } - diff --git a/src/dump_movie.h b/src/dump_movie.h index 1c41cb09b5..770193e039 100644 --- a/src/dump_movie.h +++ b/src/dump_movie.h @@ -27,6 +27,7 @@ namespace LAMMPS_NS { class DumpMovie : public DumpImage { public: DumpMovie(LAMMPS *, int, char **); + virtual ~DumpMovie(); virtual void openfile(); virtual void init_style(); diff --git a/src/error.cpp b/src/error.cpp index 9811a1d3eb..5338f41cca 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -58,7 +58,8 @@ void Error::universe_all(const std::string &file, int line, const std::string &s std::string mesg = "ERROR: " + str; try { mesg += fmt::format(" ({}:{})\n",truncpath(file),line); - } catch (fmt::format_error &e) { + } catch (fmt::format_error &) { + ; // do nothing } if (universe->me == 0) { if (universe->uscreen) fputs(mesg.c_str(),universe->uscreen); @@ -147,9 +148,9 @@ void Error::all(const std::string &file, int line, const std::string &str) std::string mesg = "ERROR: " + str; if (input && input->line) lastcmd = input->line; try { - mesg += fmt::format(" ({}:{})\nLast command: {}\n", - truncpath(file),line,lastcmd); - } catch (fmt::format_error &e) { + mesg += fmt::format(" ({}:{})\nLast command: {}\n", truncpath(file),line,lastcmd); + } catch (fmt::format_error &) { + ; // do nothing } utils::logmesg(lmp,mesg); } diff --git a/src/exceptions.h b/src/exceptions.h index d05e14eeb7..1c9d8c8daf 100644 --- a/src/exceptions.h +++ b/src/exceptions.h @@ -26,17 +26,17 @@ class LAMMPSException : public std::exception { LAMMPSException(const std::string &msg) : message(msg) {} - ~LAMMPSException() throw() {} + ~LAMMPSException() noexcept {} - virtual const char *what() const throw() { return message.c_str(); } + virtual const char *what() const noexcept { return message.c_str(); } }; class LAMMPSAbortException : public LAMMPSException { public: MPI_Comm universe; - LAMMPSAbortException(const std::string &msg, MPI_Comm universe) : - LAMMPSException(msg), universe(universe) + LAMMPSAbortException(const std::string &msg, MPI_Comm _universe) : + LAMMPSException(msg), universe(_universe) { } }; diff --git a/src/file_writer.h b/src/file_writer.h index 473975d7fe..42e636d16f 100644 --- a/src/file_writer.h +++ b/src/file_writer.h @@ -39,9 +39,9 @@ class FileWriterException : public std::exception { public: FileWriterException(const std::string &msg) : message(msg) {} - ~FileWriterException() throw() {} + ~FileWriterException() noexcept {} - virtual const char *what() const throw() { return message.c_str(); } + virtual const char *what() const noexcept { return message.c_str(); } }; } // namespace LAMMPS_NS diff --git a/src/fix_ave_chunk.cpp b/src/fix_ave_chunk.cpp index 1328a27376..36c9eaf6fc 100644 --- a/src/fix_ave_chunk.cpp +++ b/src/fix_ave_chunk.cpp @@ -29,7 +29,6 @@ #include "variable.h" #include -#include using namespace LAMMPS_NS; using namespace FixConst; @@ -216,23 +215,23 @@ FixAveChunk::FixAveChunk(LAMMPS *lmp, int narg, char **arg) : iarg += 1; } else if (strcmp(arg[iarg],"format") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/chunk command"); - delete [] format_user; + delete[] format_user; format_user = utils::strdup(arg[iarg+1]); format = format_user; iarg += 2; } else if (strcmp(arg[iarg],"title1") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/chunk command"); - delete [] title1; + delete[] title1; title1 = utils::strdup(arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"title2") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/chunk command"); - delete [] title2; + delete[] title2; title2 = utils::strdup(arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"title3") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/chunk command"); - delete [] title3; + delete[] title3; title3 = utils::strdup(arg[iarg+1]); iarg += 2; } else error->all(FLERR,"Illegal fix ave/chunk command"); @@ -348,18 +347,18 @@ FixAveChunk::FixAveChunk(LAMMPS *lmp, int narg, char **arg) : if (ferror(fp)) error->one(FLERR,"Error writing file header"); - filepos = ftell(fp); + filepos = platform::ftell(fp); } - delete [] title1; - delete [] title2; - delete [] title3; + delete[] title1; + delete[] title2; + delete[] title3; // if wildcard expansion occurred, free earg memory from expand_args() // wait to do this until after file comment lines are printed if (expand) { - for (int i = 0; i < nargnew; i++) delete [] earg[i]; + for (int i = 0; i < nargnew; i++) delete[] earg[i]; memory->sfree(earg); } @@ -407,11 +406,11 @@ FixAveChunk::FixAveChunk(LAMMPS *lmp, int narg, char **arg) : FixAveChunk::~FixAveChunk() { - delete [] which; - delete [] argindex; - for (int i = 0; i < nvalues; i++) delete [] ids[i]; - delete [] ids; - delete [] value2index; + delete[] which; + delete[] argindex; + for (int i = 0; i < nvalues; i++) delete[] ids[i]; + delete[] ids; + delete[] value2index; if (fp && comm->me == 0) fclose(fp); @@ -438,7 +437,7 @@ FixAveChunk::~FixAveChunk() } } - delete [] idchunk; + delete[] idchunk; which = nullptr; argindex = nullptr; ids = nullptr; @@ -941,7 +940,7 @@ void FixAveChunk::end_of_step() if (fp && comm->me == 0) { clearerr(fp); - if (overwrite) fseek(fp,filepos,SEEK_SET); + if (overwrite) platform::fseek(fp,filepos); double count = 0.0; for (m = 0; m < nchunk; m++) count += count_total[m]; fprintf(fp,BIGINT_FORMAT " %d %g\n",ntimestep,nchunk,count); @@ -1027,9 +1026,9 @@ void FixAveChunk::end_of_step() fflush(fp); if (overwrite) { - long fileend = ftell(fp); - if ((fileend > 0) && (ftruncate(fileno(fp),fileend))) - perror("Error while tuncating output"); + bigint fileend = platform::ftell(fp); + if ((fileend > 0) && (platform::ftruncate(fp,fileend))) + error->warning(FLERR,"Error while tuncating output: {}", utils::getsyserror()); } } } diff --git a/src/fix_ave_chunk.h b/src/fix_ave_chunk.h index e7beed341f..69fdea0f06 100644 --- a/src/fix_ave_chunk.h +++ b/src/fix_ave_chunk.h @@ -61,7 +61,7 @@ class FixAveChunk : public Fix { class ComputeChunkAtom *cchunk; int lockforever; - long filepos; + bigint filepos; int maxvar; double *varatom; diff --git a/src/fix_ave_correlate.cpp b/src/fix_ave_correlate.cpp index 92b5ea3693..df6e33288e 100644 --- a/src/fix_ave_correlate.cpp +++ b/src/fix_ave_correlate.cpp @@ -30,7 +30,6 @@ #include "variable.h" #include -#include using namespace LAMMPS_NS; using namespace FixConst; @@ -139,17 +138,17 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS * lmp, int narg, char **arg): iarg += 1; } else if (strcmp(arg[iarg],"title1") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/correlate command"); - delete [] title1; + delete[] title1; title1 = utils::strdup(arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"title2") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/correlate command"); - delete [] title2; + delete[] title2; title2 = utils::strdup(arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"title3") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/correlate command"); - delete [] title3; + delete[] title3; title3 = utils::strdup(arg[iarg+1]); iarg += 2; } else error->all(FLERR,"Illegal fix ave/correlate command"); @@ -256,18 +255,18 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS * lmp, int narg, char **arg): if (ferror(fp)) error->one(FLERR,"Error writing file header"); - filepos = ftell(fp); + filepos = platform::ftell(fp); } - delete [] title1; - delete [] title2; - delete [] title3; + delete[] title1; + delete[] title2; + delete[] title3; // if wildcard expansion occurred, free earg memory from expand_args() // wait to do this until after file comment lines are printed if (expand) { - for (int i = 0; i < nargnew; i++) delete [] earg[i]; + for (int i = 0; i < nargnew; i++) delete[] earg[i]; memory->sfree(earg); } @@ -312,11 +311,11 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS * lmp, int narg, char **arg): FixAveCorrelate::~FixAveCorrelate() { - delete [] which; - delete [] argindex; - delete [] value2index; - for (int i = 0; i < nvalues; i++) delete [] ids[i]; - delete [] ids; + delete[] which; + delete[] argindex; + delete[] value2index; + for (int i = 0; i < nvalues; i++) delete[] ids[i]; + delete[] ids; memory->destroy(values); memory->destroy(count); @@ -489,7 +488,7 @@ void FixAveCorrelate::end_of_step() if (fp && me == 0) { clearerr(fp); - if (overwrite) fseek(fp,filepos,SEEK_SET); + if (overwrite) platform::fseek(fp,filepos); fprintf(fp,BIGINT_FORMAT " %d\n",ntimestep,nrepeat); for (i = 0; i < nrepeat; i++) { fprintf(fp,"%d %d %d",i+1,i*nevery,count[i]); @@ -507,9 +506,9 @@ void FixAveCorrelate::end_of_step() fflush(fp); if (overwrite) { - long fileend = ftell(fp); - if ((fileend > 0) && (ftruncate(fileno(fp),fileend))) - perror("Error while tuncating output"); + bigint fileend = platform::ftell(fp); + if ((fileend > 0) && (platform::ftruncate(fp,fileend))) + error->warning(FLERR,"Error while tuncating output: {}", utils::getsyserror()); } } diff --git a/src/fix_ave_correlate.h b/src/fix_ave_correlate.h index d551ba7b92..6dde75c0d3 100644 --- a/src/fix_ave_correlate.h +++ b/src/fix_ave_correlate.h @@ -44,7 +44,7 @@ class FixAveCorrelate : public Fix { int type, ave, startstep, overwrite; double prefactor; - long filepos; + bigint filepos; int firstindex; // index in values ring of earliest time sample int lastindex; // index in values ring of latest time sample diff --git a/src/fix_ave_histo.cpp b/src/fix_ave_histo.cpp index 92b03035b3..8c55337074 100644 --- a/src/fix_ave_histo.cpp +++ b/src/fix_ave_histo.cpp @@ -25,7 +25,6 @@ #include "variable.h" #include -#include using namespace LAMMPS_NS; using namespace FixConst; @@ -168,7 +167,7 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : // if wildcard expansion occurred, free earg memory from expand_args() if (expand) { - for (int i = 0; i < nvalues; i++) delete [] earg[i]; + for (int i = 0; i < nvalues; i++) delete[] earg[i]; memory->sfree(earg); } @@ -434,12 +433,12 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : if (ferror(fp)) error->one(FLERR,"Error writing file header"); - filepos = ftell(fp); + filepos = platform::ftell(fp); } - delete [] title1; - delete [] title2; - delete [] title3; + delete[] title1; + delete[] title2; + delete[] title3; // allocate and initialize memory for averaging @@ -502,18 +501,18 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : FixAveHisto::~FixAveHisto() { - delete [] which; - delete [] argindex; - delete [] value2index; - for (int i = 0; i < nvalues; i++) delete [] ids[i]; - delete [] ids; + delete[] which; + delete[] argindex; + delete[] value2index; + for (int i = 0; i < nvalues; i++) delete[] ids[i]; + delete[] ids; if (fp && me == 0) fclose(fp); - delete [] bin; - delete [] bin_total; - delete [] bin_all; - delete [] coord; + delete[] bin; + delete[] bin_total; + delete[] bin_all; + delete[] coord; memory->destroy(stats_list); memory->destroy(bin_list); memory->destroy(vector); @@ -817,7 +816,7 @@ void FixAveHisto::end_of_step() if (fp && me == 0) { clearerr(fp); - if (overwrite) fseek(fp,filepos,SEEK_SET); + if (overwrite) platform::fseek(fp,filepos); fprintf(fp,BIGINT_FORMAT " %d %g %g %g %g\n",ntimestep,nbins, stats_total[0],stats_total[1],stats_total[2],stats_total[3]); if (stats_total[0] != 0.0) @@ -833,9 +832,9 @@ void FixAveHisto::end_of_step() fflush(fp); if (overwrite) { - long fileend = ftell(fp); - if ((fileend > 0) && (ftruncate(fileno(fp),fileend))) - perror("Error while tuncating output"); + bigint fileend = platform::ftell(fp); + if ((fileend > 0) && (platform::ftruncate(fp,fileend))) + error->warning(FLERR,"Error while tuncating output: {}",utils::getsyserror()); } } } @@ -993,17 +992,17 @@ void FixAveHisto::options(int iarg, int narg, char **arg) iarg += 1; } else if (strcmp(arg[iarg],"title1") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/histo command"); - delete [] title1; + delete[] title1; title1 = utils::strdup(arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"title2") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/histo command"); - delete [] title2; + delete[] title2; title2 = utils::strdup(arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"title3") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/histo command"); - delete [] title3; + delete[] title3; title3 = utils::strdup(arg[iarg+1]); iarg += 2; } else error->all(FLERR,"Illegal fix ave/histo command"); diff --git a/src/fix_ave_histo.h b/src/fix_ave_histo.h index 0158d04377..ef64ad74ff 100644 --- a/src/fix_ave_histo.h +++ b/src/fix_ave_histo.h @@ -44,7 +44,7 @@ class FixAveHisto : public Fix { FILE *fp; double lo, hi, binsize, bininv; int kind, beyond, overwrite; - long filepos; + bigint filepos; double stats[4], stats_total[4], stats_all[4]; double **stats_list; diff --git a/src/fix_ave_histo_weight.cpp b/src/fix_ave_histo_weight.cpp index 63321bf53e..7866490840 100644 --- a/src/fix_ave_histo_weight.cpp +++ b/src/fix_ave_histo_weight.cpp @@ -28,8 +28,6 @@ #include "update.h" #include "variable.h" -#include - using namespace LAMMPS_NS; using namespace FixConst; @@ -472,7 +470,7 @@ void FixAveHistoWeight::end_of_step() if (fp && me == 0) { clearerr(fp); - if (overwrite) fseek(fp,filepos,SEEK_SET); + if (overwrite) platform::fseek(fp,filepos); fprintf(fp,BIGINT_FORMAT " %d %g %g %g %g\n",ntimestep,nbins, stats_total[0],stats_total[1],stats_total[2],stats_total[3]); if (stats_total[0] != 0.0) @@ -488,9 +486,9 @@ void FixAveHistoWeight::end_of_step() fflush(fp); if (overwrite) { - long fileend = ftell(fp); - if ((fileend > 0) && (ftruncate(fileno(fp),fileend))) - perror("Error while tuncating output"); + bigint fileend = platform::ftell(fp); + if ((fileend > 0) && (platform::ftruncate(fp,fileend))) + error->warning(FLERR,"Error while tuncating output: {}", utils::getsyserror()); } } } diff --git a/src/fix_ave_time.cpp b/src/fix_ave_time.cpp index da9cd89e5e..a3da6e6a3d 100644 --- a/src/fix_ave_time.cpp +++ b/src/fix_ave_time.cpp @@ -28,7 +28,6 @@ #include "variable.h" #include -#include using namespace LAMMPS_NS; using namespace FixConst; @@ -274,18 +273,18 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : if (ferror(fp)) error->one(FLERR,"Error writing file header"); - filepos = ftell(fp); + filepos = platform::ftell(fp); } - delete [] title1; - delete [] title2; - delete [] title3; + delete[] title1; + delete[] title2; + delete[] title3; // if wildcard expansion occurred, free earg memory from expand_args() // wait to do this until after file comment lines are printed if (expand) { - for (int i = 0; i < nvalues; i++) delete [] earg[i]; + for (int i = 0; i < nvalues; i++) delete[] earg[i]; memory->sfree(earg); } @@ -446,24 +445,24 @@ FixAveTime::~FixAveTime() } } - delete [] format_user; + delete[] format_user; - delete [] which; - delete [] argindex; - delete [] value2index; - delete [] offcol; - delete [] varlen; - for (int i = 0; i < nvalues; i++) delete [] ids[i]; - delete [] ids; + delete[] which; + delete[] argindex; + delete[] value2index; + delete[] offcol; + delete[] varlen; + for (int i = 0; i < nvalues; i++) delete[] ids[i]; + delete[] ids; - delete [] extlist; + delete[] extlist; if (fp && me == 0) fclose(fp); memory->destroy(column); - delete [] vector; - delete [] vector_total; + delete[] vector; + delete[] vector_total; memory->destroy(array); memory->destroy(array_total); memory->destroy(array_list); @@ -673,7 +672,7 @@ void FixAveTime::invoke_scalar(bigint ntimestep) if (fp && me == 0) { clearerr(fp); - if (overwrite) fseek(fp,filepos,SEEK_SET); + if (overwrite) platform::fseek(fp,filepos); fprintf(fp,BIGINT_FORMAT,ntimestep); for (i = 0; i < nvalues; i++) fprintf(fp,format,vector_total[i]/norm); fprintf(fp,"\n"); @@ -683,9 +682,9 @@ void FixAveTime::invoke_scalar(bigint ntimestep) fflush(fp); if (overwrite) { - long fileend = ftell(fp); - if ((fileend > 0) && (ftruncate(fileno(fp),fileend))) - perror("Error while tuncating output"); + bigint fileend = platform::ftell(fp); + if ((fileend > 0) && (platform::ftruncate(fp,fileend))) + error->warning(FLERR,"Error while tuncating output: {}", utils::getsyserror()); } } } @@ -885,7 +884,7 @@ void FixAveTime::invoke_vector(bigint ntimestep) // output result to file if (fp && me == 0) { - if (overwrite) fseek(fp,filepos,SEEK_SET); + if (overwrite) platform::fseek(fp,filepos); fprintf(fp,BIGINT_FORMAT " %d\n",ntimestep,nrows); for (i = 0; i < nrows; i++) { fprintf(fp,"%d",i+1); @@ -894,9 +893,9 @@ void FixAveTime::invoke_vector(bigint ntimestep) } fflush(fp); if (overwrite) { - long fileend = ftell(fp); - if ((fileend > 0) && (ftruncate(fileno(fp),fileend))) - perror("Error while tuncating output"); + bigint fileend = platform::ftell(fp); + if ((fileend > 0) && (platform::ftruncate(fp,fileend))) + error->warning(FLERR,"Error while tuncating output: {}", utils::getsyserror()); } } } @@ -1066,23 +1065,23 @@ void FixAveTime::options(int iarg, int narg, char **arg) iarg += 1; } else if (strcmp(arg[iarg],"format") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/time command"); - delete [] format_user; + delete[] format_user; format_user = utils::strdup(arg[iarg+1]); format = format_user; iarg += 2; } else if (strcmp(arg[iarg],"title1") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/spatial command"); - delete [] title1; + delete[] title1; title1 = utils::strdup(arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"title2") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/spatial command"); - delete [] title2; + delete[] title2; title2 = utils::strdup(arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"title3") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/spatial command"); - delete [] title3; + delete[] title3; title3 = utils::strdup(arg[iarg+1]); iarg += 2; } else error->all(FLERR,"Illegal fix ave/time command"); diff --git a/src/fix_ave_time.h b/src/fix_ave_time.h index 391a06f495..3a26dd6d70 100644 --- a/src/fix_ave_time.h +++ b/src/fix_ave_time.h @@ -54,7 +54,7 @@ class FixAveTime : public Fix { int *offlist; char *format, *format_user; char *title1, *title2, *title3; - long filepos; + bigint filepos; int norm, iwindow, window_limit; double *vector; diff --git a/src/fix_efield.cpp b/src/fix_efield.cpp index f752585206..6fa3fc5297 100644 --- a/src/fix_efield.cpp +++ b/src/fix_efield.cpp @@ -19,25 +19,24 @@ #include "fix_efield.h" -#include #include "atom.h" -#include "update.h" -#include "domain.h" #include "comm.h" -#include "modify.h" -#include "force.h" -#include "respa.h" -#include "input.h" -#include "variable.h" -#include "region.h" -#include "memory.h" +#include "domain.h" #include "error.h" +#include "force.h" +#include "input.h" +#include "memory.h" +#include "modify.h" +#include "region.h" +#include "respa.h" +#include "update.h" +#include "variable.h" + +#include using namespace LAMMPS_NS; using namespace FixConst; -enum{NONE,CONSTANT,EQUAL,ATOM}; - /* ---------------------------------------------------------------------- */ FixEfield::FixEfield(LAMMPS *lmp, int narg, char **arg) : @@ -111,6 +110,8 @@ FixEfield::FixEfield(LAMMPS *lmp, int narg, char **arg) : maxatom = atom->nmax; memory->create(efield,maxatom,4,"efield:efield"); + + maxatom_energy = 0; } /* ---------------------------------------------------------------------- */ @@ -199,9 +200,7 @@ void FixEfield::init() error->all(FLERR,"Fix efield with dipoles cannot use atom-style variables"); if (muflag && update->whichflag == 2 && comm->me == 0) - error->warning(FLERR, - "The minimizer does not re-orient dipoles " - "when using fix efield"); + error->warning(FLERR, "The minimizer does not re-orient dipoles when using fix efield"); if (varflag == CONSTANT && estyle != NONE) error->all(FLERR,"Cannot use variable energy with " @@ -449,3 +448,4 @@ double FixEfield::compute_vector(int n) } return fsum_all[n+1]; } + diff --git a/src/fix_efield.h b/src/fix_efield.h index c9496e29d2..20201518ab 100644 --- a/src/fix_efield.h +++ b/src/fix_efield.h @@ -25,6 +25,7 @@ FixStyle(efield,FixEfield); namespace LAMMPS_NS { class FixEfield : public Fix { + friend class FixQEqReaxFF; public: FixEfield(class LAMMPS *, int, char **); ~FixEfield(); @@ -39,7 +40,9 @@ class FixEfield : public Fix { double compute_scalar(); double compute_vector(int); - private: + enum { NONE, CONSTANT, EQUAL, ATOM }; + + protected: double ex, ey, ez; int varflag, iregion; char *xstr, *ystr, *zstr, *estr; @@ -49,7 +52,7 @@ class FixEfield : public Fix { double qe2f; int qflag, muflag; - int maxatom; + int maxatom, maxatom_energy; double **efield; int force_flag; diff --git a/src/info.cpp b/src/info.cpp index 137bf44b1a..a726b2f00b 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -282,7 +282,7 @@ void Info::command(int narg, char **arg) fmt::print(out,"Git info: {} / {} / {}\n", lmp->git_branch, lmp->git_descriptor,lmp->git_commit); - fmt::print(out,"\nOS information: {}\n\n",get_os_info()); + fmt::print(out,"\nOS information: {}\n\n",platform::os_info()); fmt::print(out,"sizeof(smallint): {}-bit\n" "sizeof(imageint): {}-bit\n" @@ -292,13 +292,14 @@ void Info::command(int narg, char **arg) sizeof(tagint)*8, sizeof(bigint)*8); fmt::print(out,"\nCompiler: {} with {}\nC++ standard: {}\n", - get_compiler_info(),get_openmp_info(),get_cxx_info()); + platform::compiler_info(),platform::openmp_standard(),platform::cxx_standard()); fputs("\nActive compile time flags:\n\n",out); if (has_gzip_support()) fputs("-DLAMMPS_GZIP\n",out); if (has_png_support()) fputs("-DLAMMPS_PNG\n",out); if (has_jpeg_support()) fputs("-DLAMMPS_JPEG\n",out); if (has_ffmpeg_support()) fputs("-DLAMMPS_FFMPEG\n",out); + if (has_fft_single_support()) fputs("-DFFT_SINGLE\n",out); if (has_exceptions()) fputs("-DLAMMPS_EXCEPTIONS\n",out); #if defined(LAMMPS_BIGBIG) @@ -308,6 +309,7 @@ void Info::command(int narg, char **arg) #else // defined(LAMMPS_SMALLSMALL) fputs("-DLAMMPS_SMALLSMALL\n",out); #endif + if (has_gzip_support()) fmt::print(out,"\n{}\n",platform::compress_info()); int ncword, ncline = 0; fputs("\nInstalled packages:\n\n",out); @@ -353,7 +355,7 @@ void Info::command(int narg, char **arg) if (flags & COMM) { int major,minor; - std::string version = get_mpi_info(major,minor); + std::string version = platform::mpi_info(major,minor); fmt::print(out,"\nCommunication information:\n" "MPI library level: MPI v{}.{}\n" @@ -635,24 +637,8 @@ void Info::command(int narg, char **arg) } if (flags & TIME) { - double wallclock = MPI_Wtime() - lmp->initclock; - double cpuclock = 0.0; - -#if defined(_WIN32) - // from MSD docs. - FILETIME ct,et,kt,ut; - union { FILETIME ft; uint64_t ui; } cpu; - if (GetProcessTimes(GetCurrentProcess(),&ct,&et,&kt,&ut)) { - cpu.ft = ut; - cpuclock = cpu.ui * 0.0000001; - } -#else /* POSIX */ - struct rusage ru; - if (getrusage(RUSAGE_SELF, &ru) == 0) { - cpuclock = (double) ru.ru_utime.tv_sec; - cpuclock += (double) ru.ru_utime.tv_usec * 0.000001; - } -#endif /* ! _WIN32 */ + double wallclock = platform::walltime() - lmp->initclock; + double cpuclock = platform::cputime(); int cpuh,cpum,cpus,wallh,wallm,walls; cpus = fmod(cpuclock,60.0); @@ -895,6 +881,8 @@ bool Info::is_available(const char *category, const char *name) return has_jpeg_support(); } else if (strcmp(name,"ffmpeg") == 0) { return has_ffmpeg_support(); + } else if (strcmp(name,"fft_single") == 0) { + return has_fft_single_support(); } else if (strcmp(name,"exceptions") == 0) { return has_exceptions(); } @@ -1027,7 +1015,7 @@ std::vector Info::get_available_styles(const std::string &category) } else if (category == "command") { return get_style_names(input->command_map); } - return std::vector(); + return {}; } template @@ -1143,6 +1131,14 @@ bool Info::has_ffmpeg_support() { #endif } +bool Info::has_fft_single_support() { +#ifdef FFT_SINGLE + return true; +#else + return false; +#endif +} + bool Info::has_exceptions() { #ifdef LAMMPS_EXCEPTIONS return true; @@ -1162,12 +1158,14 @@ bool Info::has_package(const std::string &package_name) { #if defined(LMP_GPU) extern bool lmp_gpu_config(const std::string &, const std::string &); -extern bool lmp_has_gpu_device(); +extern bool lmp_has_compatible_gpu_device(); extern std::string lmp_gpu_device_info(); +// we will only report compatible GPUs, i.e. when a GPU device is +// available *and* supports the required floating point precision bool Info::has_gpu_device() { - return lmp_has_gpu_device(); + return lmp_has_compatible_gpu_device(); } std::string Info::get_gpu_device_info() @@ -1266,200 +1264,6 @@ bool Info::has_accelerator_feature(const std::string &package, return false; } -/* ---------------------------------------------------------------------- */ -#define _INFOBUF_SIZE 256 - -std::string Info::get_os_info() -{ - std::string buf; - -#if defined(_WIN32) - DWORD fullversion,majorv,minorv,buildv=0; - - fullversion = GetVersion(); - majorv = (DWORD) (LOBYTE(LOWORD(fullversion))); - minorv = (DWORD) (HIBYTE(LOWORD(fullversion))); - if (fullversion < 0x80000000) - buildv = (DWORD) (HIWORD(fullversion)); - - buf = fmt::format("Windows {}.{} ({}) on ",majorv,minorv,buildv); - - SYSTEM_INFO si; - GetSystemInfo(&si); - - switch (si.wProcessorArchitecture) { - case PROCESSOR_ARCHITECTURE_AMD64: - buf += "x86_64"; - break; - case PROCESSOR_ARCHITECTURE_ARM: - buf += "arm"; - break; - case PROCESSOR_ARCHITECTURE_IA64: - buf += "ia64"; - break; - case PROCESSOR_ARCHITECTURE_INTEL: - buf += "i386"; - break; - default: - buf += "(unknown)"; - } -#else - struct utsname ut; - uname(&ut); - - // try to get OS distribution name, if available - std::string distro = ut.sysname; - if (utils::file_is_readable("/etc/os-release")) { - try { - TextFileReader reader("/etc/os-release",""); - while (1) { - auto words = reader.next_values(0,"="); - if ((words.count() > 1) && (words.next_string() == "PRETTY_NAME")) { - distro += " " + utils::trim(words.next_string()); - break; - } - } - } catch (std::exception &e) { - ; // EOF but keyword not found - } - } - - buf = fmt::format("{} {} on {}", distro, ut.release, ut.machine); -#endif - return buf; -} - -std::string Info::get_compiler_info() -{ - std::string buf; -#if defined(__INTEL_LLVM_COMPILER) - constexpr double version = static_cast(__INTEL_LLVM_COMPILER)*0.01; - buf = fmt::format("Intel LLVM C++ {:.1f} / {}", version, __VERSION__); -#elif defined(__ibmxl__) - buf = fmt::format("IBM XL C/C++ (Clang) {}.{}.{}", - __ibmxl_version__, __ibmxl_release__, __ibmxl_modification__); -#elif defined(__clang__) - buf = fmt::format("Clang C++ {}", __VERSION__); -#elif defined(__PGI) - buf = fmt::format("PGI C++ {}.{}",__PGIC__, __PGIC_MINOR__); -#elif defined(__INTEL_COMPILER) - double version = static_cast(__INTEL_COMPILER)*0.01; - buf = fmt::format("Intel Classic C++ {:.2f}.{} / {}", version, - __INTEL_COMPILER_UPDATE, __VERSION__); -#elif defined(__MINGW64__) - buf = fmt::format("MinGW-w64 64bit {}.{} / GNU C++ {}", __MINGW64_VERSION_MAJOR, - __MINGW64_VERSION_MINOR, __VERSION__); -#elif defined(__MINGW32__) - buf = fmt::format("MinGW-w64 32bit {}.{} / GNU C++ {}", __MINGW32_MAJOR_VERSION, - __MINGW32_MINOR_VERSION, __VERSION__); -#elif defined(__GNUC__) - buf = fmt::format("GNU C++ {}", __VERSION__); -#elif defined(_MSC_VER) && (_MSC_VER > 1920) && (_MSC_VER < 2000) - constexpr int major = _MSC_VER / 100; - constexpr int minor = _MSC_VER - major *100; - buf = fmt::format("Microsoft Visual Studio 20{}, C/C++ {}.{}", major, major-5, minor); -#else - buf = "(Unknown)"; -#endif - return buf; -} - -std::string Info::get_openmp_info() -{ - -#if !defined(_OPENMP) - return "OpenMP not enabled"; -#else - -// Supported OpenMP version corresponds to the release date of the -// specifications as posted at https://www.openmp.org/specifications/ - -#if _OPENMP > 202011 - return "OpenMP newer than version 5.1"; -#elif _OPENMP == 202011 - return "OpenMP 5.1"; -#elif _OPENMP == 201811 - return "OpenMP 5.0"; -#elif _OPENMP == 201611 - return "OpenMP 5.0 preview 1"; -#elif _OPENMP == 201511 - return "OpenMP 4.5"; -#elif _OPENMP == 201307 - return "OpenMP 4.0"; -#elif _OPENMP == 201107 - return "OpenMP 3.1"; -#elif _OPENMP == 200805 - return "OpenMP 3.0"; -#elif _OPENMP == 200505 - return "OpenMP 2.5"; -#elif _OPENMP == 200203 - return "OpenMP 2.0"; -#else - return "unknown OpenMP version"; -#endif - -#endif -} - -std::string Info::get_mpi_vendor() { - #if defined(MPI_STUBS) - return "MPI STUBS"; - #elif defined(OPEN_MPI) - return "Open MPI"; - #elif defined(MPICH_NAME) - return "MPICH"; - #elif defined(I_MPI_VERSION) - return "Intel MPI"; - #elif defined(PLATFORM_MPI) - return "Platform MPI"; - #elif defined(HP_MPI) - return "HP MPI"; - #elif defined(MSMPI_VER) - return "Microsoft MPI"; - #else - return "Unknown MPI implementation"; - #endif -} - -std::string Info::get_mpi_info(int &major, int &minor) -{ - int len; -#if (defined(MPI_VERSION) && (MPI_VERSION > 2)) || defined(MPI_STUBS) - static char version[MPI_MAX_LIBRARY_VERSION_STRING]; - MPI_Get_library_version(version,&len); -#else - static char version[32]; - strcpy(version,get_mpi_vendor().c_str()); - len = strlen(version); -#endif - - MPI_Get_version(&major,&minor); - if (len > 80) { - char *ptr = strchr(version+80,'\n'); - if (ptr) *ptr = '\0'; - } - return std::string(version); -} - -std::string Info::get_cxx_info() -{ -#if __cplusplus > 202002L - return "newer than C++20"; -#elif __cplusplus == 202002L - return "C++20"; -#elif __cplusplus == 201703L - return "C++17"; -#elif __cplusplus == 201402L - return "C++14"; -#elif __cplusplus == 201103L - return "C++11"; -#elif __cplusplus == 199711L - return "C++98"; -#else - return "unknown"; -#endif -} - std::string Info::get_accelerator_info(const std::string &package) { std::string mesg(""); diff --git a/src/info.h b/src/info.h index d000b3c443..c1e10a2336 100644 --- a/src/info.h +++ b/src/info.h @@ -42,19 +42,13 @@ class Info : public Command { static bool has_png_support(); static bool has_jpeg_support(); static bool has_ffmpeg_support(); + static bool has_fft_single_support(); static bool has_exceptions(); static bool has_package(const std::string &); static bool has_accelerator_feature(const std::string &, const std::string &, const std::string &); static bool has_gpu_device(); static std::string get_gpu_device_info(); - - static std::string get_os_info(); - static std::string get_compiler_info(); - static std::string get_openmp_info(); - static std::string get_mpi_vendor(); - static std::string get_mpi_info(int &, int &); - static std::string get_cxx_info(); static std::string get_accelerator_info(const std::string &pkg = ""); void get_memory_info(double *); diff --git a/src/input.cpp b/src/input.cpp index a5649a90c4..b03034a8db 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -50,11 +50,6 @@ #include #include #include -#include - -#ifdef _WIN32 -#include -#endif using namespace LAMMPS_NS; @@ -186,7 +181,7 @@ void Input::file() { int m,n; - while (1) { + while (true) { // read a line from input script // n = length of line including str terminator, 0 if end of file @@ -195,7 +190,7 @@ void Input::file() if (me == 0) { m = 0; - while (1) { + while (true) { if (infile == nullptr) { n = 0; @@ -1201,15 +1196,6 @@ void Input::quit() /* ---------------------------------------------------------------------- */ -char *shell_failed_message(const char* cmd, int errnum) -{ - std::string errmsg = fmt::format("Shell command '{}' failed with error '{}'", - cmd, strerror(errnum)); - char *msg = new char[errmsg.size()+1]; - strcpy(msg, errmsg.c_str()); - return msg; -} - void Input::shell() { int rv,err; @@ -1218,89 +1204,59 @@ void Input::shell() if (strcmp(arg[0],"cd") == 0) { if (narg != 2) error->all(FLERR,"Illegal shell cd command"); - rv = (chdir(arg[1]) < 0) ? errno : 0; + rv = (platform::chdir(arg[1]) < 0) ? errno : 0; MPI_Reduce(&rv,&err,1,MPI_INT,MPI_MAX,0,world); + errno = err; if (me == 0 && err != 0) { - char *message = shell_failed_message("cd",err); - error->warning(FLERR,message); - delete[] message; + error->warning(FLERR, "Shell command 'cd {}' failed with error '{}'", arg[1], utils::getsyserror()); } - } else if (strcmp(arg[0],"mkdir") == 0) { if (narg < 2) error->all(FLERR,"Illegal shell mkdir command"); - if (me == 0) + if (me == 0) { for (int i = 1; i < narg; i++) { -#if defined(_WIN32) - rv = _mkdir(arg[i]); -#else - rv = mkdir(arg[i], S_IRWXU | S_IRGRP | S_IXGRP); -#endif - if (rv < 0) { - char *message = shell_failed_message("mkdir",errno); - error->warning(FLERR,message); - delete[] message; - } + if (platform::mkdir(arg[i]) < 0) + error->warning(FLERR, "Shell command 'mkdir {}' failed with error '{}'", + arg[i],utils::getsyserror()); } - + } } else if (strcmp(arg[0],"mv") == 0) { if (narg != 3) error->all(FLERR,"Illegal shell mv command"); - rv = (rename(arg[1],arg[2]) < 0) ? errno : 0; - MPI_Reduce(&rv,&err,1,MPI_INT,MPI_MAX,0,world); - if (me == 0 && err != 0) { - char *message = shell_failed_message("mv",err); - error->warning(FLERR,message); - delete[] message; + if (me == 0) { + if (rename(arg[1],arg[2]) < 0) { + error->warning(FLERR, "Shell command 'mv {} {}' failed with error '{}'", + arg[1],arg[2],utils::getsyserror()); + } } - } else if (strcmp(arg[0],"rm") == 0) { if (narg < 2) error->all(FLERR,"Illegal shell rm command"); - if (me == 0) + if (me == 0) { for (int i = 1; i < narg; i++) { - if (unlink(arg[i]) < 0) { - char *message = shell_failed_message("rm",errno); - error->warning(FLERR,message); - delete[] message; - } + if (platform::unlink(arg[i]) < 0) + error->warning(FLERR, "Shell command 'rm {}' failed with error '{}'", + arg[i], utils::getsyserror()); } - + } } else if (strcmp(arg[0],"rmdir") == 0) { if (narg < 2) error->all(FLERR,"Illegal shell rmdir command"); - if (me == 0) + if (me == 0) { for (int i = 1; i < narg; i++) { - if (rmdir(arg[i]) < 0) { - char *message = shell_failed_message("rmdir",errno); - error->warning(FLERR,message); - delete[] message; - } + if (platform::rmdir(arg[i]) < 0) + error->warning(FLERR, "Shell command 'rmdir {}' failed with error '{}'", + arg[i], utils::getsyserror()); } - + } } else if (strcmp(arg[0],"putenv") == 0) { if (narg < 2) error->all(FLERR,"Illegal shell putenv command"); for (int i = 1; i < narg; i++) { rv = 0; -#ifdef _WIN32 - if (arg[i]) rv = _putenv(utils::strdup(arg[i])); -#else - if (arg[i]) { - std::string vardef(arg[i]); - auto found = vardef.find_first_of('='); - if (found == std::string::npos) { - rv = setenv(vardef.c_str(),"",1); - } else { - rv = setenv(vardef.substr(0,found).c_str(), - vardef.substr(found+1).c_str(),1); - } - } -#endif + if (arg[i]) rv = platform::putenv(arg[i]); rv = (rv < 0) ? errno : 0; MPI_Reduce(&rv,&err,1,MPI_INT,MPI_MAX,0,world); - if (me == 0 && err != 0) { - char *message = shell_failed_message("putenv",err); - error->warning(FLERR,message); - delete[] message; - } + errno = err; + if (me == 0 && err != 0) + error->warning(FLERR, "Shell command 'putenv {}' failed with error '{}'", + arg[i], utils::getsyserror()); } - // use work string to concat args back into one string separated by spaces // invoke string in shell via system() diff --git a/src/lammps.cpp b/src/lammps.cpp index d9bb56d882..0829c4fdbd 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -51,20 +51,24 @@ #include "update.h" #include "version.h" +#if defined(LMP_PLUGIN) +#include "plugin.h" +#endif + #include #include #include #include -#if defined(_WIN32) -#include -#else -#include // for isatty() -#endif - #include "lmpinstalledpkgs.h" #include "lmpgitversion.h" +#if defined(LAMMPS_UPDATE) +#define UPDATE_STRING " - " LAMMPS_UPDATE +#else +#define UPDATE_STRING "" +#endif + static void print_style(FILE *fp, const char *str, int &pos); struct LAMMPS_NS::package_styles_lists { @@ -135,20 +139,21 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : logfile = nullptr; infile = nullptr; - initclock = MPI_Wtime(); + initclock = platform::walltime(); init_pkg_lists(); #if defined(LMP_PYTHON) && defined(_WIN32) - // if the LAMMPSHOME environment variable is set, it should point + // If the LAMMPSHOME environment variable is set, it should point // to the location of the LAMMPS installation tree where we bundle // the matching Python installation for use with the PYTHON package. - // this is currently only used on Windows with the windows installer packages + // This is currently only used on Windows with the Windows installer packages const char *lmpenv = getenv("LAMMPSHOME"); if (lmpenv) { - _putenv(utils::strdup(fmt::format("PYTHONHOME={}",lmpenv))); + platform::putenv(fmt::format("PYTHONHOME={}",lmpenv)); } #endif + // check if -mpicolor is first arg // if so, then 2 apps were launched with one mpirun command // this means passed communicator (e.g. MPI_COMM_WORLD) is bigger than LAMMPS @@ -514,7 +519,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : } if ((universe->me == 0) && !helpflag) - utils::logmesg(this,fmt::format("LAMMPS ({})\n",version)); + utils::logmesg(this,fmt::format("LAMMPS ({}{})\n",version,UPDATE_STRING)); // universe is one or more worlds, as setup by partition switch // split universe communicator into separate world communicators @@ -662,7 +667,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : int n = plast[i] - pfirst[i]; packargs[i] = new char*[n+1]; for (int j=0; j < n; ++j) - packargs[i][j] = strdup(arg[pfirst[i]+j]); + packargs[i][j] = utils::strdup(arg[pfirst[i]+j]); packargs[i][n] = nullptr; } memory->destroy(pfirst); @@ -716,7 +721,7 @@ LAMMPS::~LAMMPS() if (num_package) { for (int i = 0; i < num_package; i++) { for (char **ptr = packargs[i]; *ptr != nullptr; ++ptr) - free(*ptr); + delete[] *ptr; delete[] packargs[i]; } delete[] packargs; @@ -724,7 +729,7 @@ LAMMPS::~LAMMPS() num_package = 0; packargs = nullptr; - double totalclock = MPI_Wtime() - initclock; + double totalclock = platform::walltime() - initclock; if ((me == 0) && (screen || logfile)) { int seconds = fmod(totalclock,60.0); totalclock = (totalclock - seconds) / 60.0; @@ -908,6 +913,10 @@ void LAMMPS::init() void LAMMPS::destroy() { + // must wipe out all plugins first, if configured +#if defined(LMP_PLUGIN) + plugin_clear(this); +#endif delete update; update = nullptr; @@ -1118,11 +1127,7 @@ void _noopt LAMMPS::help() // user. scrollback buffers are often not large enough. this is most // beneficial to windows users, who are not used to command line. -#if defined(_WIN32) - int use_pager = _isatty(fileno(fp)); -#else - int use_pager = isatty(fileno(fp)); -#endif + int use_pager = platform::is_console(fp); // cannot use this with OpenMPI since its console is non-functional @@ -1133,11 +1138,7 @@ void _noopt LAMMPS::help() if (use_pager) { pager = getenv("PAGER"); if (pager == nullptr) pager = "more"; -#if defined(_WIN32) - fp = _popen(pager,"w"); -#else - fp = popen(pager,"w"); -#endif + fp = platform::popen(pager,"w"); // reset to original state, if pipe command failed if (fp == nullptr) { @@ -1150,10 +1151,10 @@ void _noopt LAMMPS::help() if (has_git_info) { fprintf(fp,"\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " - LAMMPS_VERSION "\nGit info (%s / %s)\n\n",git_branch, git_descriptor); + LAMMPS_VERSION UPDATE_STRING "\nGit info (%s / %s)\n\n",git_branch, git_descriptor); } else { fprintf(fp,"\nLarge-scale Atomic/Molecular Massively Parallel Simulator - " - LAMMPS_VERSION "\n\n"); + LAMMPS_VERSION UPDATE_STRING "\n\n"); } fprintf(fp, "Usage example: %s -var t 300 -echo screen -in in.alloy\n\n" @@ -1299,7 +1300,7 @@ void _noopt LAMMPS::help() // close pipe to pager, if active - if (pager != nullptr) pclose(fp); + if (pager != nullptr) platform::pclose(fp); } /* ---------------------------------------------------------------------- @@ -1340,20 +1341,20 @@ void LAMMPS::print_config(FILE *fp) const char *pkg; int ncword, ncline = 0; - fmt::print(fp,"OS: {}\n\n",Info::get_os_info()); + fmt::print(fp,"OS: {}\n\n",platform::os_info()); fmt::print(fp,"Compiler: {} with {}\nC++ standard: {}\n", - Info::get_compiler_info(),Info::get_openmp_info(), - Info::get_cxx_info()); + platform::compiler_info(),platform::openmp_standard(), + platform::cxx_standard()); int major,minor; - std::string infobuf = Info::get_mpi_info(major,minor); + std::string infobuf = platform::mpi_info(major,minor); fmt::print(fp,"MPI v{}.{}: {}\n\n",major,minor,infobuf); fmt::print(fp,"Accelerator configuration:\n\n{}\n", Info::get_accelerator_info()); #if defined(LMP_GPU) - fmt::print(fp,"GPU present: {}\n\n",Info::has_gpu_device() ? "yes" : "no"); + fmt::print(fp,"Compatible GPU present: {}\n\n",Info::has_gpu_device() ? "yes" : "no"); #endif fputs("Active compile time flags:\n\n",fp); @@ -1361,6 +1362,7 @@ void LAMMPS::print_config(FILE *fp) if (Info::has_png_support()) fputs("-DLAMMPS_PNG\n",fp); if (Info::has_jpeg_support()) fputs("-DLAMMPS_JPEG\n",fp); if (Info::has_ffmpeg_support()) fputs("-DLAMMPS_FFMPEG\n",fp); + if (Info::has_fft_single_support()) fputs("-DFFT_SINGLE\n",fp); if (Info::has_exceptions()) fputs("-DLAMMPS_EXCEPTIONS\n",fp); #if defined(LAMMPS_BIGBIG) fputs("-DLAMMPS_BIGBIG\n",fp); @@ -1377,6 +1379,8 @@ void LAMMPS::print_config(FILE *fp) sizeof(smallint)*8, sizeof(imageint)*8, sizeof(tagint)*8, sizeof(bigint)*8); + if (Info::has_gzip_support()) fmt::print(fp,"\n{}\n",platform::compress_info()); + fputs("\nInstalled packages:\n\n",fp); for (int i = 0; nullptr != (pkg = installed_packages[i]); ++i) { ncword = strlen(pkg); diff --git a/src/lammpsplugin.h b/src/lammpsplugin.h index 93bf418893..5df0172763 100644 --- a/src/lammpsplugin.h +++ b/src/lammpsplugin.h @@ -15,8 +15,9 @@ #define LMP_LAMMPSPLUGIN_H // C style API and data structure required for dynamic loading - +#ifdef __cplusplus extern "C" { +#endif typedef void *(lammpsplugin_factory1) (void *); typedef void *(lammpsplugin_factory2) (void *, int, char **); @@ -41,6 +42,9 @@ typedef void (*lammpsplugin_initfunc)(void *, void *, void *); // to load a plugin; uses C bindings void lammpsplugin_init(void *, void *, void *); + +#ifdef __cplusplus } +#endif #endif diff --git a/src/library.cpp b/src/library.cpp index 13f480ed03..ed208413e6 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4394,9 +4394,9 @@ void lammps_get_os_info(char *buffer, int buf_size) { if (buf_size <=0) return; buffer[0] = buffer[buf_size-1] = '\0'; - std::string txt = Info::get_os_info() + "\n"; - txt += Info::get_compiler_info(); - txt += " with " + Info::get_openmp_info() + "\n"; + std::string txt = platform::os_info() + "\n"; + txt += platform::compiler_info(); + txt += " with " + platform::openmp_standard() + "\n"; strncpy(buffer, txt.c_str(), buf_size-1); } @@ -4420,15 +4420,16 @@ int lammps_config_has_mpi_support() /* ---------------------------------------------------------------------- */ -/** Check if the LAMMPS library supports compressed files via a pipe to gzip +/** Check if the LAMMPS library supports reading or writing compressed + * files via a pipe to gzip or similar compression programs \verbatim embed:rst Several LAMMPS commands (e.g. :doc:`read_data`, :doc:`write_data`, :doc:`dump styles atom, custom, and xyz `) support reading and writing compressed files via creating a pipe to the ``gzip`` program. This function checks whether this feature was :ref:`enabled at compile -time `. It does **not** check whether the ``gzip`` itself is -installed and usable. +time `. It does **not** check whether``gzip`` or any other +supported compression programs themselves are installed and usable. \endverbatim * * \return 1 if yes, otherwise 0 diff --git a/src/lmppython.cpp b/src/lmppython.cpp index b7e65d1f02..daebf23c23 100644 --- a/src/lmppython.cpp +++ b/src/lmppython.cpp @@ -38,10 +38,6 @@ Python::~Python() /* ---------------------------------------------------------------------- */ -PythonInterface::~PythonInterface() {} - -/* ---------------------------------------------------------------------- */ - void Python::init() { #if defined(LMP_PYTHON) diff --git a/src/lmppython.h b/src/lmppython.h index 7ecee915e5..3f0ebecae5 100644 --- a/src/lmppython.h +++ b/src/lmppython.h @@ -20,7 +20,7 @@ namespace LAMMPS_NS { class PythonInterface { public: - virtual ~PythonInterface(); + virtual ~PythonInterface() = default; virtual void command(int, char **) = 0; virtual void invoke_function(int, char *) = 0; virtual int find(const char *) = 0; diff --git a/src/main.cpp b/src/main.cpp index 568da132e2..095e1752da 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -79,7 +79,7 @@ int main(int argc, char **argv) KokkosLMP::finalize(); Python::finalize(); MPI_Abort(ae.universe, 1); - } catch (LAMMPSException &e) { + } catch (LAMMPSException &) { KokkosLMP::finalize(); Python::finalize(); MPI_Barrier(lammps_comm); diff --git a/src/min_hftn.cpp b/src/min_hftn.cpp index e743f1e1da..6786379cd7 100644 --- a/src/min_hftn.cpp +++ b/src/min_hftn.cpp @@ -95,7 +95,7 @@ MinHFTN::MinHFTN(LAMMPS *lmp) : Min(lmp) Destructor ------------------------------------------------------------------------- */ -MinHFTN::~MinHFTN (void) +MinHFTN::~MinHFTN() { for (int i = 1; i < NUM_HFTN_ATOM_BASED_VECTORS; i++) if (_daExtraGlobal[i] != nullptr) diff --git a/src/min_hftn.h b/src/min_hftn.h index 3512d24220..4b909c3112 100644 --- a/src/min_hftn.h +++ b/src/min_hftn.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class MinHFTN : public Min { public: MinHFTN(LAMMPS *); - ~MinHFTN(void); + ~MinHFTN(); void init(); void setup_style(); void reset_vectors(); @@ -64,7 +64,7 @@ class MinHFTN : public Min { const double dEnergyAtXin, const double dForce2AtXin, double &dEnergyAtXout, double &dForce2AtXout, int &nStepType, double &dStepLength2, double &dStepLengthInf); - double calc_xinf_using_mpi_(void) const; + double calc_xinf_using_mpi_() const; double calc_dot_prod_using_mpi_(const int nIx1, const int nIx2) const; double calc_grad_dot_v_using_mpi_(const int nIx) const; void calc_dhd_dd_using_mpi_(double &dDHD, double &dDD) const; @@ -72,19 +72,19 @@ class MinHFTN : public Min { void calc_plengths_using_mpi_(double &dStepLength2, double &dStepLengthInf) const; bool step_exceeds_TR_(const double dTrustRadius, const double dPP, const double dPD, const double dDD, double &dTau) const; - bool step_exceeds_DMAX_(void) const; + bool step_exceeds_DMAX_() const; void adjust_step_to_tau_(const double tau); double compute_to_tr_(const double dPP, const double dPD, const double dDD, const double dTrustRadius, const bool bConsiderBothRoots, const double dDHD, const double dPdotHD, const double dGradDotD) const; void evaluate_dir_der_(const bool bUseForwardDiffs, const int nIxDir, const int nIxResult, const bool bEvaluateAtX, double &dNewEnergy); - void open_hftn_print_file_(void); + void open_hftn_print_file_(); void hftn_print_line_(const bool bIsStepAccepted, const int nIteration, const int nTotalEvals, const double dEnergy, const double dForce2, const int nStepType, const double dTrustRadius, const double dStepLength2, const double dActualRed, const double dPredictedRed) const; - void close_hftn_print_file_(void); + void close_hftn_print_file_(); }; } // namespace LAMMPS_NS diff --git a/src/min_linesearch.cpp b/src/min_linesearch.cpp index a5d0aa326c..c4c10d8a1f 100644 --- a/src/min_linesearch.cpp +++ b/src/min_linesearch.cpp @@ -253,7 +253,7 @@ int MinLineSearch::linemin_backtrack(double eoriginal, double &alpha) // backtrack with alpha until energy decrease is sufficient - while (1) { + while (true) { ecurrent = alpha_step(alpha,1); // if energy change is better than ideal, exit with success @@ -412,7 +412,7 @@ int MinLineSearch::linemin_quadratic(double eoriginal, double &alpha) // etmp-eoriginal+alphatmp*fdothall); // alpha_step(0.0,1); - while (1) { + while (true) { ecurrent = alpha_step(alpha,1); // compute new fh, alpha, delfh @@ -708,7 +708,7 @@ int MinLineSearch::linemin_forcezero(double eoriginal, double &alpha) // main linesearch loop - while (1) { + while (true) { backtrack = false; fhPrev = fhCurr; engPrev = engCurr; diff --git a/src/molecule.cpp b/src/molecule.cpp index f769b9d58b..84a79143eb 100644 --- a/src/molecule.cpp +++ b/src/molecule.cpp @@ -412,7 +412,7 @@ void Molecule::read(int flag) // skip blank lines or lines that start with "#" // stop when read an unrecognized line - while (1) { + while (true) { readline(line); @@ -2065,7 +2065,7 @@ std::string Molecule::parse_keyword(int flag, char *line) MPI_Bcast(&eof,1,MPI_INT,0,world); if (eof) { - return std::string(""); + return {""}; } // bcast keyword line to all procs diff --git a/src/pair.cpp b/src/pair.cpp index 6805166150..1039875718 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -1799,7 +1799,7 @@ void Pair::write_file(int narg, char **arg) // write out a line with "DATE:" and "UNITS:" tags // - if the file already exists, print a message about appending // while printing the date and check that units are consistent. - if (utils::file_is_readable(table_file)) { + if (platform::file_is_readable(table_file)) { std::string units = utils::get_potential_units(table_file,"table"); if (!units.empty() && (units != update->unit_style)) { error->one(FLERR,"Trying to append to a table file " diff --git a/src/pair_table.cpp b/src/pair_table.cpp index 60272b5276..7b77a847f1 100644 --- a/src/pair_table.cpp +++ b/src/pair_table.cpp @@ -407,7 +407,7 @@ void PairTable::read_table(Table *tb, char *file, char *keyword) rfile = values.next_double(); tb->efile[i] = conversion_factor * values.next_double(); tb->ffile[i] = conversion_factor * values.next_double(); - } catch (TokenizerException &e) { + } catch (TokenizerException &) { ++cerror; } diff --git a/src/platform.cpp b/src/platform.cpp new file mode 100644 index 0000000000..c701c37a80 --- /dev/null +++ b/src/platform.cpp @@ -0,0 +1,992 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ +/** \file platform.cpp + * This file provides abstractions for a variety of platform specific + * functionality in a namespace "platform". This is a companion to + * the "utils" namespace with convenience and utility functions. */ + +#include "platform.h" +#include "text_file_reader.h" +#include "utils.h" + +#if HAVE_MPI +#include +#endif + +//////////////////////////////////////////////////////////////////////// +// include system headers and tweak system settings +#if defined(_WIN32) + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#if defined(_WIN32_WINNT) +#undef _WIN32_WINNT +#endif + +// target Windows version is windows 7 and later +#define _WIN32_WINNT _WIN32_WINNT_WIN7 +#define PSAPI_VERSION 2 + +#include +#include // for _get_osfhandle() +#include +#include + +#else // not Windows /////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#if defined(__APPLE__) +#include +#include +#endif +//////////////////////////////////////////////////////////////////////// + +#include +#include +#include + +/* ------------------------------------------------------------------ */ + +/// Struct for listing on-the-fly compression/decompression commands +struct compress_info { + /// identifier for the different compression algorithms + enum styles { NONE, GZIP, BZIP2, ZSTD, XZ, LZMA, LZ4 }; + const std::string extension; ///< filename extension for the current algorithm + const std::string command; ///< command to perform compression or decompression + const std::string compressflags; ///< flags to append to compress from stdin to stdout + const std::string uncompressflags; ///< flags to decompress file to stdout + const int style; ///< compression style flag +}; + +// clang-format off +static const std::vector compress_styles = { + {"", "", "", "", compress_info::NONE}, + {"gz", "gzip", " > ", " -cdf ", compress_info::GZIP}, + {"bz2", "bzip2", " > ", " -cdf ", compress_info::BZIP2}, + {"zst", "zstd", " -q > ", " -cdf ", compress_info::ZSTD}, + {"xz", "xz", " > ", " -cdf ", compress_info::XZ}, + {"lzma", "xz", " --format=lzma > ", " --format=lzma -cdf ", compress_info::LZMA}, + {"lz4", "lz4", " > ", " -cdf ", compress_info::LZ4}, +}; +// clang-format on + +/* ------------------------------------------------------------------ */ + +static const compress_info &find_compress_type(const std::string &file) +{ + std::size_t dot = file.find_last_of('.'); + if (dot != std::string::npos) { + const std::string ext = file.substr(dot + 1); + for (const auto &i : compress_styles) { + if (i.extension == ext) return i; + } + } + return compress_styles[0]; +} + +/* ------------------------------------------------------------------ */ + +// set reference time stamp during executable/library init. +// should provide better resolution than using epoch, if the system clock supports it. +static auto initial_time = std::chrono::steady_clock::now(); + +using namespace LAMMPS_NS; + +// get CPU time + +// clang-format off +// clang compilers are optimizing this function too aggressively returning always 0 +#if defined(__clang__) +[[clang::optnone]] +#elif defined(_MSC_VER) +#pragma optimize("",off) +#endif +double platform::cputime() +// clang-format on +{ + double rv = 0.0; + +#ifdef _WIN32 + + // from MSD docs. + FILETIME ct, et, kt, ut; + union { + FILETIME ft; + uint64_t ui; + } cpu; + if (GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) { + cpu.ft = ut; + rv = cpu.ui * 0.0000001; + } + +#else /* ! _WIN32 */ + + struct rusage ru; + if (getrusage(RUSAGE_SELF, &ru) == 0) { + rv = (double) ru.ru_utime.tv_sec; + rv += (double) ru.ru_utime.tv_usec * 0.000001; + } + +#endif + + return rv; +} +#if defined(_MSC_VER) +#pragma optimize("", on) +#endif + +/* ---------------------------------------------------------------------- + get wall time +------------------------------------------------------------------------ */ +double platform::walltime() +{ + return std::chrono::duration(std::chrono::steady_clock::now() - initial_time).count(); +} + +/* ---------------------------------------------------------------------- + sleep with microsecond resolution +------------------------------------------------------------------------ */ +void platform::usleep(int usec) +{ + return std::this_thread::sleep_for(std::chrono::microseconds(usec)); +} + +/* ---------------------------------------------------------------------- + get Operating system and version info +------------------------------------------------------------------------- */ + +std::string platform::os_info() +{ + std::string buf; + +#if defined(_WIN32) + + // Get Windows Edition name from registry + char value[1024]; + DWORD value_length = 1024; + const char *subkey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"; + const char *entry = "ProductName"; + RegGetValue(HKEY_LOCAL_MACHINE, subkey, entry, RRF_RT_REG_SZ, nullptr, &value, + (LPDWORD) &value_length); + // enforce zero termination + value[1023] = '\0'; + buf = value; + + DWORD fullversion, majorv, minorv, buildv = 0; + fullversion = GetVersion(); + majorv = (DWORD) (LOBYTE(LOWORD(fullversion))); + minorv = (DWORD) (HIBYTE(LOWORD(fullversion))); + if (fullversion < 0x80000000) buildv = (DWORD) (HIWORD(fullversion)); + + buf += ", Windows ABI " + std::to_string(majorv) + "." + std::to_string(minorv) + " (" + + std::to_string(buildv) + ") on "; + + SYSTEM_INFO si; + GetSystemInfo(&si); + + switch (si.wProcessorArchitecture) { + case PROCESSOR_ARCHITECTURE_AMD64: + buf += "x86_64"; + break; + case PROCESSOR_ARCHITECTURE_ARM: + buf += "arm"; + break; + case PROCESSOR_ARCHITECTURE_IA64: + buf += "ia64"; + break; + case PROCESSOR_ARCHITECTURE_INTEL: + buf += "i386"; + break; + default: + buf += "(unknown)"; + } +#else + struct utsname ut; + uname(&ut); + + // try to get OS distribution name, if available + buf = ut.sysname; + + if (platform::file_is_readable("/etc/os-release")) { + try { + TextFileReader reader("/etc/os-release",""); + while (true) { + auto words = reader.next_values(0,"="); + if ((words.count() > 1) && (words.next_string() == "PRETTY_NAME")) { + buf += " " + utils::trim(words.next_string()); + break; + } + } + } catch (std::exception &e) { + ; // EOF but keyword not found + } + } + + buf += std::string(" ") + ut.release + " " + ut.machine; +#endif + return buf; +} + +/* ---------------------------------------------------------------------- + identify C++ standard version +------------------------------------------------------------------------- */ + +std::string platform::cxx_standard() +{ +#if __cplusplus > 202002L + return "newer than C++20"; +#elif __cplusplus == 202002L + return "C++20"; +#elif __cplusplus == 201703L + return "C++17"; +#elif __cplusplus == 201402L + return "C++14"; +#elif __cplusplus == 201103L + return "C++11"; +#elif __cplusplus == 199711L + return "C++98"; +#else + return "unknown"; +#endif +} + +/* ---------------------------------------------------------------------- + identify compiler and its version +------------------------------------------------------------------------- */ + +std::string platform::compiler_info() +{ + std::string buf = "(Unknown)"; +#if defined(__INTEL_LLVM_COMPILER) + double version = static_cast(__INTEL_LLVM_COMPILER) * 0.01; + buf = fmt::format("Intel LLVM C++ {:.1f} / {}", version, __VERSION__); +#elif defined(__ibmxl__) + buf = fmt::format("IBM XL C/C++ (Clang) {}.{}.{}", __ibmxl_version__, __ibmxl_release__, + __ibmxl_modification__); +#elif defined(__clang__) + buf = fmt::format("Clang C++ {}", __VERSION__); +#elif defined(__PGI) + buf = fmt::format("PGI C++ {}.{}", __PGIC__, __PGIC_MINOR__); +#elif defined(__INTEL_COMPILER) +#if !defined(__VERSION__) +#define __VERSION__ __INTEL_COMPILER_BUILD_DATE +#endif + double version = static_cast(__INTEL_COMPILER) * 0.01; + buf = fmt::format("Intel Classic C++ {:.2f}.{} / {}", version, __INTEL_COMPILER_UPDATE, + __VERSION__); +#elif defined(__MINGW64__) + buf = fmt::format("MinGW-w64 64bit {}.{} / GNU C++ {}", __MINGW64_VERSION_MAJOR, + __MINGW64_VERSION_MINOR, __VERSION__); +#elif defined(__MINGW32__) + buf = fmt::format("MinGW-w64 32bit {}.{} / GNU C++ {}", __MINGW32_MAJOR_VERSION, + __MINGW32_MINOR_VERSION, __VERSION__); +#elif defined(__GNUC__) + buf = fmt::format("GNU C++ {}", __VERSION__); +#elif defined(_MSC_VER) && (_MSC_VER > 1920) && (_MSC_VER < 2000) + constexpr int major = _MSC_VER / 100; + constexpr int minor = _MSC_VER - major * 100; + buf = "Microsoft Visual Studio 20" + std::to_string(major) + ", C/C++ " + + std::to_string(major - 5) + "." + std::to_string(minor); +#else + buf = "(Unknown)"; +#endif + return buf; +} + +/* ---------------------------------------------------------------------- + detect OpenMP standard +------------------------------------------------------------------------- */ + +std::string platform::openmp_standard() +{ + +#if !defined(_OPENMP) + return "OpenMP not enabled"; +#else + + // Supported OpenMP version corresponds to the release date of the + // specifications as posted at https://www.openmp.org/specifications/ + +#if _OPENMP > 202011 + return "OpenMP newer than version 5.1"; +#elif _OPENMP == 202011 + return "OpenMP 5.1"; +#elif _OPENMP == 201811 + return "OpenMP 5.0"; +#elif _OPENMP == 201611 + return "OpenMP 5.0 preview 1"; +#elif _OPENMP == 201511 + return "OpenMP 4.5"; +#elif _OPENMP == 201307 + return "OpenMP 4.0"; +#elif _OPENMP == 201107 + return "OpenMP 3.1"; +#elif _OPENMP == 200805 + return "OpenMP 3.0"; +#elif _OPENMP == 200505 + return "OpenMP 2.5"; +#elif _OPENMP == 200203 + return "OpenMP 2.0"; +#else + return "unknown OpenMP version"; +#endif + +#endif +} + +/* ---------------------------------------------------------------------- + identify MPI vendor from defines in the mpi.h file. +------------------------------------------------------------------------- */ + +std::string platform::mpi_vendor() +{ +#if defined(MPI_STUBS) + return "MPI STUBS"; +#elif defined(OPEN_MPI) + return "Open MPI"; +#elif defined(MPICH_NAME) + return "MPICH"; +#elif defined(I_MPI_VERSION) + return "Intel MPI"; +#elif defined(PLATFORM_MPI) + return "Platform MPI"; +#elif defined(HP_MPI) + return "HP MPI"; +#elif defined(MSMPI_VER) + // Get Microsoft MPI version from registry + char value[1024]; + DWORD value_length = 1024; + const char *subkey = "SOFTWARE\\Microsoft\\MPI"; + const char *entry = "Version"; + auto rv = RegGetValueA(HKEY_LOCAL_MACHINE, subkey, entry, RRF_RT_REG_SZ, nullptr, &value, + (LPDWORD) &value_length); + std::string buf = "Microsoft MPI"; + if (rv == ERROR_SUCCESS) buf += std::string(" v") + value; + return buf; +#else + return "Unknown MPI implementation"; +#endif +} + +/* ---------------------------------------------------------------------- + detect MPI version info +------------------------------------------------------------------------- */ + +std::string platform::mpi_info(int &major, int &minor) +{ + int len = 0; +#if (defined(MPI_VERSION) && (MPI_VERSION > 2)) || defined(MPI_STUBS) + static char version[MPI_MAX_LIBRARY_VERSION_STRING]; + MPI_Get_library_version(version, &len); + if (len > 80) { + char *ptr = strchr(version + 80, '\n'); + if (ptr) *ptr = '\0'; + } +#else + constexpr int MAX_VERSION_STRING = 32; + static char version[MAX_VERSION_STRING]; + strncpy(version, mpi_vendor().c_str(), MAX_VERSION_STRING); +#endif + +#if defined(MPI_VERSION) + MPI_Get_version(&major, &minor); +#else + major = 1; + minor = 0; +#endif + return {version}; +} + +/* ---------------------------------------------------------------------- + collect available compression tool info +------------------------------------------------------------------------- */ + +std::string platform::compress_info() +{ + std::string buf = "Available compression formats:\n\n"; + bool none_found = true; + for (const auto &cmpi : compress_styles) { + if (cmpi.style == ::compress_info::NONE) continue; + if (find_exe_path(cmpi.command).size()) { + none_found = false; + buf += fmt::format("Extension: .{:6} Command: {}\n", cmpi.extension, cmpi.command); + } + } + if (none_found) buf += "None\n"; + return buf; +} +/* ---------------------------------------------------------------------- + set environment variable +------------------------------------------------------------------------- */ + +int platform::putenv(const std::string &vardef) +{ + if (vardef.size() == 0) return -1; + + auto found = vardef.find_first_of('='); +#ifdef _WIN32 + // must assign a value to variable with _putenv() + if (found == std::string::npos) + return _putenv(utils::strdup(vardef + "=1")); + else + return _putenv(utils::strdup(vardef)); +#else + if (found == std::string::npos) + return setenv(vardef.c_str(), "", 1); + else + return setenv(vardef.substr(0, found).c_str(), vardef.substr(found + 1).c_str(), 1); +#endif + return -1; +} + +/* ---------------------------------------------------------------------- + split a "path" environment variable into a list +------------------------------------------------------------------------- */ + +std::vector platform::list_pathenv(const std::string &var) +{ + std::vector dirs; + const char *ptr = getenv(var.c_str()); + if (ptr == nullptr) return dirs; + + std::string pathvar = ptr; + std::size_t first = 0, next; + while (true) { + next = pathvar.find_first_of(pathvarsep, first); + if (next == std::string::npos) { + dirs.push_back(pathvar.substr(first)); + break; + } else { + dirs.push_back(pathvar.substr(first, next - first)); + first = next + 1; + } + } + return dirs; +} + +/* ---------------------------------------------------------------------- + find the full path name of an executable +------------------------------------------------------------------------- */ + +std::string platform::find_exe_path(const std::string &cmd) +{ + if (cmd.size() == 0) return ""; + auto pathdirs = list_pathenv("PATH"); +#ifdef _WIN32 + // windows always looks in "." and does it first + pathdirs.insert(pathdirs.begin(), "."); +#else + struct stat info; +#endif + for (const auto &dir : pathdirs) { + std::string exe = path_join(dir, cmd); +#ifdef _WIN32 + const char *extensions[] = {".exe", ".com", ".bat", nullptr}; + for (auto ext = extensions; *ext != nullptr; ++ext) { + auto exe_path = exe + *ext; + if (file_is_readable(exe_path)) return exe_path; + } +#else + memset(&info, 0, sizeof(info)); + if (stat(exe.c_str(), &info) != 0) continue; + if ((info.st_mode & (S_IXOTH | S_IXGRP | S_IXUSR)) != 0) return exe; +#endif + } + return ""; +} + +/* ---------------------------------------------------------------------- + wrapper functions for loading shared objects and libraries +------------------------------------------------------------------------- */ + +#ifdef _WIN32 + +// open a shared object file +void *platform::dlopen(const std::string &fname) +{ + return (void *) LoadLibrary(fname.c_str()); +} + +// return dynamic linker error string + +std::string platform::dlerror() +{ + return ""; +} + +// close a shared object +int platform::dlclose(void *handle) +{ + /* FreeLibrary returns nonzero on success unlike dlclose() */ + return (FreeLibrary((HINSTANCE) handle) == 0); +} + +// resolve a symbol in shared object +void *platform::dlsym(void *handle, const std::string &symbol) +{ + return (void *) GetProcAddress((HINSTANCE) handle, symbol.c_str()); +} + +#else + +// open a shared object file +void *platform::dlopen(const std::string &fname) +{ + return ::dlopen(fname.c_str(), RTLD_NOW | RTLD_GLOBAL); +} + +// return dynamic linker error string + +std::string platform::dlerror() +{ + const char *errmesg = ::dlerror(); + if (errmesg) return {errmesg}; + else return {""}; +} + +// close a shared object +int platform::dlclose(void *handle) +{ + return ::dlclose(handle); +} + +// resolve a symbol in shared object +void *platform::dlsym(void *handle, const std::string &symbol) +{ + return ::dlsym(handle, symbol.c_str()); +} +#endif + +/* ---------------------------------------------------------------------- */ + +/** On Linux the folder /proc/self/fd holds symbolic links to the actual + * pathnames associated with each open file descriptor of the current process. + * On MacOS the same kind of information can be obtained using ``fcntl(fd,F_GETPATH,buf)``. + * On Windows we use ``GetFinalPathNameByHandleA()`` which is available with + * Windows Vista and later. If the buffer is too small (< 16 bytes) a null pointer is returned. + * + * This function is used to provide a filename with error messages in functions + * where the filename is not passed as an argument, but the FILE * pointer. */ + +const char *platform::guesspath(FILE *fp, char *buf, int len) +{ + // no point in guessing a path with a short buffer or NULL pointer as buffer + if ((buf == nullptr) || (len < 16)) return nullptr; + + // zero buffer and reserve last character in buffer for terminating '\0' + memset(buf, 0, len); + len--; + +#if defined(__linux__) + + int fd = fileno(fp); + // get pathname from /proc or copy (unknown) + if (readlink((std::string("/proc/self/fd/") + std::to_string(fd)).c_str(), buf, len) <= 0) + strncpy(buf, "(unknown)", len); + +#elif defined(__APPLE__) + + int fd = fileno(fp); + char filepath[PATH_MAX]; + if (fcntl(fd, F_GETPATH, filepath) != -1) + strncpy(buf, filepath, len); + else + strncpy(buf, "(unknown)", len); + +#elif defined(_WIN32) + + char filepath[MAX_PATH]; + HANDLE h = (HANDLE) _get_osfhandle(_fileno(fp)); + if (GetFinalPathNameByHandleA(h, filepath, MAX_PATH, FILE_NAME_NORMALIZED) > 0) + strncpy(buf, filepath, len); + else + strncpy(buf, "(unknown)", len); + +#else // unsupported OS + + strncpy(buf, "(unknown)", len); + +#endif + + return buf; +} + +/* ---------------------------------------------------------------------- + detect terminal, e.g. for using a pager automatically +------------------------------------------------------------------------- */ + +bool platform::is_console(FILE *fp) +{ + if (!fp) return false; +#if defined(_WIN32) + return (_isatty(_fileno(fp)) == 1); +#else + return (isatty(fileno(fp)) == 1); +#endif +} + +/* ---------------------------------------------------------------------- + Get string with path to the current directory + PATH_MAX may not be a compile time constant, so we must allocate and delete a buffer. +------------------------------------------------------------------------- */ + +std::string platform::current_directory() +{ + std::string cwd = ""; + +#if defined(_WIN32) + char *buf = new char[MAX_PATH]; + if (_getcwd(buf, MAX_PATH)) { cwd = buf; } + delete[] buf; +#else + char *buf = new char[PATH_MAX]; + if (::getcwd(buf, PATH_MAX)) { cwd = buf; } + delete[] buf; +#endif + return cwd; +} + +/* ---------------------------------------------------------------------- + check if a path is a directory +------------------------------------------------------------------------- */ + +bool platform::path_is_directory(const std::string &path) +{ +#if defined(_WIN32) + struct _stat info; + memset(&info, 0, sizeof(info)); + if (_stat(path.c_str(), &info) != 0) return false; +#else + struct stat info; + memset(&info, 0, sizeof(info)); + if (stat(path.c_str(), &info) != 0) return false; +#endif + return ((info.st_mode & S_IFDIR) != 0); +} + +/* ---------------------------------------------------------------------- + get directory listing in string vector +------------------------------------------------------------------------- */ + +std::vector platform::list_directory(const std::string &dir) +{ + std::vector files; + if (!path_is_directory(dir)) return files; + +#if defined(_WIN32) + HANDLE handle; + WIN32_FIND_DATA fd; + std::string searchname = dir + filepathsep[0] + "*"; + handle = FindFirstFile(searchname.c_str(), &fd); + if (handle == ((HANDLE) -1)) return files; + while (FindNextFile(handle, &fd)) { + std::string entry(fd.cFileName); + if ((entry == "..") || (entry == ".")) continue; + files.push_back(entry); + } + FindClose(handle); +#else + std::string dirname = dir + filepathsep[0]; + DIR *handle = opendir(dirname.c_str()); + if (handle == nullptr) return files; + struct dirent *fd; + while ((fd = readdir(handle)) != nullptr) { + std::string entry(fd->d_name); + if ((entry == "..") || (entry == ".")) continue; + files.push_back(entry); + } + closedir(handle); +#endif + return files; +} + +/* ---------------------------------------------------------------------- + Change current directory +------------------------------------------------------------------------- */ + +int platform::chdir(const std::string &path) +{ +#if defined(_WIN32) + return ::_chdir(path.c_str()); +#else + return ::chdir(path.c_str()); +#endif +} + +/* ---------------------------------------------------------------------- + Create a directory +------------------------------------------------------------------------- */ + +int platform::mkdir(const std::string &path) +{ +#if defined(_WIN32) + return ::_mkdir(path.c_str()); +#else + return ::mkdir(path.c_str(), S_IRWXU | S_IRGRP | S_IXGRP); +#endif +} + +/* ---------------------------------------------------------------------- + Delete a directory and its contents recursively +------------------------------------------------------------------------- */ + +int platform::rmdir(const std::string &path) +{ + // recurse through directory tree deleting files and directories + auto entries = list_directory(path); + for (const auto &entry : entries) { + const auto newpath = path_join(path, entry); + if (path_is_directory(newpath)) + rmdir(newpath); + else + unlink(newpath); + } +#if defined(_WIN32) + return ::_rmdir(path.c_str()); +#else + return ::rmdir(path.c_str()); +#endif +} + +/* ---------------------------------------------------------------------- + Delete a file +------------------------------------------------------------------------- */ + +int platform::unlink(const std::string &path) +{ +#if defined(_WIN32) + return ::_unlink(path.c_str()); +#else + return ::unlink(path.c_str()); +#endif +} + +/* ---------------------------------------------------------------------- + Get current file stream position +------------------------------------------------------------------------- */ + +bigint platform::ftell(FILE *fp) +{ +#if defined(_WIN32) + return (bigint)::_ftelli64(fp); +#else + return (bigint)::ftell(fp); +#endif +} + +/* ---------------------------------------------------------------------- + Set current file stream position +------------------------------------------------------------------------- */ + +int platform::fseek(FILE *fp, bigint pos) +{ +#if defined(_WIN32) + if (pos == platform::END_OF_FILE) + return ::_fseeki64(fp, 0, SEEK_END); + else + return ::_fseeki64(fp, (__int64) pos, SEEK_SET); +#else + if (pos == platform::END_OF_FILE) + return ::fseek(fp, 0, SEEK_END); + else + return ::fseek(fp, (long) pos, SEEK_SET); +#endif +} + +/* ---------------------------------------------------------------------- + Truncate opened file to given length +------------------------------------------------------------------------- */ + +int platform::ftruncate(FILE *fp, bigint length) +{ +#if defined(_WIN32) + HANDLE h = (HANDLE) _get_osfhandle(_fileno(fp)); + LARGE_INTEGER li_start, li_length; + li_start.QuadPart = (int64_t) 0; + li_length.QuadPart = (int64_t) length; + if (SetFilePointerEx(h, li_start, NULL, FILE_CURRENT) && + SetFilePointerEx(h, li_length, NULL, FILE_BEGIN) && SetEndOfFile(h)) { + return 0; + } else { + return 1; + } +#else + platform::fseek(fp, length); + return ::ftruncate(fileno(fp), (off_t) length); +#endif +} + +/* ---------------------------------------------------------------------- + open pipe +------------------------------------------------------------------------- */ + +FILE *platform::popen(const std::string &cmd, const std::string &mode) +{ + FILE *fp = nullptr; +#if defined(_WIN32) + if (mode == "r") + fp = ::_popen(cmd.c_str(), "rb"); + else if (mode == "w") + fp = ::_popen(cmd.c_str(), "wb"); +#else + if (mode == "r") + fp = ::popen(cmd.c_str(), "r"); + else if (mode == "w") + fp = ::popen(cmd.c_str(), "w"); +#endif + return fp; +} + +/* ---------------------------------------------------------------------- + close pipe +------------------------------------------------------------------------- */ + +int platform::pclose(FILE *fp) +{ +#if defined(_WIN32) + return ::_pclose(fp); +#else + return ::pclose(fp); +#endif +} + +/* ---------------------------------------------------------------------- + strip off leading part of path, return just the filename +------------------------------------------------------------------------- */ + +std::string platform::path_basename(const std::string &path) +{ + size_t start = path.find_last_of(platform::filepathsep); + + if (start == std::string::npos) { + start = 0; + } else { + start += 1; + } + + return path.substr(start); +} + +/* ---------------------------------------------------------------------- + Return only the leading part of a path, return just the directory +------------------------------------------------------------------------- */ + +std::string platform::path_dirname(const std::string &path) +{ + size_t start = path.find_last_of(platform::filepathsep); + + if (start == std::string::npos) return "."; + + return path.substr(0, start); +} + +/* ---------------------------------------------------------------------- + join two paths. + if one of the two is an empty string just return the other unmodified + if the first string ends in the separator or the second begins with one, trim them +------------------------------------------------------------------------- */ + +std::string platform::path_join(const std::string &a, const std::string &b) +{ + if (a.empty()) return b; + if (b.empty()) return a; + + // remove trailing separator(s) in first part + std::string joined = a; + while (joined.find_last_of(platform::filepathsep) == joined.size() - 1) { + for (const auto &s : platform::filepathsep) + if (joined.back() == s) joined.pop_back(); + } + + // skip over leading separator(s) in second part + std::size_t skip = 0; + while (b.find_first_of(platform::filepathsep, skip) == skip) ++skip; + + // combine and return + joined += platform::filepathsep[0] + b.substr(skip); + return joined; +} + +/* ---------------------------------------------------------------------- + try to open file for reading to prove if it exists and is accessible +------------------------------------------------------------------------- */ + +bool platform::file_is_readable(const std::string &path) +{ + FILE *fp = fopen(path.c_str(), "r"); + if (fp) { + fclose(fp); + return true; + } + return false; +} + +/* ---------------------------------------------------------------------- + check if filename has a known compression extension +------------------------------------------------------------------------- */ + +bool platform::has_compress_extension(const std::string &file) +{ + return find_compress_type(file).style != ::compress_info::NONE; +} + +/* ---------------------------------------------------------------------- + open pipe to read a compressed file +------------------------------------------------------------------------- */ + +FILE *platform::compressed_read(const std::string &file) +{ + FILE *fp = nullptr; + +#if defined(LAMMPS_GZIP) + auto compress = find_compress_type(file); + if (compress.style == ::compress_info::NONE) return nullptr; + + if (find_exe_path(compress.command).size()) + // put quotes around file name so that they may contain blanks + fp = popen((compress.command + compress.uncompressflags + "\"" + file + "\""), "r"); +#endif + return fp; +} + +/* ---------------------------------------------------------------------- + open pipe to write a compressed file +------------------------------------------------------------------------- */ + +FILE *platform::compressed_write(const std::string &file) +{ + FILE *fp = nullptr; + +#if defined(LAMMPS_GZIP) + auto compress = find_compress_type(file); + if (compress.style == ::compress_info::NONE) return nullptr; + + if (find_exe_path(compress.command).size()) + // put quotes around file name so that they may contain blanks + fp = popen((compress.command + compress.compressflags + "\"" + file + "\""), "w"); +#endif + return fp; +} + +/* ---------------------------------------------------------------------- */ diff --git a/src/platform.h b/src/platform.h new file mode 100644 index 0000000000..95a0c3cc35 --- /dev/null +++ b/src/platform.h @@ -0,0 +1,392 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef LMP_PLATFORM_H +#define LMP_PLATFORM_H + +/*! \file platform.h */ + +#include "lmptype.h" + +#include +#include + +namespace LAMMPS_NS { +namespace platform { + + /*! Return the consumed CPU time for the current process in seconds + * + * This is a wrapper around the POSIX function getrusage() and its Windows equivalent. + * It is to be used in a similar fashion than MPI_Wtime(). Its resolution may + * be rather low so it can only be trusted when observing processes consuming at + * seconds or more of CPU time. + * + * \return used CPU time in seconds */ + + double cputime(); + + /*! Return the wall clock state for the current process in seconds + * + * This this clock is counting continuous time is initialized during + * Load of the executable/library. Its absolute value must be considered + * arbitrary and thus elapsed wall times are measured in taking differences. + * It is therefore to be used in a similar fashion as MPI_Wtime() but + * has a different offset, usually leading to better resolution. + * + * \return wall clock time in seconds */ + + double walltime(); + + /*! Suspend execution for a microsecond interval + * + * This emulates the usleep(3) BSD function call also mentioned in POSIX.1-2001. + * This is not a precise delay; it may be longer, but not shorter. + * + * \param usec length of delay in microseconds */ + + void usleep(int usec); + + /*! Return string with the operating system version and architecture info + * + * \return string with info about the OS and the platform is is running on */ + + std::string os_info(); + + /*! Return string with C++ standard version used to compile LAMMPS. + * + * This function uses predefined compiler macros to identify + * the C++ standard version used to compile LAMMPS with. + * + * \return string with the C++ standard version or "unknown" */ + + std::string cxx_standard(); + + /*! Return string with compiler version info + * + * This function uses predefined compiler macros to identify + * Compilers and their version and configuration info. + * + * \return string with the compiler information text */ + + std::string compiler_info(); + + /*! Return string with OpenMP standard version info + * + * This function uses predefined compiler macros to identify + * OpenMP support and the supported version of the standard. + * + * \return string with the openmp information text */ + + std::string openmp_standard(); + + /*! Return string with MPI vendor info + * + * This function uses predefined macros to identify + * the vendor of the MPI library used. + * + * \return string with the MPI vendor information text */ + + std::string mpi_vendor(); + + /*! Return string with MPI version info + * + * This function uses predefined macros and MPI function + * calls to identify the version of the MPI library used. + * + * \param major major version of the MPI standard (set on exit) + * \param minor minor version of the MPI standard (set on exit) + * \return string with the MPI version information text */ + + std::string mpi_info(int &major, int &minor); + + /*! Return string with list of available compression types and executables + * + * This function tests which of the supported compression executables + * are available for reading or writing compressed files where supported. + * + * \return string with list of available compression tools */ + + std::string compress_info(); + + /*! Add variable to the environment + * + * \param vardef variable name or variable definition (NAME=value) + * \return -1 if failure otherwise 0 */ + + int putenv(const std::string &vardef); + + /*! Get list of entries in a path environment variable + * + * This provides a list of strings of the entries in an environment + * variable that is containing a "path" like "PATH" or "LD_LIBRARY_PATH". + * + * \param var name of the environment variable + * \return vector with strings of all entries in that path variable */ + + std::vector list_pathenv(const std::string &var); + + /*! Open a shared object file or library + * + * \param fname name or path of the shared object + * \return handle to the shared object or null */ + + void *dlopen(const std::string &fname); + + /*! Obtain error diagnostic info after dynamic linking function calls + * + * Return a human-readable string describing the most recent error that + * occurred when using one of the functions for dynamic loading objects + * the last call to this function. The string is empty, if there was no error. + * + * \return string with error message or empty */ + + std::string dlerror(); + + /*! Close a shared object + * + * This releases the object corresponding to the provided handle. + * Resolved symbols associated with this handle may not be used + * after this call + * + * \param handle handle to an opened shared object + * \return 0 if successful, non-zero of not */ + + int dlclose(void *handle); + + /*! Resolve a symbol in shared object + * + * \param handle handle to an opened shared object + * \param symbol name of the symbol to extract + * \return pointer to the resolved symbol or null */ + + void *dlsym(void *handle, const std::string &symbol); + + /*! Platform specific file path component separator + * + * This is a string with the character that separates directories and filename in paths on + * a platform. If multiple are characters are provided, the first is the preferred one. */ + +#if !defined(_WIN32) + constexpr char filepathsep[] = "/"; +#else + constexpr char filepathsep[] = "\\/"; +#endif + + /*! Platform specific path environment variable component separator + * + * This is the character that separates entries in "PATH"-style environment variables. */ + +#if !defined(_WIN32) + constexpr char pathvarsep = ':'; +#else + constexpr char pathvarsep = ';'; +#endif + + /*! Try to detect pathname from FILE pointer + * + * Currently only supported on Linux, MacOS, and Windows. Otherwise will report "(unknown)". + * + * \param fp FILE pointer struct from STDIO library for which we want to detect the name + * \param buf storage buffer for pathname. output will be truncated if not large enough + * \param len size of storage buffer. output will be truncated to this length - 1 + * \return pointer to the storage buffer with path or a NULL pointer if buf is invalid + * or the buffer size is too small */ + + const char *guesspath(FILE *fp, char *buf, int len); + + /*! Check if a file pointer may be connected to a console + * + * \param fp file pointer + * \return true if the file pointer is flagged as a TTY */ + + bool is_console(FILE *fp); + + /*! Get string with path to the current directory + * + * \return path to the current directory or empty string */ + + std::string current_directory(); + + /*! Check if a path is a directory + * + * \param path directory path + * \return true if the directory exists */ + + bool path_is_directory(const std::string &path); + + /*! Get list of entries in a directory + * + * This provides a list of strings of the entries in the directory + * without the leading path name while also skipping over ".." and ".". + * + * \param dir path to directory + * \return vector with strings of all directory entries */ + + std::vector list_directory(const std::string &dir); + + /*! Find pathname of an executable in the standard search path + * + * This function will traverse the list of directories in the PATH + * environment variable and look for the executable *cmd*. If the + * file exists and is executable the full path is returned as string, + * otherwise and empty string is returned. + * + * On Windows the *cmd* string must not include and extension as + * this function will automatically append the extensions ".exe", + * ".com" and ".bat" and look for those paths. On Windows also the + * current directory is checked (and first), while otherwise not unless + * "." exists in the PATH environment variable. + * + * Because of the nature of the check, this will not detect shell functions + * built-in command or aliases. + * + * \param cmd name of command + * \return vector with strings of all directory entries */ + + std::string find_exe_path(const std::string &cmd); + + /*! Change current directory + * + * \param path new current working directory path + * \return -1 if unsuccessful, otherwise >= 0 */ + + int chdir(const std::string &path); + + /*! Create a directory + * + * \param path directory path + * \return -1 if unsuccessful, otherwise >= 0 */ + + int mkdir(const std::string &path); + + /*! Delete a directory + * + * \param path directory path + * \return -1 if unsuccessful, otherwise >= 0 */ + + int rmdir(const std::string &path); + + /*! Delete a directory and its contents + * + * Unlike the the ``rmdir()`` or ``_rmdir()`` function of the + * C library, this function will check for the contents of the + * folder and recurse into any sub-folders, if necessary and + * delete all contained folders and their contents before + * deleting the folder *path*. + * + * \param path path to file to be deleted + * \return 0 on success, -1 on error */ + + int unlink(const std::string &path); + + /*! Get current file position + * + * \param fp FILE pointer of the given file + * \return current FILE pointer position cast to a bigint */ + + bigint ftell(FILE *fp); + + /*! constant to seek to the end of the file */ + constexpr bigint END_OF_FILE = -1; + + /*! Set absolute file position + * + * If the absolute position is END_OF_FILE, then position at the end of the file. + * + * \param fp FILE pointer of the given file + * \param pos new position of the FILE pointer + * \return 0 if successful, otherwise -1 */ + + int fseek(FILE *fp, bigint pos); + + /*! Truncate file to a given length and re-position file pointer + * + * \param fp FILE pointer of the given file + * \param length length to which the file is being truncated to + * \return 0 if successful, otherwise -1 */ + + int ftruncate(FILE *fp, bigint length); + + /*! Open a pipe to a command for reading or writing + * + * \param cmd command for the pipe + * \param mode "r" for reading from *cmd* or "w" for writing to *cmd* + * \return file pointer to the pipe if successful or null */ + + FILE *popen(const std::string &cmd, const std::string &mode); + + /*! Close a previously opened pipe + * + * \param fp FILE pointer for the pipe + * \return exit status of the pipe command or -1 in case of errors */ + + int pclose(FILE *fp); + + /*! Strip off leading part of path, return just the filename + * + * \param path file path + * \return file name */ + + std::string path_basename(const std::string &path); + + /*! Return the directory part of a path. Return "." if empty + * + * \param path file path + * \return directory name */ + + std::string path_dirname(const std::string &path); + + /*! Join two pathname segments + * + * This uses the forward slash '/' character unless LAMMPS is compiled + * for Windows where it uses the backward slash '\\' + * + * \param a first path + * \param b second path + * \return combined path */ + + std::string path_join(const std::string &a, const std::string &b); + + /*! Check if file exists and is readable + * + * \param path file path + * \return true if file exists and is readable */ + + bool file_is_readable(const std::string &path); + + /*! Check if a file name ends in a known extension for a compressed file format + * + * Currently supported file extensions are: .gz, .bz2, .zst, .xz, .lzma, lz4 + * + * \param file name of the file to check + * \return true if the file has a known extension, otherwise false */ + + bool has_compress_extension(const std::string &file); + + /*! Open pipe to compressed text file for reading + * + * \param file name of the file to open + * \return FILE pointer to pipe using for reading the compressed file. */ + + FILE *compressed_read(const std::string &file); + + /*! Open pipe to compressed text file for writing + * + * \param file name of the file to open + * \return FILE pointer to pipe using for reading the compressed file. */ + + FILE *compressed_write(const std::string &file); + +} // namespace platform +} // namespace LAMMPS_NS +#endif diff --git a/src/pointers.h b/src/pointers.h index 4ae50715c1..44820d06eb 100644 --- a/src/pointers.h +++ b/src/pointers.h @@ -23,13 +23,16 @@ #define LMP_POINTERS_H #include "lmptype.h" // IWYU pragma: export + #include // IWYU pragma: export #include // IWYU pragme: export #include // IWYU pragma: export #include // IWYU pragma: export -#include "lammps.h" // IWYU pragma: export -#include "utils.h" // IWYU pragma: export + #include "fmt/format.h" // IWYU pragma: export +#include "lammps.h" // IWYU pragma: export +#include "platform.h" // IWYU pragma: export +#include "utils.h" // IWYU pragma: export namespace LAMMPS_NS { @@ -90,6 +93,14 @@ class Pointers { python(ptr->python) {} virtual ~Pointers() {} + // remove default members execept for the copy constructor + + Pointers() = delete; + Pointers(const Pointers &) = default; + Pointers(Pointers &&) = delete; + Pointers & operator=(const Pointers&) = delete; + Pointers & operator=(Pointers&&) = delete; + protected: LAMMPS *lmp; Memory *&memory; diff --git a/src/procmap.cpp b/src/procmap.cpp index ed3839fe7b..3fc8a2263e 100644 --- a/src/procmap.cpp +++ b/src/procmap.cpp @@ -294,7 +294,7 @@ void ProcMap::custom_grid(char *cfile, int nprocs, char *ptr; if (!fgets(line,MAXLINE,fp)) error->one(FLERR,"Unexpected end of custom file"); - while (1) { + while (true) { if ((ptr = strchr(line,'#'))) *ptr = '\0'; if (strspn(line," \t\n\r") != strlen(line)) break; if (!fgets(line,MAXLINE,fp)) diff --git a/src/rcb.cpp b/src/rcb.cpp index b4d1c135ec..92eafebc28 100644 --- a/src/rcb.cpp +++ b/src/rcb.cpp @@ -285,7 +285,7 @@ void RCB::compute(int dimension, int n, double **x, double *wt, first_iteration = 1; indexlo = indexhi = 0; - while (1) { + while (true) { // choose bisector value // use old value on 1st iteration if old cut dimension is the same @@ -814,7 +814,7 @@ void RCB::compute_old(int dimension, int n, double **x, double *wt, first_iteration = 1; indexlo = indexhi = 0; - while (1) { + while (true) { // choose bisector value // use old value on 1st iteration if old cut dimension is the same diff --git a/src/read_data.cpp b/src/read_data.cpp index 2683366a39..473a0fcb2d 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -115,7 +115,7 @@ void ReadData::command(int narg, char **arg) if (narg < 1) error->all(FLERR,"Illegal read_data command"); MPI_Barrier(world); - double time1 = MPI_Wtime(); + double time1 = platform::walltime(); // optional args @@ -310,10 +310,14 @@ void ReadData::command(int narg, char **arg) // check if data file is available and readable - if (!utils::file_is_readable(arg[0])) + if (!platform::file_is_readable(arg[0])) error->all(FLERR,fmt::format("Cannot open file {}: {}", arg[0], utils::getsyserror())); + // reset so we can warn about reset image flags exactly once per data file + + atom->reset_image_flag[0] = atom->reset_image_flag[1] = atom->reset_image_flag[2] = false; + // first time system initialization if (addflag == NONE) { @@ -428,7 +432,7 @@ void ReadData::command(int narg, char **arg) nlocal_previous = atom->nlocal; int firstpass = 1; - while (1) { + while (true) { // open file on proc 0 @@ -803,7 +807,7 @@ void ReadData::command(int narg, char **arg) // close file if (me == 0) { - if (compressed) pclose(fp); + if (compressed) platform::pclose(fp); else fclose(fp); fp = nullptr; } @@ -976,7 +980,7 @@ void ReadData::command(int narg, char **arg) MPI_Barrier(world); if (comm->me == 0) - utils::logmesg(lmp," read_data CPU = {:.3f} seconds\n",MPI_Wtime()-time1); + utils::logmesg(lmp," read_data CPU = {:.3f} seconds\n",platform::walltime()-time1); } /* ---------------------------------------------------------------------- @@ -1025,7 +1029,7 @@ void ReadData::header(int firstpass) if (eof == nullptr) error->one(FLERR,"Unexpected end of data file"); } - while (1) { + while (true) { // read a line and bcast length @@ -1306,6 +1310,22 @@ void ReadData::atoms() nread += nchunk; } + // warn if we have read data with non-zero image flags for non-periodic boundaries. + // we may want to turn this into an error at some point, since this essentially + // creates invalid position information that works by accident most of the time. + + if (comm->me == 0) { + if (atom->reset_image_flag[0]) + error->warning(FLERR,"Non-zero imageflag(s) in x direction for " + "non-periodic boundary reset to zero"); + if (atom->reset_image_flag[1]) + error->warning(FLERR,"Non-zero imageflag(s) in y direction for " + "non-periodic boundary reset to zero"); + if (atom->reset_image_flag[2]) + error->warning(FLERR,"Non-zero imageflag(s) in z direction for " + "non-periodic boundary reset to zero"); + } + // check that all atoms were assigned correctly bigint n = atom->nlocal; @@ -2113,34 +2133,20 @@ int ReadData::reallocate(int **pcount, int cmax, int amax) /* ---------------------------------------------------------------------- proc 0 opens data file - test if gzipped + test if compressed ------------------------------------------------------------------------- */ -void ReadData::open(char *file) +void ReadData::open(const std::string &file) { - if (utils::strmatch(file,"\\.gz$")) { + if (platform::has_compress_extension(file)) { compressed = 1; - -#ifdef LAMMPS_GZIP - auto gunzip = fmt::format("gzip -c -d {}",file); - -#ifdef _WIN32 - fp = _popen(gunzip.c_str(),"rb"); -#else - fp = popen(gunzip.c_str(),"r"); -#endif - -#else - error->one(FLERR,"Cannot open gzipped file without gzip support"); -#endif + fp = platform::compressed_read(file); + if (!fp) error->one(FLERR,"Cannot open compressed file {}", file); } else { compressed = 0; - fp = fopen(file,"r"); + fp = fopen(file.c_str(),"r"); + if (!fp) error->one(FLERR,"Cannot open file {}: {}", file, utils::getsyserror()); } - - if (fp == nullptr) - error->one(FLERR,"Cannot open file {}: {}", - file, utils::getsyserror()); } /* ---------------------------------------------------------------------- diff --git a/src/read_data.h b/src/read_data.h index 8c4e19e4f0..30e7d49cb4 100644 --- a/src/read_data.h +++ b/src/read_data.h @@ -83,7 +83,7 @@ class ReadData : public Command { // methods - void open(char *); + void open(const std::string &); void scan(int &, int &, int &, int &); int reallocate(int **, int, int); void header(int); diff --git a/src/read_dump.cpp b/src/read_dump.cpp index c09bd38c87..71d302c4f1 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -233,7 +233,7 @@ void ReadDump::setup_reader(int narg, char **arg) // create Nreader reader classes per reader // match readerstyle to options in style_reader.h - if (0) { + if (false) { return; // dummy line to enable else-if macro expansion #define READER_CLASS @@ -289,7 +289,7 @@ bigint ReadDump::seek(bigint nrequest, int exact) readers[0]->open_file(multiname.c_str()); } else readers[0]->open_file(files[ifile]); - while (1) { + while (true) { eofflag = readers[0]->read_time(ntimestep); if (eofflag) break; if (ntimestep >= nrequest) break; @@ -333,7 +333,7 @@ bigint ReadDump::seek(bigint nrequest, int exact) readers[i]->open_file(multiname.c_str()); bigint step; - while (1) { + while (true) { eofflag = readers[i]->read_time(step); if (eofflag) break; if (step == ntimestep) break; @@ -382,7 +382,7 @@ bigint ReadDump::next(bigint ncurrent, bigint nlast, int nevery, int nskip) } else readers[0]->open_file(files[ifile]); } - while (1) { + while (true) { eofflag = readers[0]->read_time(ntimestep); if (eofflag) break; if (ntimestep > nlast) break; @@ -435,7 +435,7 @@ bigint ReadDump::next(bigint ncurrent, bigint nlast, int nevery, int nskip) readers[i]->open_file(multiname.c_str()); bigint step; - while (1) { + while (true) { eofflag = readers[i]->read_time(step); if (eofflag) break; if (step == ntimestep) break; diff --git a/src/read_restart.cpp b/src/read_restart.cpp index 7a20dbb967..5eb38c26c8 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -36,7 +36,6 @@ #include "update.h" #include -#include #include "lmprestart.h" @@ -56,7 +55,7 @@ void ReadRestart::command(int narg, char **arg) error->all(FLERR,"Cannot read_restart after simulation box is defined"); MPI_Barrier(world); - double time1 = MPI_Wtime(); + double time1 = platform::walltime(); MPI_Comm_rank(world,&me); MPI_Comm_size(world,&nprocs); @@ -118,6 +117,7 @@ void ReadRestart::command(int narg, char **arg) magic_string(); endian(); format_revision(); + check_eof_magic(); // read header info which creates simulation box @@ -523,7 +523,7 @@ void ReadRestart::command(int narg, char **arg) MPI_Barrier(world); if (comm->me == 0) - utils::logmesg(lmp," read_restart CPU = {:.3f} seconds\n",MPI_Wtime()-time1); + utils::logmesg(lmp," read_restart CPU = {:.3f} seconds\n",platform::walltime()-time1); delete mpiio; } @@ -541,8 +541,8 @@ std::string ReadRestart::file_search(const std::string &inpfile) { // separate inpfile into dir + filename - auto dirname = utils::path_dirname(inpfile); - auto filename = utils::path_basename(inpfile); + auto dirname = platform::path_dirname(inpfile); + auto filename = platform::path_basename(inpfile); // if filename contains "%" replace "%" with "base" @@ -558,24 +558,20 @@ std::string ReadRestart::file_search(const std::string &inpfile) if (loc != std::string::npos) { // convert pattern to equivalent regexp pattern.replace(loc,1,"\\d+"); - struct dirent *ep; - DIR *dp = opendir(dirname.c_str()); - if (dp == nullptr) - error->one(FLERR,"Cannot open directory {} to search for restart file: {}", - dirname, utils::getsyserror()); - while ((ep = readdir(dp))) { - std::string candidate(ep->d_name); + if (!platform::path_is_directory(dirname)) + error->one(FLERR,"Cannot open directory {} to search for restart file: {}",dirname); + + for (const auto &candidate : platform::list_directory(dirname)) { if (utils::strmatch(candidate,pattern)) { bigint num = ATOBIGINT(utils::strfind(candidate.substr(loc),"\\d+").c_str()); if (num > maxnum) maxnum = num; } } - closedir(dp); if (maxnum < 0) error->one(FLERR,"Found no restart file matching pattern"); filename.replace(filename.find('*'),1,std::to_string(maxnum)); } - return utils::path_join(dirname,filename); + return platform::path_join(dirname,filename); } /* ---------------------------------------------------------------------- @@ -1090,11 +1086,11 @@ void ReadRestart::file_layout() flag = read_int(); } - // if MPI-IO file, broadcast the end of the header offste + // if MPI-IO file, broadcast the end of the header offset // this allows all ranks to compute offset to their data if (mpiioflag) { - if (me == 0) headerOffset = ftell(fp); + if (me == 0) headerOffset = platform::ftell(fp); MPI_Bcast(&headerOffset,1,MPI_LMP_BIGINT,0,world); } } @@ -1158,10 +1154,12 @@ void ReadRestart::check_eof_magic() // read magic string at end of file and restore file pointer if (me == 0) { - long curpos = ftell(fp); - fseek(fp,(long)-n,SEEK_END); + bigint curpos = platform::ftell(fp); + platform::fseek(fp,platform::END_OF_FILE); + bigint offset = platform::ftell(fp) - n; + platform::fseek(fp,offset); utils::sfread(FLERR,str,sizeof(char),n,fp,nullptr,error); - fseek(fp,curpos,SEEK_SET); + platform::fseek(fp,curpos); } MPI_Bcast(str,n,MPI_CHAR,0,world); diff --git a/src/reader.cpp b/src/reader.cpp index 71036e7444..f2652d868d 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -32,33 +32,20 @@ Reader::Reader(LAMMPS *lmp) : Pointers(lmp) generic version for ASCII files that may be compressed ------------------------------------------------------------------------- */ -void Reader::open_file(const char *file) +void Reader::open_file(const std::string &file) { if (fp != nullptr) close_file(); - if (utils::strmatch(file,"\\.gz$")) { + if (platform::has_compress_extension(file)) { compressed = 1; - -#ifdef LAMMPS_GZIP - auto gunzip = fmt::format("gzip -c -d {}",file); - -#ifdef _WIN32 - fp = _popen(gunzip.c_str(),"rb"); -#else - fp = popen(gunzip.c_str(),"r"); -#endif - -#else - error->one(FLERR,"Cannot open gzipped file without gzip support"); -#endif + fp = platform::compressed_read(file); + if (!fp) error->one(FLERR,"Cannot open compressed file for reading"); } else { compressed = 0; - fp = fopen(file,"r"); + fp = fopen(file.c_str(),"r"); } - if (fp == nullptr) - error->one(FLERR,"Cannot open file {}: {}", - file, utils::getsyserror()); + if (!fp) error->one(FLERR,"Cannot open file {}: {}", file, utils::getsyserror()); } /* ---------------------------------------------------------------------- @@ -69,7 +56,7 @@ void Reader::open_file(const char *file) void Reader::close_file() { if (fp == nullptr) return; - if (compressed) pclose(fp); + if (compressed) platform::pclose(fp); else fclose(fp); fp = nullptr; } diff --git a/src/reader.h b/src/reader.h index 2d71750f98..18977790cd 100644 --- a/src/reader.h +++ b/src/reader.h @@ -33,7 +33,7 @@ class Reader : protected Pointers { int &, int &, int &) = 0; virtual void read_atoms(int, int, double **) = 0; - virtual void open_file(const char *); + virtual void open_file(const std::string &); virtual void close_file(); protected: diff --git a/src/replicate.cpp b/src/replicate.cpp index 2c2b512026..80edd7bcbc 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -79,7 +79,7 @@ void Replicate::command(int narg, char **arg) // record wall time for atom replication MPI_Barrier(world); - double time1 = MPI_Wtime(); + double time1 = platform::walltime(); // maxtag = largest atom tag across all existing atoms @@ -799,5 +799,5 @@ void Replicate::command(int narg, char **arg) MPI_Barrier(world); if (me == 0) - utils::logmesg(lmp," replicate CPU = {:.3f} seconds\n",MPI_Wtime()-time1); + utils::logmesg(lmp," replicate CPU = {:.3f} seconds\n",platform::walltime()-time1); } diff --git a/src/rerun.cpp b/src/rerun.cpp index ce21fbc2b8..78b1a28cb6 100644 --- a/src/rerun.cpp +++ b/src/rerun.cpp @@ -156,7 +156,7 @@ void Rerun::command(int narg, char **arg) if (ntimestep < 0) error->all(FLERR,"Rerun dump file does not contain requested snapshot"); - while (1) { + while (true) { ndump++; rd->header(firstflag); update->reset_timestep(ntimestep); diff --git a/src/reset_mol_ids.cpp b/src/reset_mol_ids.cpp index 424b4bcb6c..4c973f543f 100644 --- a/src/reset_mol_ids.cpp +++ b/src/reset_mol_ids.cpp @@ -96,7 +96,7 @@ void ResetMolIDs::command(int narg, char **arg) // record wall time for resetting molecule IDs MPI_Barrier(world); - double time1 = MPI_Wtime(); + double time1 = platform::walltime(); // initialize system since comm->borders() will be invoked @@ -132,7 +132,7 @@ void ResetMolIDs::command(int narg, char **arg) else utils::logmesg(lmp," number of new molecule IDs = {}\n",nchunk); utils::logmesg(lmp," reset_mol_ids CPU = {:.3f} seconds\n", - MPI_Wtime()-time1); + platform::walltime()-time1); } } diff --git a/src/special.cpp b/src/special.cpp index dcc0d0c0ad..9f480da78f 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -56,7 +56,7 @@ Special::~Special() void Special::build() { MPI_Barrier(world); - double time1 = MPI_Wtime(); + double time1 = platform::walltime(); if (me == 0) { const double * const special_lj = force->special_lj; @@ -1303,5 +1303,5 @@ void Special::timer_output(double time1) { if (comm->me == 0) utils::logmesg(lmp," special bonds CPU = {:.3f} seconds\n", - MPI_Wtime()-time1); + platform::walltime()-time1); } diff --git a/src/table_file_reader.cpp b/src/table_file_reader.cpp index bcd4e91886..bfbd466ae8 100644 --- a/src/table_file_reader.cpp +++ b/src/table_file_reader.cpp @@ -30,9 +30,6 @@ TableFileReader::TableFileReader(LAMMPS *lmp, { } -TableFileReader::~TableFileReader() { -} - char *TableFileReader::find_section_start(const std::string &keyword) { char *line = nullptr; while ((line = reader->next_line())) { diff --git a/src/table_file_reader.h b/src/table_file_reader.h index 643e1ce93c..832e68a34f 100644 --- a/src/table_file_reader.h +++ b/src/table_file_reader.h @@ -25,7 +25,7 @@ class TableFileReader : public PotentialFileReader { public: TableFileReader(class LAMMPS *lmp, const std::string &filename, const std::string &type, const int auto_convert = 0); - virtual ~TableFileReader(); + virtual ~TableFileReader() = default; char *find_section_start(const std::string &keyword); }; diff --git a/src/text_file_reader.cpp b/src/text_file_reader.cpp index 8fc57d9283..ab1c81efb1 100644 --- a/src/text_file_reader.cpp +++ b/src/text_file_reader.cpp @@ -22,6 +22,7 @@ #include "utils.h" #include +#include using namespace LAMMPS_NS; @@ -68,8 +69,8 @@ This function is useful in combination with :cpp:func:`utils::open_potential`. * \param fp File descriptor of the already opened file * \param filetype Description of file type for error messages */ -TextFileReader::TextFileReader(FILE *fp, const std::string &filetype) : - filetype(filetype), closefp(false), fp(fp), ignore_comments(true) +TextFileReader::TextFileReader(FILE *fp, std::string filetype) : + filetype(std::move(filetype)), closefp(false), fp(fp), ignore_comments(true) { if (fp == nullptr) throw FileReaderException("Invalid file descriptor"); } diff --git a/src/text_file_reader.h b/src/text_file_reader.h index 98657a937e..34556d7eb3 100644 --- a/src/text_file_reader.h +++ b/src/text_file_reader.h @@ -34,7 +34,7 @@ class TextFileReader { bool ignore_comments; //!< Controls whether comments are ignored TextFileReader(const std::string &filename, const std::string &filetype); - TextFileReader(FILE *fp, const std::string &filetype); + TextFileReader(FILE *fp, std::string filetype); ~TextFileReader(); @@ -52,9 +52,9 @@ class FileReaderException : public std::exception { public: FileReaderException(const std::string &msg) : message(msg) {} - ~FileReaderException() throw() {} + ~FileReaderException() noexcept {} - virtual const char *what() const throw() { return message.c_str(); } + virtual const char *what() const noexcept { return message.c_str(); } }; class EOFException : public FileReaderException { diff --git a/src/timer.cpp b/src/timer.cpp index b01a7aa9d6..0cbf687137 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -20,50 +20,8 @@ #include -#ifdef _WIN32 -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include -#else -#include -#include -#endif - using namespace LAMMPS_NS; - -// Return the CPU time for the current process in seconds very -// much in the same way as MPI_Wtime() returns the wall time. - -static double CPU_Time() -{ - double rv = 0.0; - -#ifdef _WIN32 - - // from MSD docs. - FILETIME ct,et,kt,ut; - union { FILETIME ft; uint64_t ui; } cpu; - if (GetProcessTimes(GetCurrentProcess(),&ct,&et,&kt,&ut)) { - cpu.ft = ut; - rv = cpu.ui * 0.0000001; - } - -#else /* ! _WIN32 */ - - struct rusage ru; - if (getrusage(RUSAGE_SELF, &ru) == 0) { - rv = (double) ru.ru_utime.tv_sec; - rv += (double) ru.ru_utime.tv_usec * 0.000001; - } - -#endif /* ! _WIN32 */ - - return rv; -} - /* ---------------------------------------------------------------------- */ Timer::Timer(LAMMPS *lmp) : Pointers(lmp) @@ -93,8 +51,8 @@ void Timer::_stamp(enum ttype which) { double current_cpu=0.0, current_wall=0.0; - if (_level > NORMAL) current_cpu = CPU_Time(); - current_wall = MPI_Wtime(); + if (_level > NORMAL) current_cpu = platform::cputime(); + current_wall = platform::walltime(); if ((which > TOTAL) && (which < NUM_TIMER)) { const double delta_cpu = current_cpu - previous_cpu; @@ -117,8 +75,8 @@ void Timer::_stamp(enum ttype which) if (_sync) { MPI_Barrier(world); - if (_level > NORMAL) current_cpu = CPU_Time(); - current_wall = MPI_Wtime(); + if (_level > NORMAL) current_cpu = platform::cputime(); + current_wall = platform::walltime(); cpu_array[SYNC] += current_cpu - previous_cpu; wall_array[SYNC] += current_wall - previous_wall; @@ -137,8 +95,8 @@ void Timer::barrier_start() if (_level < LOOP) return; - current_cpu = CPU_Time(); - current_wall = MPI_Wtime(); + current_cpu = platform::cputime(); + current_wall = platform::walltime(); cpu_array[TOTAL] = current_cpu; wall_array[TOTAL] = current_wall; @@ -156,8 +114,8 @@ void Timer::barrier_stop() if (_level < LOOP) return; - current_cpu = CPU_Time(); - current_wall = MPI_Wtime(); + current_cpu = platform::cputime(); + current_wall = platform::walltime(); cpu_array[TOTAL] = current_cpu - cpu_array[TOTAL]; wall_array[TOTAL] = current_wall - wall_array[TOTAL]; @@ -167,7 +125,7 @@ void Timer::barrier_stop() double Timer::cpu(enum ttype which) { - double current_cpu = CPU_Time(); + double current_cpu = platform::cputime(); return (current_cpu - cpu_array[which]); } @@ -176,7 +134,7 @@ double Timer::cpu(enum ttype which) double Timer::elapsed(enum ttype which) { if (_level == OFF) return 0.0; - double current_wall = MPI_Wtime(); + double current_wall = platform::walltime(); return (current_wall - wall_array[which]); } @@ -207,7 +165,7 @@ void Timer::print_timeout(FILE *fp) // format timeout setting if (_timeout > 0) { // time since init_timeout() - const double d = MPI_Wtime() - timeout_start; + const double d = platform::walltime() - timeout_start; // remaining timeout in seconds int s = _timeout - d; // remaining 1/100ths of seconds @@ -226,7 +184,7 @@ void Timer::print_timeout(FILE *fp) bool Timer::_check_timeout() { - double walltime = MPI_Wtime() - timeout_start; + double walltime = platform::walltime() - timeout_start; // broadcast time to insure all ranks act the same. MPI_Bcast(&walltime,1,MPI_DOUBLE,0,world); @@ -244,7 +202,7 @@ bool Timer::_check_timeout() /* ---------------------------------------------------------------------- */ double Timer::get_timeout_remain() { - return (_timeout < 0.0) ? 0.0 : _timeout + timeout_start - MPI_Wtime(); + return (_timeout < 0.0) ? 0.0 : _timeout + timeout_start - platform::walltime(); } /* ---------------------------------------------------------------------- @@ -285,7 +243,7 @@ void Timer::modify_params(int narg, char **arg) ++iarg; } - timeout_start = MPI_Wtime(); + timeout_start = platform::walltime(); if (comm->me == 0) { // format timeout setting diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 538cd716ad..35a313ab3d 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -46,11 +46,11 @@ TokenizerException::TokenizerException(const std::string &msg, const std::string \endverbatim * - * \param str string to be processed - * \param separators string with separator characters (default: " \t\r\n\f") */ + * \param str string to be processed + * \param _separators string with separator characters (default: " \t\r\n\f") */ -Tokenizer::Tokenizer(const std::string &str, const std::string &separators) : - text(str), separators(separators), start(0), ntokens(std::string::npos) +Tokenizer::Tokenizer(std::string str, std::string _separators) : + text(std::move(str)), separators(std::move(_separators)), start(0), ntokens(std::string::npos) { // replace known UTF-8 characters with ASCII equivalents if (utils::has_utf8(text)) text = utils::utf8_subst(text); @@ -198,9 +198,6 @@ std::vector Tokenizer::as_vector() { ValueTokenizer::ValueTokenizer(const std::string &str, const std::string &separators) : tokens(str, separators) { } -ValueTokenizer::ValueTokenizer(const ValueTokenizer &rhs) : tokens(rhs.tokens) { -} - ValueTokenizer::ValueTokenizer(ValueTokenizer &&rhs) : tokens(std::move(rhs.tokens)) { } diff --git a/src/tokenizer.h b/src/tokenizer.h index 7f45a512dd..060e1bf6e3 100644 --- a/src/tokenizer.h +++ b/src/tokenizer.h @@ -35,7 +35,7 @@ class Tokenizer { size_t ntokens; public: - Tokenizer(const std::string &str, const std::string &separators = TOKENIZER_DEFAULT_SEPARATORS); + Tokenizer(std::string str, std::string separators = TOKENIZER_DEFAULT_SEPARATORS); Tokenizer(Tokenizer &&); Tokenizer(const Tokenizer &); Tokenizer &operator=(const Tokenizer &); @@ -60,13 +60,13 @@ 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() throw() {} + ~TokenizerException() noexcept {} /** Retrieve message describing the thrown exception * \return string with error message */ - virtual const char *what() const throw() { return message.c_str(); } + virtual const char *what() const noexcept { return message.c_str(); } }; class InvalidIntegerException : public TokenizerException { @@ -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) { } @@ -97,7 +97,7 @@ class ValueTokenizer { public: ValueTokenizer(const std::string &str, const std::string &separators = TOKENIZER_DEFAULT_SEPARATORS); - ValueTokenizer(const ValueTokenizer &); + ValueTokenizer(const ValueTokenizer &) = default; ValueTokenizer(ValueTokenizer &&); ValueTokenizer &operator=(const ValueTokenizer &); ValueTokenizer &operator=(ValueTokenizer &&); diff --git a/src/universe.cpp b/src/universe.cpp index 005a91fc6b..bd06300d12 100644 --- a/src/universe.cpp +++ b/src/universe.cpp @@ -98,7 +98,7 @@ void Universe::reorder(char *style, char *arg) char *ptr; if (!fgets(line,MAXLINE,fp)) error->one(FLERR,"Unexpected end of -reorder file"); - while (1) { + while (true) { if ((ptr = strchr(line,'#'))) *ptr = '\0'; if (strspn(line," \t\n\r") != strlen(line)) break; if (!fgets(line,MAXLINE,fp)) diff --git a/src/utils.cpp b/src/utils.cpp index 2feba5db97..b6c0908934 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -31,25 +31,6 @@ #include #include -#if defined(__linux__) -#include // for readlink -#endif - -#if defined(__APPLE__) -#include // for fcntl -#include -#endif - -#if defined(_WIN32) -// target Windows version is Windows 7 and later -#if defined(_WIN32_WINNT) -#undef _WIN32_WINNT -#endif -#define _WIN32_WINNT _WIN32_WINNT_WIN7 -#include -#include -#endif - /*! \file utils.cpp */ /* @@ -162,45 +143,7 @@ void utils::fmtargs_logmesg(LAMMPS *lmp, fmt::string_view format, fmt::format_ar std::string utils::getsyserror() { - return std::string(strerror(errno)); -} - -/** On Linux the folder /proc/self/fd holds symbolic links to the actual - * pathnames associated with each open file descriptor of the current process. - * On MacOS the same kind of information can be obtained using ``fcntl(fd,F_GETPATH,buf)``. - * On Windows we use ``GetFinalPathNameByHandleA()`` which is available with - * Windows Vista and later. - * - * This function is used to provide a filename with error messages in functions - * where the filename is not passed as an argument, but the FILE * pointer. - */ -const char *utils::guesspath(char *buf, int len, FILE *fp) -{ - memset(buf, 0, len); - -#if defined(__linux__) - int fd = fileno(fp); - // get pathname from /proc or copy (unknown) - if (readlink(fmt::format("/proc/self/fd/{}", fd).c_str(), buf, len - 1) <= 0) - strncpy(buf, "(unknown)", len - 1); -#elif defined(__APPLE__) - int fd = fileno(fp); - char filepath[PATH_MAX]; - if (fcntl(fd, F_GETPATH, filepath) != -1) - strncpy(buf, filepath, len - 1); - else - strncpy(buf, "(unknown)", len - 1); -#elif defined(_WIN32) - char filepath[MAX_PATH]; - HANDLE h = (HANDLE) _get_osfhandle(_fileno(fp)); - if (GetFinalPathNameByHandleA(h, filepath, PATH_MAX, FILE_NAME_NORMALIZED) > 0) - strncpy(buf, filepath, len - 1); - else - strncpy(buf, "(unknown)", len - 1); -#else - strncpy(buf, "(unknown)", len - 1); -#endif - return buf; + return {strerror(errno)}; } // read line into buffer. if line is too long keep reading until EOL or EOF @@ -256,7 +199,7 @@ void utils::sfgets(const char *srcname, int srcline, char *s, int size, FILE *fp std::string errmsg; // try to figure out the file name from the file pointer - if (!filename) filename = guesspath(buf, MAXPATHLENBUF, fp); + if (!filename) filename = platform::guesspath(fp, buf, MAXPATHLENBUF); if (feof(fp)) { errmsg = "Unexpected end of file while reading file '"; @@ -285,7 +228,7 @@ void utils::sfread(const char *srcname, int srcline, void *s, size_t size, size_ std::string errmsg; // try to figure out the file name from the file pointer - if (!filename) filename = guesspath(buf, MAXPATHLENBUF, fp); + if (!filename) filename = platform::guesspath(fp, buf, MAXPATHLENBUF); if (feof(fp)) { errmsg = "Unexpected end of file while reading file '"; @@ -369,7 +312,7 @@ int utils::logical(const char *file, int line, const char *str, bool do_abort, L lmp->error->all(file, line, msg); } - // convert to ascii and lowercase + // convert to ascii std::string buf(str); if (has_utf8(buf)) buf = utf8_subst(buf); @@ -718,7 +661,10 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod } for (int index = nlo; index <= nhi; index++) { - earg[newarg] = utils::strdup(fmt::format("{}2_{}[{}]{}", word[0], id, index, tail)); + if (word[1] == '2') + earg[newarg] = utils::strdup(fmt::format("{}2_{}[{}]{}", word[0], id, index, tail)); + else + earg[newarg] = utils::strdup(fmt::format("{}_{}[{}]{}", word[0], id, index, tail)); newarg++; } } else { @@ -751,6 +697,28 @@ char *utils::strdup(const std::string &text) return tmp; } +/* ---------------------------------------------------------------------- + Return string converted to lowercase +------------------------------------------------------------------------- */ + +std::string utils::lowercase(const std::string &text) +{ + std::string converted(text); + for (auto &c : converted) c = ::tolower(c); + return converted; +} + +/* ---------------------------------------------------------------------- + Return string converted to uppercase +------------------------------------------------------------------------- */ + +std::string utils::uppercase(const std::string &text) +{ + std::string converted(text); + for (auto &c : converted) c = ::toupper(c); + return converted; +} + /* ---------------------------------------------------------------------- Return string without leading or trailing whitespace ------------------------------------------------------------------------- */ @@ -773,7 +741,7 @@ std::string utils::trim_comment(const std::string &line) { auto end = line.find_first_of('#'); if (end != std::string::npos) { return line.substr(0, end); } - return std::string(line); + return {line}; } /* ---------------------------------------------------------------------- @@ -920,7 +888,7 @@ size_t utils::count_words(const std::string &text, const std::string &separators size_t utils::trim_and_count_words(const std::string &text, const std::string &separators) { - return utils::count_words(utils::trim_comment(text), separators); + return utils::count_words(trim_comment(text), separators); } /* ---------------------------------------------------------------------- @@ -989,7 +957,7 @@ std::vector utils::split_words(const std::string &text) } // unquoted - while (1) { + while (true) { if ((c == '\'') || (c == '"')) goto quoted; // skip escaped quote if ((c == '\\') && ((buf[1] == '\'') || (buf[1] == '"'))) { @@ -1065,71 +1033,6 @@ bool utils::is_id(const std::string &str) return true; } -/* ---------------------------------------------------------------------- - strip off leading part of path, return just the filename -------------------------------------------------------------------------- */ - -std::string utils::path_basename(const std::string &path) -{ -#if defined(_WIN32) - size_t start = path.find_last_of("/\\"); -#else - size_t start = path.find_last_of('/'); -#endif - - if (start == std::string::npos) { - start = 0; - } else { - start += 1; - } - - return path.substr(start); -} - -/* ---------------------------------------------------------------------- - Return only the leading part of a path, return just the directory -------------------------------------------------------------------------- */ - -std::string utils::path_dirname(const std::string &path) -{ -#if defined(_WIN32) - size_t start = path.find_last_of("/\\"); -#else - size_t start = path.find_last_of('/'); -#endif - - if (start == std::string::npos) return "."; - - return path.substr(0, start); -} - -/* ---------------------------------------------------------------------- - join two paths -------------------------------------------------------------------------- */ - -std::string utils::path_join(const std::string &a, const std::string &b) -{ -#if defined(_WIN32) - return fmt::format("{}\\{}", a, b); -#else - return fmt::format("{}/{}", a, b); -#endif -} - -/* ---------------------------------------------------------------------- - try to open file for reading -------------------------------------------------------------------------- */ - -bool utils::file_is_readable(const std::string &path) -{ - FILE *fp = fopen(path.c_str(), "r"); - if (fp) { - fclose(fp); - return true; - } - return false; -} - /* ---------------------------------------------------------------------- try to find potential file as specified by name search current directory and the LAMMPS_POTENTIALS directory if @@ -1138,28 +1041,13 @@ bool utils::file_is_readable(const std::string &path) std::string utils::get_potential_file_path(const std::string &path) { - std::string filepath = path; - std::string filename = utils::path_basename(path); - - if (utils::file_is_readable(filepath)) { - return filepath; + if (platform::file_is_readable(path)) { + return path; } else { - // try the environment variable directory - const char *var = getenv("LAMMPS_POTENTIALS"); - - if (var != nullptr) { -#if defined(_WIN32) - Tokenizer dirs(var, ";"); -#else - Tokenizer dirs(var, ":"); -#endif - while (dirs.has_next()) { - auto pot = utils::path_basename(filepath); - auto dir = dirs.next(); - filepath = utils::path_join(dir, pot); - - if (utils::file_is_readable(filepath)) { return filepath; } - } + for (const auto &dir : platform::list_pathenv("LAMMPS_POTENTIALS")) { + auto pot = platform::path_basename(path); + auto filepath = platform::path_join(dir, pot); + if (platform::file_is_readable(filepath)) return filepath; } } return ""; @@ -1309,7 +1197,7 @@ double utils::timespec2seconds(const std::string ×pec) if (!values.has_next()) break; vals[i] = values.next_int(); } - } catch (TokenizerException &e) { + } catch (TokenizerException &) { return -1.0; } @@ -1596,7 +1484,7 @@ static int ismetachar(char c); int re_matchp(const char *text, re_t pattern, int *matchlen) { *matchlen = 0; - if (pattern != 0) { + if (pattern != nullptr) { if (pattern[0].type == RX_BEGIN) { return ((matchpattern(&pattern[1], text, matchlen)) ? 0 : -1); } else { @@ -1710,7 +1598,7 @@ re_t re_compile(re_ctx_t context, const char *pattern) i += 1; /* Increment i to avoid including '^' in the char-buffer */ if (pattern[i + 1] == 0) /* incomplete pattern, missing non-zero char after '^' */ { - return 0; + return nullptr; } } else { re_compiled[j].type = RX_CHAR_CLASS; @@ -1720,20 +1608,20 @@ re_t re_compile(re_ctx_t context, const char *pattern) while ((pattern[++i] != ']') && (pattern[i] != '\0')) { /* Missing ] */ if (pattern[i] == '\\') { - if (ccl_bufidx >= MAX_CHAR_CLASS_LEN - 1) { return 0; } + if (ccl_bufidx >= MAX_CHAR_CLASS_LEN - 1) { return nullptr; } if (pattern[i + 1] == 0) /* incomplete pattern, missing non-zero char after '\\' */ { - return 0; + return nullptr; } ccl_buf[ccl_bufidx++] = pattern[i++]; } else if (ccl_bufidx >= MAX_CHAR_CLASS_LEN) { - return 0; + return nullptr; } ccl_buf[ccl_bufidx++] = pattern[i]; } if (ccl_bufidx >= MAX_CHAR_CLASS_LEN) { /* Catches cases such as [00000000000000000000000000000000000000][ */ - return 0; + return nullptr; } /* Null-terminate string end */ ccl_buf[ccl_bufidx++] = 0; @@ -1748,7 +1636,7 @@ re_t re_compile(re_ctx_t context, const char *pattern) } /* no buffer-out-of-bounds access on invalid patterns - * see https://github.com/kokke/tiny-regex-c/commit/1a279e04014b70b0695fba559a7c05d55e6ee90b */ - if (pattern[i] == 0) { return 0; } + if (pattern[i] == 0) { return nullptr; } i += 1; j += 1; diff --git a/src/utils.h b/src/utils.h index 4dd4eea090..1feee26f27 100644 --- a/src/utils.h +++ b/src/utils.h @@ -282,6 +282,20 @@ namespace utils { char *strdup(const std::string &text); + /*! Convert string to lowercase + * + * \param line string that should be converted + * \return new string with all lowercase characters */ + + std::string lowercase(const std::string &line); + + /*! Convert string to uppercase + * + * \param line string that should be converted + * \return new string with all uppercase characters */ + + std::string uppercase(const std::string &line); + /*! Trim leading and trailing whitespace. Like TRIM() in Fortran. * * \param line string that should be trimmed @@ -417,49 +431,6 @@ namespace utils { bool is_id(const std::string &str); - /*! Try to detect pathname from FILE pointer. - * - * Currently supported on Linux, MacOS, and Windows, otherwise will report "(unknown)". - * - * \param buf storage buffer for pathname. output will be truncated if not large enough - * \param len size of storage buffer. output will be truncated to this length - 1 - * \param fp FILE pointer struct from STDIO library for which we want to detect the name - * \return pointer to the storage buffer, i.e. buf */ - - const char *guesspath(char *buf, int len, FILE *fp); - - /*! Strip off leading part of path, return just the filename - * - * \param path file path - * \return file name */ - - std::string path_basename(const std::string &path); - - /*! Return the directory part of a path. Return "." if empty - * - * \param path file path - * \return directory name */ - - std::string path_dirname(const std::string &path); - - /*! Join two pathname segments - * - * This uses the forward slash '/' character unless LAMMPS is compiled - * for Windows where it used the equivalent backward slash '\\'. - * - * \param a first path - * \param b second path - * \return combined path */ - - std::string path_join(const std::string &a, const std::string &b); - - /*! Check if file exists and is readable - * - * \param path file path - * \return true if file exists and is readable */ - - bool file_is_readable(const std::string &path); - /*! Determine full path of potential file. If file is not found in current directory, * search directories listed in LAMMPS_POTENTIALS environment variable * diff --git a/src/variable.cpp b/src/variable.cpp index 2600ba734d..5976c22fb4 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -39,7 +39,6 @@ #include #include #include -#include #include using namespace LAMMPS_NS; @@ -692,11 +691,11 @@ int Variable::next(int narg, char **arg) int seed = 12345 + universe->me + which[find(arg[0])]; if (!random) random = new RanMars(lmp,seed); int delay = (int) (1000000*random->uniform()); - usleep(delay); - while (1) { + platform::usleep(delay); + while (true) { if (!rename("tmp.lammps.variable","tmp.lammps.variable.lock")) break; delay = (int) (1000000*random->uniform()); - usleep(delay); + platform::usleep(delay); } // if the file cannot be found, we may have a race with some @@ -719,7 +718,7 @@ int Variable::next(int narg, char **arg) break; } delay = (int) (1000000*random->uniform()); - usleep(delay); + platform::usleep(delay); } delete random; random = nullptr; @@ -1235,7 +1234,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (str == nullptr) print_var_error(FLERR,"Invalid syntax in variable formula",ivar); - while (1) { + while (true) { onechar = str[i]; // whitespace: just skip @@ -3217,7 +3216,7 @@ int Variable::find_matching_paren(char *str, int i, char *&contents, int ivar) int istart = i; int ilevel = 0; - while (1) { + while (true) { i++; if (!str[i]) break; if (str[i] == '(') ilevel++; @@ -4788,7 +4787,7 @@ double Variable::evaluate_boolean(char *str) int i = 0; int expect = ARG; - while (1) { + while (true) { onechar = str[i]; // whitespace: just skip @@ -5082,7 +5081,7 @@ int VarReader::read_scalar(char *str) // read one string from file if (me == 0) { - while (1) { + while (true) { ptr = fgets(str,MAXLINE,fp); if (!ptr) { n=0; break; } // end of file ptr[strcspn(ptr,"#")] = '\0'; // strip comment @@ -5125,7 +5124,7 @@ int VarReader::read_peratom() char str[MAXLINE]; if (me == 0) { - while (1) { + while (true) { ptr = fgets(str,MAXLINE,fp); if (!ptr) { n=0; break; } // end of file ptr[strcspn(ptr,"#")] = '\0'; // strip comment diff --git a/src/version.h b/src/version.h index c1b2b627a8..21f49398e0 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "29 Sep 2021" +#define LAMMPS_VERSION "27 Oct 2021" diff --git a/src/write_coeff.cpp b/src/write_coeff.cpp index e030148901..a21a2634fc 100644 --- a/src/write_coeff.cpp +++ b/src/write_coeff.cpp @@ -26,7 +26,6 @@ #include #include -#include using namespace LAMMPS_NS; @@ -93,7 +92,7 @@ void WriteCoeff::command(int narg, char **arg) fprintf(two,"# LAMMPS coeff file via write_coeff, version %s\n", lmp->version); - while (1) { + while (true) { int coeff_mode = REGULAR_MODE; if (fgets(str,256,one) == nullptr) break; @@ -170,8 +169,8 @@ void WriteCoeff::command(int narg, char **arg) } fclose(one); fclose(two); - unlink(file); + platform::unlink(file); } - delete [] file; + delete[] file; } diff --git a/src/write_dump.cpp b/src/write_dump.cpp index 89c976fe09..53ab80149a 100644 --- a/src/write_dump.cpp +++ b/src/write_dump.cpp @@ -57,7 +57,7 @@ void WriteDump::command(int narg, char **arg) for (int i = 2; i < modindex; ++i) dumpargs[i+2] = arg[i]; - if (0) { + if (false) { return; // dummy line to enable else-if macro expansion #define DUMP_CLASS diff --git a/src/write_restart.cpp b/src/write_restart.cpp index 5dcf7f31a5..1546bd8a07 100644 --- a/src/write_restart.cpp +++ b/src/write_restart.cpp @@ -270,7 +270,7 @@ void WriteRestart::write(const std::string &file) double *buf; memory->create(buf,max_size,"write_restart:buf"); - memset(buf,0,max_size*sizeof(buf)); + memset(buf,0,max_size*sizeof(double)); // all procs write file layout info which may include per-proc sizes @@ -600,7 +600,7 @@ void WriteRestart::file_layout(int send_size) // this allows all ranks to compute offset to their data if (mpiioflag) { - if (me == 0) headerOffset = ftell(fp); + if (me == 0) headerOffset = platform::ftell(fp); MPI_Bcast(&headerOffset,1,MPI_LMP_BIGINT,0,world); } } diff --git a/tools/binary2txt.cpp b/tools/binary2txt.cpp index a7724ffbd2..dfa81e8a6e 100644 --- a/tools/binary2txt.cpp +++ b/tools/binary2txt.cpp @@ -97,7 +97,7 @@ int main(int narg, char **arg) // loop over snapshots in file - while (1) { + while (true) { int endian = 0x0001; int revision = 0x0001; diff --git a/tools/lammps-shell/lammps-shell.cpp b/tools/lammps-shell/lammps-shell.cpp index 2ee62df920..d03e1da70b 100644 --- a/tools/lammps-shell/lammps-shell.cpp +++ b/tools/lammps-shell/lammps-shell.cpp @@ -1,11 +1,12 @@ // LAMMPS Shell. An improved interactive LAMMPS session with // command line editing, history, TAB expansion and shell escapes -// Copyright (c) 2020 Axel Kohlmeyer +// Copyright (c) 2020, 2021 Axel Kohlmeyer // This software is distributed under the GNU General Public License. #include "library.h" +#include "platform.h" #include "utils.h" #include @@ -14,22 +15,13 @@ #include #include -#if !defined(_WIN32) -#include -#else +#if defined(_WIN32) #if !defined(WIN32_LEAN_AND_MEAN) #define WIN32_LEAN_AND_MEAN #endif -#include -#include #include -#define chdir(x) _chdir(x) -#define getcwd(buf, len) _getcwd(buf, len) -#define isatty(x) _isatty(x) -#endif - -#if !defined(_WIN32) -#include +#else +#include #endif #if defined(_OPENMP) @@ -41,10 +33,10 @@ using namespace LAMMPS_NS; -char *omp_threads = nullptr; -const int buflen = 512; -char buf[buflen]; void *lmp = nullptr; +char *omp_threads = nullptr; +constexpr int BUFLEN = 512; +char buf[BUFLEN]; enum { ATOM_STYLE, @@ -161,14 +153,14 @@ static int save_history(std::string range, std::string file) std::size_t found = range.find_first_of("-"); if (found == std::string::npos) { // only a single number - int num = strtol(range.c_str(), NULL, 10); + int num = strtol(range.c_str(), nullptr, 10); if ((num >= from) && (num <= to)) { from = to = num; } else return 1; } else { // range of numbers if (found > 0) { // get number before '-' - int num = strtol(range.substr(0, found).c_str(), NULL, 10); + int num = strtol(range.substr(0, found).c_str(), nullptr, 10); if ((num >= from) && (num <= to)) { from = num; } else @@ -176,7 +168,7 @@ static int save_history(std::string range, std::string file) } if (range.size() > found + 1) { // get number after '-' - int num = strtol(range.substr(found + 1).c_str(), NULL, 10); + int num = strtol(range.substr(found + 1).c_str(), nullptr, 10); if ((num >= from) && (num <= to)) { to = num; } else @@ -213,7 +205,7 @@ template char *style_generator(const char *text, int state) } while (idx < num) { - lammps_style_name(lmp, lmp_style[STYLE], idx, buf, buflen); + lammps_style_name(lmp, lmp_style[STYLE], idx, buf, BUFLEN); ++idx; if ((len == 0) || (strncmp(text, buf, len) == 0)) return dupstring(buf); } @@ -230,7 +222,7 @@ template char *id_generator(const char *text, int state) } while (idx < num) { - lammps_id_name(lmp, lmp_id[ID], idx, buf, buflen); + lammps_id_name(lmp, lmp_id[ID], idx, buf, BUFLEN); ++idx; if ((len == 0) || (strncmp(text, buf, len) == 0)) return dupstring(buf); } @@ -348,13 +340,13 @@ static char *variable_expand_generator(const char *text, int state) static char *plugin_generator(const char *text, int state) { - const char *subcmd[] = {"load", "unload", "list", "clear", NULL}; + const char *subcmd[] = {"load", "unload", "list", "clear", nullptr}; const char *sub; static std::size_t idx=0, len; if (!state) idx = 0; len = strlen(text); - while ((sub = subcmd[idx]) != NULL) { + while ((sub = subcmd[idx]) != nullptr) { ++idx; if (strncmp(text,sub,len) == 0) return dupstring(sub); @@ -364,12 +356,12 @@ static char *plugin_generator(const char *text, int state) static char *plugin_style_generator(const char *text, int state) { - const char *styles[] = {"pair", "fix", "command", NULL}; + const char *styles[] = {"pair", "fix", "command", nullptr}; const char *s; static std::size_t idx=0, len; if (!state) idx = 0; len = strlen(text); - while ((s = styles[idx]) != NULL) { + while ((s = styles[idx]) != nullptr) { ++idx; if (strncmp(text,s,len) == 0) return dupstring(s); @@ -388,8 +380,8 @@ static char *plugin_name_generator(const char *text, int state) nmax = lammps_plugin_count(); while (idx < nmax) { - char style[buflen], name[buflen]; - lammps_plugin_name(idx, style, name, buflen); + char style[BUFLEN], name[BUFLEN]; + lammps_plugin_name(idx, style, name, BUFLEN); ++idx; if (words[2] == style) { if (strncmp(name, words[3].c_str(), len) == 0) @@ -474,7 +466,7 @@ char *group_generator(const char *text, int state) } while (idx < num) { - lammps_id_name(lmp, "group", idx, buf, buflen); + lammps_id_name(lmp, "group", idx, buf, BUFLEN); ++idx; if ((len == 0) || (strncmp(text, buf, len) == 0)) return dupstring(buf); } @@ -571,24 +563,24 @@ static void init_commands() // store internal commands int ncmds = sizeof(cmdlist) / sizeof(const char *); for (int i = 0; i < ncmds; ++i) - commands.push_back(cmdlist[i]); + commands.emplace_back(cmdlist[i]); // store optional commands from command styles ncmds = lammps_style_count(lmp, "command"); for (int i = 0; i < ncmds; ++i) { - if (lammps_style_name(lmp, "command", i, buf, buflen)) commands.push_back(buf); + if (lammps_style_name(lmp, "command", i, buf, BUFLEN)) commands.emplace_back(buf); } // store LAMMPS shell specific command names - commands.push_back("help"); - commands.push_back("exit"); - commands.push_back("pwd"); - commands.push_back("cd"); - commands.push_back("mem"); - commands.push_back("source"); - commands.push_back("history"); - commands.push_back("clear_history"); - commands.push_back("save_history"); + commands.emplace_back("help"); + commands.emplace_back("exit"); + commands.emplace_back("pwd"); + commands.emplace_back("cd"); + commands.emplace_back("mem"); + commands.emplace_back("source"); + commands.emplace_back("history"); + commands.emplace_back("clear_history"); + commands.emplace_back("save_history"); // set name so there can be specific entries in ~/.inputrc rl_readline_name = "lammps-shell"; @@ -598,7 +590,7 @@ static void init_commands() // otherwise any tabs in redirected input will cause havoc. const char *test_mode = getenv("LAMMPS_SHELL_TESTING"); if (test_mode) std::cout << "*TESTING* using LAMMPS Shell in test mode *TESTING*\n"; - if (isatty(fileno(stdin)) || test_mode) { + if (platform::is_console(stdin) || test_mode) { rl_attempted_completion_function = cmd_completion; } else { rl_bind_key('\t', rl_insert); @@ -607,10 +599,11 @@ static void init_commands() // read saved history, but not in test mode. if (!test_mode) read_history(".lammps_history"); -#if !defined(_WIN32) - signal(SIGINT, ctrl_c_handler); -#else + // intercept CTRL-C +#if defined(_WIN32) SetConsoleCtrlHandler(ctrl_c_handler, TRUE); +#else + signal(SIGINT, ctrl_c_handler); #endif } @@ -684,7 +677,7 @@ static int shell_cmd(const std::string &cmd) free(text); return 0; } else if ((words[0] == "pwd") || ((words[0] == "cd") && (words.size() == 1))) { - if (getcwd(buf, buflen)) std::cout << buf << "\n"; + std::cout << platform::current_directory() << "\n"; free(text); return 0; } else if (words[0] == "cd") { @@ -740,28 +733,19 @@ int main(int argc, char **argv) #if defined(_WIN32) // Special hack for Windows: if the current working directory is // the "system folder" (because that is where cmd.exe lives) - // switch to the user's documents directory. Avoid buffer overflow - // and skip this step if the path is too long for our buffer. - if (getcwd(buf, buflen)) { - if ((strstr(buf, "System32") || strstr(buf, "system32"))) { - char *drive = getenv("HOMEDRIVE"); - char *path = getenv("HOMEPATH"); - buf[0] = '\0'; - int len = strlen("\\Documents"); - if (drive) len += strlen(drive); - if (path) len += strlen(path); - if (len < buflen) { - if (drive) strcat(buf, drive); - if (path) strcat(buf, path); - strcat(buf, "\\Documents"); - chdir(buf); - } - } + // switch to the user's documents directory. + + auto curdir = platform::current_directory(); + if (utils::strmatch(curdir,"[Ss]ystem32")) { + std::string docdir = getenv("HOMEDRIVE"); + docdir += getenv("HOMEPATH"); + docdir += "\\Documents"; + platform::chdir(docdir); } #endif - lammps_get_os_info(buf, buflen); - std::cout << "LAMMPS Shell version 1.1 OS: " << buf; + lammps_get_os_info(buf, BUFLEN); + std::cout << "LAMMPS Shell version 1.2 OS: " << buf; if (!lammps_config_has_exceptions()) std::cout << "WARNING: LAMMPS was compiled without exceptions\n" @@ -776,7 +760,7 @@ int main(int argc, char **argv) // to use the maximum number of threads available since this is // not intended to be run with MPI. omp_threads = dupstring(std::string("OMP_NUM_THREADS=" + std::to_string(nthreads))); - putenv(omp_threads); + platform::putenv(omp_threads); // handle the special case where the first argument is not a flag but a file // this happens for example when using file type associations on Windows. @@ -785,8 +769,8 @@ int main(int argc, char **argv) std::string input_file; if ((argc > 1) && (argv[1][0] != '-')) { --argc; - input_file = utils::path_basename(argv[1]); - chdir(utils::path_dirname(input_file).c_str()); + input_file = platform::path_basename(argv[1]); + platform::chdir(platform::path_dirname(input_file)); for (int i = 1; i < argc; ++i) argv[i] = argv[i + 1]; } diff --git a/tools/msi2lmp/src/SearchAndFill.c b/tools/msi2lmp/src/SearchAndFill.c index 1a85ee111f..ff05ff13d0 100644 --- a/tools/msi2lmp/src/SearchAndFill.c +++ b/tools/msi2lmp/src/SearchAndFill.c @@ -13,6 +13,10 @@ #include #include +#if defined(_WIN32) +#define strdup(x) _strdup(x) +#endif + static int blank_line(char *line) { while (*line != '\0') { diff --git a/tools/offline/scripts/init_http_cache.sh b/tools/offline/scripts/init_http_cache.sh index 44a07da35a..926a74f499 100755 --- a/tools/offline/scripts/init_http_cache.sh +++ b/tools/offline/scripts/init_http_cache.sh @@ -40,29 +40,31 @@ echo "Dowloading thirdparty tarballs..." MPICH2_WIN64_DEVEL_URL="${LAMMPS_THIRDPARTY_URL}/mpich2-win64-devel.tar.gz" MPICH2_WIN32_DEVEL_URL="${LAMMPS_THIRDPARTY_URL}/mpich2-win32-devel.tar.gz" VORO_URL="${LAMMPS_THIRDPARTY_URL}/voro++-0.4.6.tar.gz" -OPENCL_LOADER_URL="${LAMMPS_THIRDPARTY_URL}/opencl-loader-2021.06.30.tar.gz" +OPENCL_LOADER_URL="${LAMMPS_THIRDPARTY_URL}/opencl-loader-2021.09.18.tar.gz" SCAFACOS_FIX_URL="${LAMMPS_THIRDPARTY_URL}/scafacos-1.0.1-fix.diff" -GTEST_URL="https://github.com/google/googletest/archive/release-1.10.0.tar.gz" +GTEST_URL="https://github.com/google/googletest/archive/release-1.11.0.tar.gz" YAML_URL="https://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz" MATHJAX_URL="https://github.com/mathjax/MathJax/archive/3.1.3.tar.gz" -EIGEN3_URL="https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz" +EIGEN3_URL="${LAMMPS_THIRDPARTY_URL}/eigen-3.4.0.tar.gz" CUB_URL="https://github.com/NVlabs/cub/archive/1.12.0.tar.gz" KOKKOS_URL="https://github.com/kokkos/kokkos/archive/3.4.01.tar.gz" KIM_URL="https://s3.openkim.org/kim-api/kim-api-2.2.1.txz" MSCG_URL="https://github.com/uchicago-voth/MSCG-release/archive/1.7.3.1.tar.gz" PLUMED_URL="https://github.com/plumed/plumed2/releases/download/v2.7.2/plumed-src-2.7.2.tgz" -PACELIB_URL="https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.4.9.tar.gz" +PACELIB_URL="https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.10.25.tar.gz" LATTE_URL="https://github.com/lanl/LATTE/archive/v1.2.2.tar.gz" SCAFACOS_URL="https://github.com/scafacos/scafacos/releases/download/v1.0.1/scafacos-1.0.1.tar.gz" MDI_URL="https://github.com/MolSSI-MDI/MDI_Library/archive/v1.2.9.tar.gz" +N2P2_URL="https://github.com/CompPhysVienna/n2p2/archive/v2.1.4.tar.gz" -GTEST_FILENAME="gtest-1.10.0.tar.gz" +GTEST_FILENAME="gtest-1.11.0.tar.gz" MATHJAX_FILENAME="mathjax-3.1.3.tar.gz" CUB_FILENAME="cub-1.12.0.tar.gz" KOKKOS_FILENAME="kokkos-3.4.01.tar.gz" MSCG_FILENAME="mscg-1.7.3.1.tar.gz" LATTE_FILENAME="latte-1.2.2.tar.gz" -PACELIB_FILENAME="pacelib-2021.4.9.tar.gz" +N2P2_FILENAME="n2p2-2.1.4.tar.gz" +PACELIB_FILENAME="pacelib-2021.10.25.tar.gz" TARBALLS=( MPICH2_WIN64_DEVEL_URL @@ -83,6 +85,7 @@ TARBALLS=( LATTE_URL SCAFACOS_URL MDI_URL + N2P2_URL ) ############################################################################### diff --git a/tools/offline/scripts/update_downloads.sh b/tools/offline/scripts/update_downloads.sh index 247b92e562..28cd267c27 100755 --- a/tools/offline/scripts/update_downloads.sh +++ b/tools/offline/scripts/update_downloads.sh @@ -14,11 +14,41 @@ function update_setting() sed -i "/^$1=/c$1=\"$2\"" init_http_cache.sh } +DETECTED_URLS=$(grep -PoRh "\w+_URL" ../../../cmake/ | sort | uniq | grep -v ^LAMMPS) +KNOWN_URLS=$(grep -Rh "_URL=" init_http_cache.sh | grep -v ^LAMMPS | grep -v SCAFACOS_FIX | cut -d= -f1) -URLS=$(grep -Rh "_URL=" init_http_cache.sh | grep -v ^LAMMPS | grep -v SCAFACOS_FIX | cut -d= -f1) +# check if init_http_cache.sh contains all URLs +for URL in $DETECTED_URLS +do + grep -q ^$URL= init_http_cache.sh + if [ $? -ne 0 ] + then + FILENAME_VAR="${URL/_URL/_FILENAME}" + echo $URL is not known. Please update 'init_http_cache.sh' as follows: + echo + echo 1. add the following line: + echo + echo $URL="" + echo + echo 2. Define a new $FILENAME_VAR if necessary + echo + echo $FILENAME_VAR="pkgname-0.0.0.tar.gz" + echo + echo 3. extend TARBALLS with $URL + echo + echo TARBALLS=\( + echo " ..." + echo " $URL" + echo \) + echo + echo 4. Rerun this script + echo + exit 1 + fi +done # update URLs by grabbing the latest ones from cmake files -for URL in $URLS +for URL in $KNOWN_URLS do extract_setting "$URL" update_setting "$URL" ${!URL} diff --git a/tools/singularity/README.md b/tools/singularity/README.md index 3f7b69d409..bd13d75ad7 100644 --- a/tools/singularity/README.md +++ b/tools/singularity/README.md @@ -10,12 +10,6 @@ workstation, e.g. when bugs are reported that can only be reproduced on a specific OS or with specific (mostly older) versions of tools, compilers, or libraries. -Ready-to-use container images built from some these definition files are -occasionally uploaded to the container library at sylabs.io. They -can be found here: https://cloud.sylabs.io/library/lammps/default/lammps_development# -and will be signed with a GPG key that has the fingerprint: -EEA103764C6C633EDC8AC428D9B44E93BF0C375A - Here is a workflow for testing a compilation of LAMMPS with a locally built CentOS 7.x singularity container. @@ -30,34 +24,3 @@ cmake -C ../cmake/presets/most.cmake ../cmake make ``` -And here is the equivalent workflow for testing a compilation of LAMMPS -using a pre-built Ubuntu 18.04LTS singularity container. - -``` -cd some/work/directory -git clone --depth 500 git://github.com/lammps/lammps.git lammps -mkdir build-ubuntu18 -cd build-ubuntu18 -singularity pull library://lammps/default/lammps_development:ubuntu18.04 -singularity exec lammps_development_ubuntu18.04.sif bash --login -cmake -C ../cmake/presets/most.cmake ../cmake -make -``` - -| Currently available: | Description | -| ------------------------------ | ---------------------------------------------- | -| centos7.def | CentOS 7.x with EPEL enabled, no LaTeX | -| centos8.def | CentOS 8.x with EPEL enabled | -| fedora34_mingw.def | Fedora 34 with MinGW cross-compiler toolchain | -| ubuntu16.04.def | Ubuntu 16.04LTS with MPI == OpenMPI, no LaTeX | -| ubuntu18.04.def | Ubuntu 18.04LTS with MPI == OpenMPI | -| ubuntu18.04_amd_rocm.def | Ubuntu 18.04LTS with AMD ROCm toolkit | -| ubuntu18.04_gpu.def | Ubuntu 18.04LTS with -"- plus Nvidia CUDA 11.0 | -| ubuntu18.04_nvidia.def | Ubuntu 18.04LTS with Nvidia CUDA 11.0 toolkit | -| ubuntu18.04_intel_opencl.def | Ubuntu 18.04LTS with Intel OpenCL runtime | -| ubuntu20.04.def | Ubuntu 20.04LTS with MPI == OpenMPI | -| ubuntu20.04_amd_rocm.def | Ubuntu 20.04LTS with AMD ROCm toolkit | -| ubuntu20.04_gpu.def | Ubuntu 20.04LTS with -"- plus Nvidia CUDA 11.0 | -| ubuntu20.04_nvidia.def | Ubuntu 20.04LTS with Nvidia CUDA 11.0 toolkit | -| ubuntu20.04_intel_opencl.def | Ubuntu 20.04LTS with Intel OpenCL runtime | -| ------------------------------ | ---------------------------------------------- | diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 2491c26796..46f1865989 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -8,7 +8,7 @@ add_test(NAME RunLammps WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(RunLammps PROPERTIES 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]\\)") + 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 add_test(NAME HelpMessage diff --git a/unittest/c-library/test_library_commands.cpp b/unittest/c-library/test_library_commands.cpp index 6c52232a8e..b16dc6e9dd 100644 --- a/unittest/c-library/test_library_commands.cpp +++ b/unittest/c-library/test_library_commands.cpp @@ -19,8 +19,8 @@ const char *cont_input[] = {"create_atoms 1 single &", "0.2 0.1 0.1"}; class LibraryCommands : public ::testing::Test { protected: void *lmp; - LibraryCommands(){}; - ~LibraryCommands() override{}; + LibraryCommands() = default; + ~LibraryCommands() override = default; void SetUp() override { @@ -31,7 +31,7 @@ protected: int argc = sizeof(args) / sizeof(char *); ::testing::internal::CaptureStdout(); - lmp = lammps_open_no_mpi(argc, argv, NULL); + lmp = lammps_open_no_mpi(argc, argv, nullptr); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_THAT(output, StartsWith("LAMMPS (")); @@ -54,14 +54,14 @@ TEST_F(LibraryCommands, from_file) const char cont_file[] = "in.cont"; fp = fopen(demo_file, "w"); - for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) { - fputs(demo_input[i], fp); + for (auto & inp : demo_input) { + fputs(inp, fp); fputc('\n', fp); } fclose(fp); fp = fopen(cont_file, "w"); - for (unsigned int i = 0; i < sizeof(cont_input) / sizeof(char *); ++i) { - fputs(cont_input[i], fp); + for (auto & inp : cont_input) { + fputs(inp, fp); fputc('\n', fp); } fclose(fp); @@ -84,8 +84,8 @@ TEST_F(LibraryCommands, from_line) { EXPECT_EQ(lammps_get_natoms(lmp), 0); if (!verbose) ::testing::internal::CaptureStdout(); - for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) { - lammps_command(lmp, demo_input[i]); + for (auto & inp : demo_input) { + lammps_command(lmp, inp); } if (!verbose) ::testing::internal::GetCapturedStdout(); EXPECT_EQ(lammps_get_natoms(lmp), 1); @@ -105,12 +105,12 @@ TEST_F(LibraryCommands, from_string) { std::string cmds(""); - for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) { - cmds += demo_input[i]; + for (auto & inp : demo_input) { + cmds += inp; cmds += "\n"; } - for (unsigned int i = 0; i < sizeof(cont_input) / sizeof(char *); ++i) { - cmds += cont_input[i]; + for (auto & inp : cont_input) { + cmds += inp; cmds += "\n"; } EXPECT_EQ(lammps_get_natoms(lmp), 0); @@ -125,12 +125,12 @@ TEST_F(LibraryCommands, from_string) if (!verbose) ::testing::internal::GetCapturedStdout(); cmds.clear(); - for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) { - cmds += demo_input[i]; + for (auto & inp : demo_input) { + cmds += inp; cmds += "\r\n"; } - for (unsigned int i = 0; i < sizeof(cont_input) / sizeof(char *); ++i) { - cmds += cont_input[i]; + for (auto & inp : cont_input) { + cmds += inp; cmds += "\r\n"; } EXPECT_EQ(lammps_get_natoms(lmp), 0); diff --git a/unittest/c-library/test_library_config.cpp b/unittest/c-library/test_library_config.cpp index e5eb044d31..456faff06f 100644 --- a/unittest/c-library/test_library_config.cpp +++ b/unittest/c-library/test_library_config.cpp @@ -22,8 +22,8 @@ protected: void *lmp; std::string INPUT_DIR = STRINGIFY(TEST_INPUT_FOLDER); - LibraryConfig(){}; - ~LibraryConfig() override{}; + LibraryConfig() = default; + ~LibraryConfig() override = default; void SetUp() override { @@ -35,7 +35,7 @@ protected: int argc = sizeof(args) / sizeof(char *); ::testing::internal::CaptureStdout(); - lmp = lammps_open_no_mpi(argc, argv, NULL); + lmp = lammps_open_no_mpi(argc, argv, nullptr); lammps_command(lmp, "fix charge all property/atom q ghost yes"); lammps_command(lmp, "region box block 0 1 0 1 0 1"); lammps_command(lmp, "create_box 1 box"); diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index 15edd5f113..57d3bef080 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -69,7 +69,7 @@ TEST(lammps_external, callback) int argc = sizeof(args) / sizeof(char *); ::testing::internal::CaptureStdout(); - void *handle = lammps_open_no_mpi(argc, argv, NULL); + void *handle = lammps_open_no_mpi(argc, argv, nullptr); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -136,7 +136,7 @@ TEST(lammps_external, array) int argc = sizeof(args) / sizeof(char *); ::testing::internal::CaptureStdout(); - void *handle = lammps_open_no_mpi(argc, argv, NULL); + void *handle = lammps_open_no_mpi(argc, argv, nullptr); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; diff --git a/unittest/c-library/test_library_open.cpp b/unittest/c-library/test_library_open.cpp index b7a8016a1a..c75fd3738b 100644 --- a/unittest/c-library/test_library_open.cpp +++ b/unittest/c-library/test_library_open.cpp @@ -18,7 +18,7 @@ using ::testing::StartsWith; TEST(lammps_open, null_args) { ::testing::internal::CaptureStdout(); - void *handle = lammps_open(0, NULL, MPI_COMM_WORLD, NULL); + void *handle = lammps_open(0, nullptr, MPI_COMM_WORLD, nullptr); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_THAT(output, StartsWith("LAMMPS (")); if (verbose) std::cout << output; @@ -175,7 +175,7 @@ TEST(lammps_open_fortran, no_args) MPI_Comm_split(MPI_COMM_WORLD, 0, 1, &mycomm); int fcomm = MPI_Comm_c2f(mycomm); ::testing::internal::CaptureStdout(); - void *handle = lammps_open_fortran(0, NULL, fcomm); + void *handle = lammps_open_fortran(0, nullptr, fcomm); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_THAT(output, StartsWith("LAMMPS (")); if (verbose) std::cout << output; diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 57c0153c65..754c6df77f 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -23,8 +23,8 @@ protected: void *lmp; std::string INPUT_DIR = STRINGIFY(TEST_INPUT_FOLDER); - LibraryProperties(){}; - ~LibraryProperties() override{}; + LibraryProperties() = default; + ~LibraryProperties() override = default; void SetUp() override { @@ -36,7 +36,7 @@ protected: int argc = sizeof(args) / sizeof(char *); ::testing::internal::CaptureStdout(); - lmp = lammps_open_no_mpi(argc, argv, NULL); + lmp = lammps_open_no_mpi(argc, argv, nullptr); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_THAT(output, StartsWith("LAMMPS (")); @@ -436,8 +436,8 @@ class AtomProperties : public ::testing::Test { protected: void *lmp; - AtomProperties(){}; - ~AtomProperties() override{}; + AtomProperties()= default;; + ~AtomProperties() override= default;; void SetUp() override { @@ -447,7 +447,7 @@ protected: int argc = sizeof(args) / sizeof(char *); ::testing::internal::CaptureStdout(); - lmp = lammps_open_no_mpi(argc, argv, NULL); + lmp = lammps_open_no_mpi(argc, argv, nullptr); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_THAT(output, StartsWith("LAMMPS (")); diff --git a/unittest/c-library/test_library_scatter_gather.cpp b/unittest/c-library/test_library_scatter_gather.cpp index 34022f617e..7ee1cfc9eb 100644 --- a/unittest/c-library/test_library_scatter_gather.cpp +++ b/unittest/c-library/test_library_scatter_gather.cpp @@ -23,8 +23,8 @@ protected: void *lmp; std::string INPUT_DIR = STRINGIFY(TEST_INPUT_FOLDER); - GatherProperties(){}; - ~GatherProperties() override{}; + GatherProperties() = default; + ~GatherProperties() override = default; void SetUp() override { @@ -36,7 +36,7 @@ protected: int argc = sizeof(args) / sizeof(char *); ::testing::internal::CaptureStdout(); - lmp = lammps_open_no_mpi(argc, argv, NULL); + lmp = lammps_open_no_mpi(argc, argv, nullptr); std::string output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_THAT(output, StartsWith("LAMMPS (")); diff --git a/unittest/commands/test_groups.cpp b/unittest/commands/test_groups.cpp index e238e630d5..0c8a7cd83c 100644 --- a/unittest/commands/test_groups.cpp +++ b/unittest/commands/test_groups.cpp @@ -316,7 +316,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/commands/test_kim_commands.cpp b/unittest/commands/test_kim_commands.cpp index a70176cc92..183d333ab4 100644 --- a/unittest/commands/test_kim_commands.cpp +++ b/unittest/commands/test_kim_commands.cpp @@ -684,7 +684,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/commands/test_lattice_region.cpp b/unittest/commands/test_lattice_region.cpp index 5fbabcf173..47b69a15e0 100644 --- a/unittest/commands/test_lattice_region.cpp +++ b/unittest/commands/test_lattice_region.cpp @@ -20,7 +20,6 @@ #include "lammps.h" #include "lattice.h" #include "region.h" -#include "utils.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -631,7 +630,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/commands/test_reset_ids.cpp b/unittest/commands/test_reset_ids.cpp index 221859e5c3..c67f90b341 100644 --- a/unittest/commands/test_reset_ids.cpp +++ b/unittest/commands/test_reset_ids.cpp @@ -686,7 +686,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/commands/test_simple_commands.cpp b/unittest/commands/test_simple_commands.cpp index 31acf6d460..0ad47f4e96 100644 --- a/unittest/commands/test_simple_commands.cpp +++ b/unittest/commands/test_simple_commands.cpp @@ -20,7 +20,6 @@ #include "input.h" #include "output.h" #include "update.h" -#include "utils.h" #include "variable.h" #include "../testing/core.h" @@ -217,7 +216,7 @@ TEST_F(SimpleCommandsTest, Quit) TEST_FAILURE(".*ERROR: Expected integer .*", command("quit xxx");); // the following tests must be skipped with OpenMPI due to using threads - if (Info::get_mpi_vendor() == "Open MPI") GTEST_SKIP(); + if (platform::mpi_vendor() == "Open MPI") GTEST_SKIP(); ASSERT_EXIT(command("quit"), ExitedWithCode(0), ""); ASSERT_EXIT(command("quit 9"), ExitedWithCode(9), ""); } @@ -528,7 +527,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index 9d8932d0f0..4f603df5ac 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -517,7 +517,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/cplusplus/test_error_class.cpp b/unittest/cplusplus/test_error_class.cpp index 489b085b1b..f4f0d3b28b 100644 --- a/unittest/cplusplus/test_error_class.cpp +++ b/unittest/cplusplus/test_error_class.cpp @@ -128,7 +128,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/cplusplus/test_input_class.cpp b/unittest/cplusplus/test_input_class.cpp index db11a91d88..87bea36081 100644 --- a/unittest/cplusplus/test_input_class.cpp +++ b/unittest/cplusplus/test_input_class.cpp @@ -29,7 +29,7 @@ protected: MPI_Initialized(&flag); if (!flag) MPI_Init(&argc, &argv); } - ~Input_commands() override {} + ~Input_commands() override = default; void SetUp() override { @@ -60,14 +60,14 @@ TEST_F(Input_commands, from_file) const char cont_file[] = "in.cont"; fp = fopen(demo_file, "w"); - for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) { - fputs(demo_input[i], fp); + for (auto & inp : demo_input) { + fputs(inp, fp); fputc('\n', fp); } fclose(fp); fp = fopen(cont_file, "w"); - for (unsigned int i = 0; i < sizeof(cont_input) / sizeof(char *); ++i) { - fputs(cont_input[i], fp); + for (auto & inp : cont_input) { + fputs(inp, fp); fputc('\n', fp); } fclose(fp); @@ -84,8 +84,8 @@ TEST_F(Input_commands, from_file) TEST_F(Input_commands, from_line) { EXPECT_EQ(lmp->atom->natoms, 0); - for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) { - lmp->input->one(demo_input[i]); + for (auto & inp : demo_input) { + lmp->input->one(inp); } EXPECT_EQ(lmp->atom->natoms, 1); }; diff --git a/unittest/cplusplus/test_lammps_class.cpp b/unittest/cplusplus/test_lammps_class.cpp index d25b232fa7..663c7358d9 100644 --- a/unittest/cplusplus/test_lammps_class.cpp +++ b/unittest/cplusplus/test_lammps_class.cpp @@ -108,21 +108,22 @@ TEST_F(LAMMPS_plain, TestStyles) const char *found; const char *atom_styles[] = {"atomic", "body", "charge", "ellipsoid", "hybrid", - "line", "sphere", "tri", NULL}; - for (int i = 0; atom_styles[i] != NULL; ++i) { + "line", "sphere", "tri", nullptr}; + for (int i = 0; atom_styles[i] != nullptr; ++i) { found = lmp->match_style("atom", atom_styles[i]); - EXPECT_STREQ(found, NULL); + EXPECT_STREQ(found, nullptr); } - const char *molecule_atom_styles[] = {"angle", "bond", "full", "molecular", "template", NULL}; - for (int i = 0; molecule_atom_styles[i] != NULL; ++i) { + const char *molecule_atom_styles[] = {"angle", "bond", "full", + "molecular", "template", nullptr}; + for (int i = 0; molecule_atom_styles[i] != nullptr; ++i) { found = lmp->match_style("atom", molecule_atom_styles[i]); EXPECT_STREQ(found, "MOLECULE"); } const char *kokkos_atom_styles[] = {"angle/kk", "bond/kk", "full/kk", - "molecular/kk", "hybrid/kk", NULL}; - for (int i = 0; kokkos_atom_styles[i] != NULL; ++i) { + "molecular/kk", "hybrid/kk", nullptr}; + for (int i = 0; kokkos_atom_styles[i] != nullptr; ++i) { found = lmp->match_style("atom", kokkos_atom_styles[i]); EXPECT_STREQ(found, "KOKKOS"); } @@ -149,7 +150,7 @@ TEST_F(LAMMPS_plain, TestStyles) found = lmp->match_style("atom", "sph"); EXPECT_STREQ(found, "SPH"); found = lmp->match_style("atom", "i_don't_exist"); - EXPECT_STREQ(found, NULL); + EXPECT_STREQ(found, nullptr); } // test fixture for OpenMP with 2 threads @@ -325,7 +326,7 @@ TEST_F(LAMMPS_kokkos, InitMembers) TEST(LAMMPS_init, OpenMP) { if (!LAMMPS::is_installed_pkg("OPENMP")) GTEST_SKIP(); - if (Info::get_openmp_info() == "OpenMP not enabled") GTEST_SKIP(); + if (platform::openmp_standard() == "OpenMP not enabled") GTEST_SKIP(); FILE *fp = fopen("in.lammps_empty", "w"); fputs("\n", fp); diff --git a/unittest/force-styles/test_config_reader.cpp b/unittest/force-styles/test_config_reader.cpp index 726bd90a93..65e9e4b0f6 100644 --- a/unittest/force-styles/test_config_reader.cpp +++ b/unittest/force-styles/test_config_reader.cpp @@ -83,10 +83,10 @@ void TestConfigReader::prerequisites(const yaml_event_t &event) std::stringstream data((char *)event.data.scalar.value); std::string key, value; - while (1) { + while (true) { data >> key >> value; if (data.eof()) break; - config.prerequisites.push_back(std::make_pair(key, value)); + config.prerequisites.emplace_back(key, value); } } @@ -138,10 +138,10 @@ void TestConfigReader::extract(const yaml_event_t &event) std::stringstream data((char *)event.data.scalar.value); std::string name; int value; - while (1) { + while (true) { data >> name >> value; if (data.eof()) break; - config.extract.push_back(make_pair(name, value)); + config.extract.emplace_back(name, value); } } diff --git a/unittest/force-styles/test_main.cpp b/unittest/force-styles/test_main.cpp index 5b2663a6cf..1ad0b79455 100644 --- a/unittest/force-styles/test_main.cpp +++ b/unittest/force-styles/test_main.cpp @@ -47,7 +47,7 @@ void write_yaml_header(YamlWriter *writer, TestConfig *cfg, const char *version) writer->emit("lammps_version", version); // date_generated - std::time_t now = time(NULL); + std::time_t now = time(nullptr); std::string block = trim(ctime(&now)); writer->emit("date_generated", block); diff --git a/unittest/force-styles/test_pair_style.cpp b/unittest/force-styles/test_pair_style.cpp index 2eda7bea9f..898fb8e412 100644 --- a/unittest/force-styles/test_pair_style.cpp +++ b/unittest/force-styles/test_pair_style.cpp @@ -858,6 +858,13 @@ TEST(PairStyle, gpu) if (!Info::has_gpu_device()) GTEST_SKIP(); if (test_config.skip_tests.count(test_info_->name())) GTEST_SKIP(); + // when testing PPPM styles with GPUs and GPU support is compiled with single precision + // we also must have single precision FFTs; otherwise skip since the test would abort + if (utils::strmatch(test_config.basename, ".*pppm.*") && + (Info::has_accelerator_feature("GPU", "precision", "single")) && + (!Info::has_fft_single_support())) + GTEST_SKIP(); + const char *args_neigh[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", "-sf", "gpu"}; const char *args_noneigh[] = {"PairStyle", "-log", "none", "-echo", "screen", "-nocite", "-sf", @@ -1252,7 +1259,7 @@ TEST(PairStyle, single) int argc = sizeof(args) / sizeof(char *); // need to add this dependency - test_config.prerequisites.push_back(std::make_pair("atom", "full")); + test_config.prerequisites.emplace_back("atom", "full"); // create a LAMMPS instance with standard settings to detect the number of atom types if (!verbose) ::testing::internal::CaptureStdout(); diff --git a/unittest/force-styles/tests/atomic-pair-reaxff-acks2.yaml b/unittest/force-styles/tests/atomic-pair-reaxff-acks2.yaml new file mode 100644 index 0000000000..2444e76746 --- /dev/null +++ b/unittest/force-styles/tests/atomic-pair-reaxff-acks2.yaml @@ -0,0 +1,173 @@ +--- +lammps_version: 31 Aug 2021 +date_generated: Tue Sep 21 15:02:20 2021 +epsilon: 5e-9 +skip_tests: omp +prerequisites: ! | + pair reaxff + fix acks2/reaxff +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units real + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 1.0 + mass 2 16.0 + set type 1 type/fraction 2 0.333333333 998877 + set type 1 charge 0.01 + set type 2 charge -0.02 + velocity all create 100 4534624 loop geom +post_commands: ! | + fix qeq all acks2/reaxff 1 0.0 8.0 1.0e-20 reaxff +input_file: in.empty +pair_style: reaxff NULL checkqeq yes +pair_coeff: ! | + * * acks2_ff.water H O +extract: ! "" +natoms: 64 +init_vdwl: -1315.674323112547 +init_coul: -251.82520863781136 +init_stress: ! |- + -3.6252552634610828e+02 -5.3642230434120154e+02 -3.2708821928047780e+02 -1.8739746594217769e+02 -7.3161204592256269e+01 2.8634078571435208e+02 +init_forces: ! |2 + 1 -6.0368026319723334e-01 2.0490281105259228e+01 1.6647650192347417e+01 + 2 -1.2754929753354234e+02 -6.4506752258382122e+01 -3.3765604494033497e+01 + 3 -1.6340638699344356e+02 -1.3395894275690221e+01 4.5681732661684634e+01 + 4 -7.8669167893588874e+00 1.2975050709670612e+02 -1.6422202215654622e+02 + 5 4.8895820330576854e+01 1.3583526793691512e+00 1.9082272968463208e+01 + 6 -3.2215264081964378e+01 -1.0434725558607181e+02 -2.9321909814724460e+01 + 7 5.4687724085035022e+01 -4.0913013646280532e+01 -5.8353503975056263e+01 + 8 -3.4374174863798075e+01 -5.4582176195261731e+01 3.9162148827896928e+01 + 9 1.0602587269872288e+02 2.4517278481186896e+01 -8.2926292024679384e+01 + 10 8.3433641774183407e+00 5.5896742851927943e+00 1.5837228744594089e+01 + 11 8.6970191683169129e-01 -5.8991563586004766e+01 -3.9877951865531514e+01 + 12 4.4192147377965640e+01 1.4903341767625852e+02 -1.6218738820961934e+02 + 13 -1.4906540622411359e+02 -1.1995838086244909e+02 1.0915797981155475e+02 + 14 -1.6840918424164060e+00 -2.4233434851726496e+01 -2.4811432594512457e+01 + 15 2.8916293161615947e+01 9.0150734924389738e+01 5.2202528013163860e+00 + 16 1.1511072719898208e+02 2.8294359308952078e+01 6.7521666411546050e+01 + 17 4.4257318509790032e+01 4.2406840066994654e+01 7.2795080140788869e+01 + 18 -7.8848831769041654e+00 -1.3664596390464098e+02 6.1096090529306210e+01 + 19 1.0685808811691570e+02 2.0723200091856646e+02 4.4123703145411937e+01 + 20 -4.9541566255910801e+01 -8.1664859207282433e+01 -2.8988844313476029e+01 + 21 -1.3289404043644814e+02 3.7558583406053941e+01 -1.0102514473761195e+02 + 22 1.3266704365038908e+02 -1.1782659065785897e+02 5.4036616742189061e+01 + 23 5.1406826507867223e+01 -2.3873203577956730e+01 -4.7707992031474234e+01 + 24 3.2375661774934940e+01 8.7122524112522697e+01 6.6904840845090462e+01 + 25 -7.6343346793073664e+01 1.4702372716259256e+02 -6.9634429545332381e+01 + 26 1.3052482043203892e+02 -7.6695952258764208e+01 -6.8144336882390846e+01 + 27 6.2295256121926471e+01 5.0088548894938114e+01 3.3482187356569881e+01 + 28 8.1224991426364603e+00 -3.8522307644648572e+00 -1.5910295435991639e+01 + 29 -1.1706768240874355e+02 7.1116543353676818e+01 1.0440306737798934e+02 + 30 2.6668840384251649e+01 -1.1285667565996226e+02 1.8633172811903989e+01 + 31 -1.0847355678967622e+02 1.0996595842176285e+02 -5.5616286819737311e+01 + 32 -1.4603119222198394e+01 4.2813303531510641e+01 3.8845175595330531e+01 + 33 -2.9522724683327016e+01 -7.8740075435568029e+00 4.0691892849331758e+01 + 34 9.4358005650347835e+01 5.1578786222111148e+01 4.9877606247135589e+00 + 35 1.3878162567772878e+02 1.3002914177061694e+01 -3.9262700309813695e+01 + 36 -5.4285827285916746e+01 -8.6097074177259515e+01 6.3573072280656689e+01 + 37 4.8502367882367082e+01 7.1094372467616139e+01 -6.4170831125588478e+01 + 38 -1.2068302892901679e+02 -2.3921624494724261e+02 1.0639158013338042e+02 + 39 4.7483616773316575e+00 1.1147185880245857e+01 9.5242536579092729e+01 + 40 -4.2106716215321676e+00 2.8923432927375652e+00 -3.8847459020822011e+00 + 41 -1.2582176673926276e+02 -1.1458507442867946e+02 1.5633840332025807e+01 + 42 4.3299931174721657e+01 -1.1323682562113908e+02 -1.2149036854079469e+02 + 43 -6.1455115997918410e+00 -1.1290761800594723e+01 1.3010001275147209e+02 + 44 2.3306479216564437e+01 -7.2456643864466814e+00 -2.1408875167843437e+01 + 45 -2.2863088909548026e+01 1.3728756890564244e+02 1.7762941813938326e+02 + 46 4.5766906983362070e+01 -6.7544686606488227e+01 3.7528326465811972e+01 + 47 -3.2700893536527538e+01 -5.3002101899722568e+01 -5.4679464444461047e+01 + 48 2.0328502419620253e+02 -3.0317080221415955e+02 -1.7385360483394399e+02 + 49 -6.8067873927712014e+01 3.9176176719051938e+01 3.5930432225694524e+01 + 50 8.9353300749969620e+00 1.4185265656301095e+02 1.5862761052665803e+02 + 51 3.5555345549045576e+01 -3.2564032333055451e+01 1.4767362774338116e+02 + 52 -1.0584640086659454e+02 1.0312320105331467e+02 -5.0601860204759092e+01 + 53 -3.3989834984567189e+01 9.4952795280998046e+01 -2.0788572482728082e+02 + 54 3.1058276661162811e+01 -5.5555419356318176e+01 4.7450764854663454e+01 + 55 8.0177808131181635e+01 -1.2981809858342260e+02 5.6596128355738813e+01 + 56 -1.2360446884305839e+01 -2.8595758498921775e+01 -5.6863776538006210e+00 + 57 4.5290996755611062e+01 1.5919693798996261e+02 9.9974122525349088e+01 + 58 -2.8760688272312827e+01 6.0635769417465973e+01 -2.3798836888216112e+01 + 59 -2.2258012527336544e+02 1.3033272684720029e+02 1.4065235688360508e+02 + 60 -2.7053865051546467e+01 1.4140560377577856e+02 -1.2766809320306062e+02 + 61 -6.3880582214376446e+01 -1.6334264803781880e+02 -1.2897713279774706e+02 + 62 6.9329936622438794e+01 6.4175913906891367e+01 -9.4055044619463501e+01 + 63 1.1093666087049192e+02 -1.8945409551622827e+01 -7.9769943280840309e+01 + 64 -3.2043182569612747e+00 6.0969354223353436e-02 8.3726884654705636e+00 +run_vdwl: -1315.67379925802 +run_coul: -251.82538792482003 +run_stress: ! |- + -3.6252933525980472e+02 -5.3641871517019717e+02 -3.2709175284369167e+02 -1.8738655015007816e+02 -7.3168357673524369e+01 2.8633318365887470e+02 +run_forces: ! |2 + 1 -6.0427779703512252e-01 2.0490756272412511e+01 1.6647493421616424e+01 + 2 -1.2754841307685804e+02 -6.4508077454175094e+01 -3.3763524679658680e+01 + 3 -1.6340651846845867e+02 -1.3399328724256982e+01 4.5679725510421832e+01 + 4 -7.8684594311176888e+00 1.2975107988543994e+02 -1.6422243689311080e+02 + 5 4.8894979857641701e+01 1.3587905179520945e+00 1.9080723746040558e+01 + 6 -3.2215908697921762e+01 -1.0434604335770943e+02 -2.9323571125825332e+01 + 7 5.4688956076284285e+01 -4.0913951081108415e+01 -5.8353333114689789e+01 + 8 -3.4374795730683481e+01 -5.4582565197183818e+01 3.9161685070849273e+01 + 9 1.0602750268492444e+02 2.4518806007662270e+01 -8.2928224031342211e+01 + 10 8.3448765452309477e+00 5.5864371171692877e+00 1.5832573244721663e+01 + 11 8.7180631758889338e-01 -5.8993323881745852e+01 -3.9884267152772146e+01 + 12 4.4192365852491093e+01 1.4903429729452878e+02 -1.6219206584779144e+02 + 13 -1.4906927452343609e+02 -1.1995874777506886e+02 1.0916264378106862e+02 + 14 -1.6828280298940346e+00 -2.4232825100885098e+01 -2.4809440148861022e+01 + 15 2.8919110783949506e+01 9.0150838201145390e+01 5.2192985984410605e+00 + 16 1.1511130216873305e+02 2.8295862401014123e+01 6.7521012199711848e+01 + 17 4.4256599992638108e+01 4.2406484713402243e+01 7.2795346026494585e+01 + 18 -7.8848008384430539e+00 -1.3664634639099947e+02 6.1095756801901778e+01 + 19 1.0685903199732036e+02 2.0723222350990062e+02 4.4124512300846625e+01 + 20 -4.9546858835888280e+01 -8.1659242595103365e+01 -2.8998046004100793e+01 + 21 -1.3289412244333695e+02 3.7556999753658936e+01 -1.0102308037606839e+02 + 22 1.3266755025284439e+02 -1.1782686540823109e+02 5.4036617937847950e+01 + 23 5.1405885909264370e+01 -2.3873943214452368e+01 -4.7708844268632390e+01 + 24 3.2373370471025311e+01 8.7125637769180997e+01 6.6908838382987426e+01 + 25 -7.6344016160229543e+01 1.4702421930244424e+02 -6.9633680565374561e+01 + 26 1.3052497933070995e+02 -7.6696652508392248e+01 -6.8143428678963431e+01 + 27 6.2295886509448287e+01 5.0089165913467404e+01 3.3482708752529071e+01 + 28 8.1190626623672930e+00 -3.8523237731699100e+00 -1.5914254496826086e+01 + 29 -1.1706723439423264e+02 7.1117332937318878e+01 1.0440215382628243e+02 + 30 2.6668772919869735e+01 -1.1285862351526934e+02 1.8633778385120795e+01 + 31 -1.0847428154293594e+02 1.0996582278921207e+02 -5.5617081154122886e+01 + 32 -1.4603651831782168e+01 4.2816664679363605e+01 3.8851610792442827e+01 + 33 -2.9519680131282556e+01 -7.8704683492661038e+00 4.0688290026701139e+01 + 34 9.4358200696983218e+01 5.1577940760121209e+01 4.9883503942774707e+00 + 35 1.3878184805054929e+02 1.3003401024036332e+01 -3.9263099864942795e+01 + 36 -5.4286023648995418e+01 -8.6096314968346391e+01 6.3573237117647288e+01 + 37 4.8502340503125687e+01 7.1092674139180076e+01 -6.4168924259418233e+01 + 38 -1.2068169270717785e+02 -2.3921584479385240e+02 1.0639203784120866e+02 + 39 4.7485776026051134e+00 1.1146641081166505e+01 9.5242256869966710e+01 + 40 -4.2108599786857281e+00 2.8922835579037174e+00 -3.8847867381075893e+00 + 41 -1.2582200605811198e+02 -1.1458626320666988e+02 1.5634634730428779e+01 + 42 4.3298811262104522e+01 -1.1323825959325698e+02 -1.2148951307455756e+02 + 43 -6.1445155174009782e+00 -1.1289851749911026e+01 1.3009938178494568e+02 + 44 2.3304112892355839e+01 -7.2440612084043048e+00 -2.1407988900122422e+01 + 45 -2.2861406128358620e+01 1.3728999900873370e+02 1.7762870040423550e+02 + 46 4.5768613429530582e+01 -6.7545097081622060e+01 3.7529079576855302e+01 + 47 -3.2701732666230441e+01 -5.3001652471881712e+01 -5.4679269668412701e+01 + 48 2.0328585168114128e+02 -3.0317396492632025e+02 -1.7385434764992988e+02 + 49 -6.8067688050655704e+01 3.9177224134041339e+01 3.5930110316890534e+01 + 50 8.9327213346898784e+00 1.4185280256429226e+02 1.5862826485318126e+02 + 51 3.5558738484365847e+01 -3.2568300408296722e+01 1.4767879474338230e+02 + 52 -1.0584741977885415e+02 1.0312398264883062e+02 -5.0601463470758752e+01 + 53 -3.3993088743715688e+01 9.4956349730017635e+01 -2.0789074418856003e+02 + 54 3.1064727433155586e+01 -5.5559689516396887e+01 4.7459382807520264e+01 + 55 8.0177886992157639e+01 -1.2981800298783250e+02 5.6595487267941550e+01 + 56 -1.2360401264720954e+01 -2.8594676148725313e+01 -5.6861881216640269e+00 + 57 4.5290952881935198e+01 1.5919551554155248e+02 9.9973551309890851e+01 + 58 -2.8760842576207317e+01 6.0634819158216445e+01 -2.3799874997643553e+01 + 59 -2.2258027485314665e+02 1.3033435434930627e+02 1.4065348873603111e+02 + 60 -2.7053242000018251e+01 1.4140890863215688e+02 -1.2766702327645474e+02 + 61 -6.3880091105988988e+01 -1.6334055272776587e+02 -1.2897680193744620e+02 + 62 6.9331724159145509e+01 6.4173290531939443e+01 -9.4050280780932169e+01 + 63 1.1093735613545634e+02 -1.8944653137110969e+01 -7.9770997264690990e+01 + 64 -3.2080968598290363e+00 5.4907326642554835e-02 8.3750551713524164e+00 +... diff --git a/unittest/force-styles/tests/atomic-pair-reaxff-acks2_efield.yaml b/unittest/force-styles/tests/atomic-pair-reaxff-acks2_efield.yaml new file mode 100644 index 0000000000..295b343dea --- /dev/null +++ b/unittest/force-styles/tests/atomic-pair-reaxff-acks2_efield.yaml @@ -0,0 +1,176 @@ +--- +lammps_version: 29 Sep 2021 +date_generated: Wed Oct 13 18:05:37 2021 +epsilon: 5e-09 +skip_tests: omp +prerequisites: ! | + pair reaxff + fix acks2/reaxff + fix efield +pre_commands: ! | + echo screen + boundary m p m + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units real + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 1.0 + mass 2 16.0 + set type 1 type/fraction 2 0.333333333 998877 + set type 1 charge 0.01 + set type 2 charge -0.02 + velocity all create 100 4534624 loop geom +post_commands: ! | + fix qeq all acks2/reaxff 1 0.0 8.0 1.0e-20 reaxff + fix field all efield 0.001 0.000 -0.001 +input_file: in.empty +pair_style: reaxff NULL checkqeq yes +pair_coeff: ! | + * * acks2_ff.water H O +extract: ! "" +natoms: 64 +init_vdwl: -1263.7843580276833 +init_coul: -241.77421360301622 +init_stress: ! |- + -1.0732687705180101e+03 -1.0968581855302236e+03 -8.9675214779212911e+02 -6.2181509337974205e+02 8.0965758549240192e+01 -3.3557256247328615e+02 +init_forces: ! |2 + 1 1.6544873233628813e+01 1.8862665510840209e+01 2.0996152926847120e+01 + 2 1.4107834931964554e+01 1.1562492571378540e+01 1.7399331363893921e+01 + 3 -1.6237159803722722e+02 7.3768611650058613e-01 3.1249313093594427e+01 + 4 -3.7132168139442896e+01 -4.1348791089422249e+01 9.7297469776452239e+00 + 5 8.4639020127616135e+01 1.1700543338567250e+01 -2.0669303202462331e+01 + 6 -6.7193803612931589e+01 -1.0878669861242204e+02 -6.7762372009491596e+00 + 7 5.5859023847810974e+01 -3.6423373006689900e+01 -5.9883505955638867e+01 + 8 7.5524936995194892e+01 3.7206352688917150e+01 -9.1328349315703619e+01 + 9 9.1130895600440979e+01 -8.0301316370963942e+00 -5.4852426195812804e+01 + 10 -5.0551266395515722e+00 2.0267717120929724e+01 3.8895863126909710e+01 + 11 2.2566658900909613e+00 -5.5304165456265110e+01 -3.3341598415342069e+01 + 12 -8.6535829138121315e+01 -6.9396569247311319e+01 7.0609040432477826e+01 + 13 6.5588331967798567e+01 3.4684525121633868e+01 -1.0088769226898077e+02 + 14 -3.6420201957516922e+00 -2.4435068124276075e+01 -2.4467648024146090e+01 + 15 -1.8836951424155945e+01 4.6726538059504868e+01 4.0645964870661466e+01 + 16 -3.5128322960337672e+00 1.9617147249697741e+01 2.1986616163791854e+01 + 17 3.0824371211950428e+01 5.1089885717446847e+01 2.4230958400273195e+01 + 18 6.5737244296448072e+00 -1.4597245806268733e+01 -7.6810211814524658e+00 + 19 5.4554598758648780e+01 2.1142177097216361e+02 7.1040683521812937e+01 + 20 6.6655564140916761e+00 -1.2392613251772549e+02 6.2549558370165414e+01 + 21 -1.6665361076208004e+02 5.0057857067631467e+01 -1.1352343180529587e+02 + 22 3.1292433219186524e+01 -2.6413949828022356e+00 1.5285607176899094e+02 + 23 4.4081782799617116e+01 -3.6246774449704979e+01 -4.5797722792608511e+01 + 24 2.8700709559300659e+01 7.2175615569147638e+01 5.7369098498268578e+01 + 25 -5.5580855024638424e+01 -6.4654228469645361e+01 9.7692246756652978e+01 + 26 1.2973493969999291e+02 -7.5778827402876644e+01 -6.6515328508133550e+01 + 27 8.8126716297991138e+01 5.1433527767092137e+01 2.3407077354386384e+01 + 28 1.2511253239242043e+01 1.3636132025181478e+01 -9.4253259151143549e+00 + 29 -1.1778606765410751e+02 6.6008522248248454e+01 9.0944536800011150e+01 + 30 1.9914163526214200e+01 -1.1702697898021106e+02 1.5464671145793428e+01 + 31 -1.1140631382104954e+02 -4.6409410482794783e+01 -2.1344928927691623e+01 + 32 -1.1955448702076986e+01 9.5875384658668636e+00 2.7935715319779696e+01 + 33 8.7786579760163562e+01 -6.1345188767581263e+01 -7.1583281055181686e+01 + 34 1.2872548655914446e+02 8.7759051883822295e+01 6.8846205973723400e+01 + 35 1.6202753364566260e+02 2.8107190316085855e+01 -3.5703982160947440e+01 + 36 -5.1138513989988184e+01 -6.9911430734306776e+01 4.6497683634936855e+01 + 37 2.2164674302914040e+01 4.4737593543364085e+01 -6.8023531826609343e+01 + 38 -1.3243129081970449e+02 -9.8322438904976408e+01 -4.8865871604589785e+01 + 39 -1.4539914202022622e+01 7.0254382906605883e-01 -6.9870852838183719e+00 + 40 -6.3757234386642994e+00 3.6220340490265279e+00 -6.3430626603811451e+00 + 41 -1.2630715661950779e+02 -1.1405926855800243e+02 1.4235856837032820e+01 + 42 3.3348455809719603e+01 -1.2561825182001029e+02 -1.1707774931406259e+02 + 43 2.4855608100273688e+01 -3.4752760572532353e+01 1.1721316758164591e+02 + 44 4.0739282283363146e+01 -1.2074985902270566e+01 -2.3182902503712622e+01 + 45 -2.3237992224046511e+01 1.3605501182748912e+02 1.7647506188220666e+02 + 46 2.6919517337707384e+00 4.1721320911687787e+00 -3.8364966679971597e+00 + 47 -3.9485981497722868e+01 -4.3831504145579089e+01 -5.0164524782887561e+01 + 48 9.2976340136280768e+01 -8.8061944561111218e+01 -5.6621723131204867e+01 + 49 5.7415986126026773e+01 2.1746462671254432e+00 -4.3765218912166020e+01 + 50 5.0097667749424950e+01 2.7265189853128518e+01 1.0400665840596920e+02 + 51 1.8957139639185641e+01 -6.2782103815444735e+01 1.6722596849835512e+02 + 52 -1.0201283330855033e+02 1.0135195584789010e+02 -4.9656402161283062e+01 + 53 -8.9760482392830099e+01 1.0161186676769185e+02 -2.2025992484840475e+02 + 54 -3.0614746621547880e+01 -1.9050762297562603e+01 -2.5859185152914435e+01 + 55 -7.5153564648369642e-01 -9.6902529050367114e-01 1.2743187960663205e+00 + 56 -8.4859544509025913e+00 -1.4740153224666239e+01 1.0257345367891229e+01 + 57 4.7507280968459092e+01 1.6105950569287401e+02 1.0237884790486045e+02 + 58 -1.3171330115126645e+01 7.3223243955129831e+01 4.4809585421873388e+00 + 59 -6.4621630782895465e+01 9.6129174704686022e+01 1.5093371796835154e+02 + 60 3.0088516319665583e+01 1.7978356604345029e+02 -9.7558160484741677e+01 + 61 -5.1750730839626343e+01 -1.7194405989348417e+02 -1.2738166548385770e+02 + 62 5.7609018186683649e+01 5.3316676874956656e+01 -1.0988014102420154e+02 + 63 -2.5215659343014210e+01 -5.4629420152948171e+01 -5.0894419130817056e+01 + 64 -8.8059251331362219e+01 -3.0748812251211561e+01 3.1311409613927594e+01 +run_vdwl: -1263.7812226205149 +run_coul: -241.77431297463355 +run_stress: ! |- + -1.0732623865648388e+03 -1.0968521804966483e+03 -8.9674335342881352e+02 -6.2181391692244063e+02 8.0959729084010746e+01 -3.3558013691685204e+02 +run_forces: ! |2 + 1 1.6544232553581971e+01 1.8862019986836589e+01 2.0994941865486204e+01 + 2 1.4107290444024050e+01 1.1562222232717577e+01 1.7398935380843948e+01 + 3 -1.6237215881974376e+02 7.3432961093932936e-01 3.1246919721674431e+01 + 4 -3.7132561907901767e+01 -4.1349112476812373e+01 9.7306813516100714e+00 + 5 8.4639859379463857e+01 1.1701335850556484e+01 -2.0670118889863986e+01 + 6 -6.7193179286828212e+01 -1.0878480473686349e+02 -6.7776201873383126e+00 + 7 5.5860279340002492e+01 -3.6424202640975622e+01 -5.9883243627543052e+01 + 8 7.5523949595969242e+01 3.7205843645225180e+01 -9.1328163429407269e+01 + 9 9.1132153498365000e+01 -8.0294015106958536e+00 -5.4854373254291879e+01 + 10 -5.0543438938869816e+00 2.0265568551370560e+01 3.8892408370645036e+01 + 11 2.2590900417619166e+00 -5.5306216756222348e+01 -3.3348769387388884e+01 + 12 -8.6529917311355064e+01 -6.9392956100368195e+01 7.0605936206703788e+01 + 13 6.5582829942500510e+01 3.4683277452110765e+01 -1.0088129053457016e+02 + 14 -3.6407547584093862e+00 -2.4434434655450158e+01 -2.4465678413828943e+01 + 15 -1.8835383504020545e+01 4.6725147451466299e+01 4.0644786358859363e+01 + 16 -3.5128444201904752e+00 1.9614904774654285e+01 2.1983872664041776e+01 + 17 3.0824498024574577e+01 5.1089866020602130e+01 2.4231024241605290e+01 + 18 6.5739130682327769e+00 -1.4597089579069062e+01 -7.6808820450601480e+00 + 19 5.4555769907347333e+01 2.1142176567824694e+02 7.1041499624047702e+01 + 20 6.6656938419689631e+00 -1.2392554538030720e+02 6.2549560025499467e+01 + 21 -1.6665373624470132e+02 5.0057368819337832e+01 -1.1352271444751825e+02 + 22 3.1294137972313312e+01 -2.6433268939701646e+00 1.5285580563663439e+02 + 23 4.4080875001871384e+01 -3.6247455920969131e+01 -4.5798644712663076e+01 + 24 2.8698567600094101e+01 7.2178641106694457e+01 5.7372823020059315e+01 + 25 -5.5580418986766084e+01 -6.4654019131590019e+01 9.7691735465611018e+01 + 26 1.2973502303885829e+02 -7.5779455574870099e+01 -6.6514358152908059e+01 + 27 8.8126287913796759e+01 5.1435504570072304e+01 2.3409291923481693e+01 + 28 1.2510113771398244e+01 1.3634931483058264e+01 -9.4252533397897764e+00 + 29 -1.1778523460931234e+02 6.6009613580347121e+01 9.0943212016746855e+01 + 30 1.9914063738336566e+01 -1.1702883459063344e+02 1.5465197779555830e+01 + 31 -1.1140726302354332e+02 -4.6410020081938136e+01 -2.1345709679555512e+01 + 32 -1.1957048806890009e+01 9.5906378303466582e+00 2.7942436601482576e+01 + 33 8.7786367176445452e+01 -6.1345385969144544e+01 -7.1583303703860352e+01 + 34 1.2872581367351663e+02 8.7758298153621197e+01 6.8846441344195767e+01 + 35 1.6202779191187562e+02 2.8107540424415969e+01 -3.5704512791568746e+01 + 36 -5.1137206842063968e+01 -6.9909055340457016e+01 4.6496527650762957e+01 + 37 2.2163372903721005e+01 4.4734516931542203e+01 -6.8020131205899546e+01 + 38 -1.3243178798824840e+02 -9.8321818047878409e+01 -4.8866073883159153e+01 + 39 -1.4539787995247799e+01 7.0253538717035013e-01 -6.9871154389387859e+00 + 40 -6.3759251823074372e+00 3.6219715809810360e+00 -6.3431123972910317e+00 + 41 -1.2630739214311127e+02 -1.1406046951535005e+02 1.4236670870575175e+01 + 42 3.3347539164801596e+01 -1.2561964397086489e+02 -1.1707704405287748e+02 + 43 2.4855187641070557e+01 -3.4751994200759135e+01 1.1721400031115856e+02 + 44 4.0736513361477975e+01 -1.2073170509775336e+01 -2.3181680396846534e+01 + 45 -2.3236271184767592e+01 1.3605750605535329e+02 1.7647433643140135e+02 + 46 2.6919972472205083e+00 4.1721174495610596e+00 -3.8364650402611424e+00 + 47 -3.9486312669643070e+01 -4.3831801629913109e+01 -5.0165032821803521e+01 + 48 9.2977999041840789e+01 -8.8063595664574294e+01 -5.6623443462956914e+01 + 49 5.7416262761079196e+01 2.1747968406494360e+00 -4.3764886460190468e+01 + 50 5.0095819904085424e+01 2.7265328004138762e+01 1.0400611458885135e+02 + 51 1.8960698364911142e+01 -6.2786559548989580e+01 1.6723090861991949e+02 + 52 -1.0201510984444386e+02 1.0135385381698417e+02 -4.9656785152734628e+01 + 53 -8.9763310205569240e+01 1.0161533612990944e+02 -2.2026493760153934e+02 + 54 -3.0614025776936483e+01 -1.9050045961497887e+01 -2.5858482423080094e+01 + 55 -7.5156660469712333e-01 -9.6904023224723745e-01 1.2743032380741282e+00 + 56 -8.4859915855388337e+00 -1.4739109817962941e+01 1.0257420490900687e+01 + 57 4.7507223485547648e+01 1.6105805016960610e+02 1.0237826693894539e+02 + 58 -1.3170532544205338e+01 7.3223353402828366e+01 4.4818703297184754e+00 + 59 -6.4622658207012819e+01 9.6130764940749344e+01 1.5093510874841516e+02 + 60 3.0089230627199072e+01 1.7978668287947750e+02 -9.7557372159122423e+01 + 61 -5.1750204112643075e+01 -1.7194201577527312e+02 -1.2738134561846734e+02 + 62 5.7608008441869174e+01 5.3315211268989366e+01 -1.0988080965709574e+02 + 63 -2.5216351744964118e+01 -5.4629182629703294e+01 -5.0894055553792974e+01 + 64 -8.8059174176173670e+01 -3.0751077235434341e+01 3.1310372105706474e+01 +... diff --git a/unittest/force-styles/tests/mol-pair-coul_long.yaml b/unittest/force-styles/tests/mol-pair-coul_long.yaml index 61e038af54..5746877cc3 100644 --- a/unittest/force-styles/tests/mol-pair-coul_long.yaml +++ b/unittest/force-styles/tests/mol-pair-coul_long.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:42 2021 -epsilon: 1.5e-13 +epsilon: 2.0e-13 prerequisites: ! | atom full pair coul/long diff --git a/unittest/force-styles/yaml_writer.cpp b/unittest/force-styles/yaml_writer.cpp index feaa3d52eb..b1165ff821 100644 --- a/unittest/force-styles/yaml_writer.cpp +++ b/unittest/force-styles/yaml_writer.cpp @@ -31,9 +31,9 @@ YamlWriter::YamlWriter(const char *outfile) yaml_stream_start_event_initialize(&event, YAML_UTF8_ENCODING); yaml_emitter_emit(&emitter, &event); - yaml_document_start_event_initialize(&event, NULL, NULL, NULL, 0); + yaml_document_start_event_initialize(&event, nullptr, nullptr, nullptr, 0); yaml_emitter_emit(&emitter, &event); - yaml_mapping_start_event_initialize(&event, NULL, (yaml_char_t *)YAML_MAP_TAG, 1, + yaml_mapping_start_event_initialize(&event, nullptr, (yaml_char_t *)YAML_MAP_TAG, 1, YAML_ANY_MAPPING_STYLE); yaml_emitter_emit(&emitter, &event); } @@ -67,11 +67,11 @@ void YamlWriter::emit(const std::string &key, const int value) void YamlWriter::emit(const std::string &key, const std::string &value) { - yaml_scalar_event_initialize(&event, NULL, (yaml_char_t *)YAML_STR_TAG, + yaml_scalar_event_initialize(&event, nullptr, (yaml_char_t *)YAML_STR_TAG, (yaml_char_t *)key.c_str(), key.size(), 1, 0, YAML_PLAIN_SCALAR_STYLE); yaml_emitter_emit(&emitter, &event); - yaml_scalar_event_initialize(&event, NULL, (yaml_char_t *)YAML_STR_TAG, + yaml_scalar_event_initialize(&event, nullptr, (yaml_char_t *)YAML_STR_TAG, (yaml_char_t *)value.c_str(), value.size(), 1, 0, YAML_PLAIN_SCALAR_STYLE); yaml_emitter_emit(&emitter, &event); @@ -79,11 +79,11 @@ void YamlWriter::emit(const std::string &key, const std::string &value) void YamlWriter::emit_block(const std::string &key, const std::string &value) { - yaml_scalar_event_initialize(&event, NULL, (yaml_char_t *)YAML_STR_TAG, + yaml_scalar_event_initialize(&event, nullptr, (yaml_char_t *)YAML_STR_TAG, (yaml_char_t *)key.c_str(), key.size(), 1, 0, YAML_PLAIN_SCALAR_STYLE); yaml_emitter_emit(&emitter, &event); - yaml_scalar_event_initialize(&event, NULL, (yaml_char_t *)YAML_STR_TAG, + yaml_scalar_event_initialize(&event, nullptr, (yaml_char_t *)YAML_STR_TAG, (yaml_char_t *)value.c_str(), value.size(), 1, 0, YAML_LITERAL_SCALAR_STYLE); yaml_emitter_emit(&emitter, &event); diff --git a/unittest/formats/test_dump_atom.cpp b/unittest/formats/test_dump_atom.cpp index 8a3dab44a4..bc43c40de2 100644 --- a/unittest/formats/test_dump_atom.cpp +++ b/unittest/formats/test_dump_atom.cpp @@ -39,6 +39,21 @@ public: END_HIDE_OUTPUT(); } + std::string dump_filename(std::string ident) + { + return fmt::format("dump_{}_{}.melt", dump_style, ident); + } + + std::string text_dump_filename(std::string ident) + { + return fmt::format("dump_{}_text_{}.melt", dump_style, ident); + } + + std::string binary_dump_filename(std::string ident) + { + return fmt::format("dump_{}_binary_{}.melt.bin", dump_style, ident); + } + void generate_dump(std::string dump_file, std::string dump_modify_options, int ntimesteps) { BEGIN_HIDE_OUTPUT(); @@ -87,7 +102,7 @@ public: TEST_F(DumpAtomTest, run0) { - auto dump_file = "dump_run0.melt"; + auto dump_file = dump_filename("run0"); generate_dump(dump_file, "scale yes image no", 0); ASSERT_FILE_EXISTS(dump_file); @@ -103,7 +118,7 @@ TEST_F(DumpAtomTest, run0) TEST_F(DumpAtomTest, format_line_run0) { - auto dump_file = "dump_format_line_run0.melt"; + auto dump_file = dump_filename("format_line_run0"); generate_dump(dump_file, "format line \"%d %d %20.15g %g %g\" scale yes image no", 0); ASSERT_FILE_EXISTS(dump_file); @@ -119,7 +134,7 @@ TEST_F(DumpAtomTest, format_line_run0) TEST_F(DumpAtomTest, no_scale_run0) { - auto dump_file = "dump_no_scale_run0.melt"; + auto dump_file = dump_filename("no_scale_run0"); generate_dump(dump_file, "scale off", 0); ASSERT_FILE_EXISTS(dump_file); @@ -134,7 +149,7 @@ TEST_F(DumpAtomTest, no_scale_run0) TEST_F(DumpAtomTest, no_buffer_no_scale_run0) { - auto dump_file = "dump_no_buffer_no_scale_run0.melt"; + auto dump_file = dump_filename("no_buffer_no_scale_run0"); generate_dump(dump_file, "buffer false scale false", 0); ASSERT_FILE_EXISTS(dump_file); @@ -149,7 +164,7 @@ TEST_F(DumpAtomTest, no_buffer_no_scale_run0) TEST_F(DumpAtomTest, no_buffer_with_scale_run0) { - auto dump_file = "dump_no_buffer_with_scale_run0.melt"; + auto dump_file = dump_filename("no_buffer_with_scale_run0"); generate_dump(dump_file, "buffer 0 scale 1", 0); ASSERT_FILE_EXISTS(dump_file); @@ -164,7 +179,7 @@ TEST_F(DumpAtomTest, no_buffer_with_scale_run0) TEST_F(DumpAtomTest, with_image_run0) { - auto dump_file = "dump_with_image_run0.melt"; + auto dump_file = dump_filename("with_image_run0"); generate_dump(dump_file, "scale no image on", 0); ASSERT_FILE_EXISTS(dump_file); @@ -177,7 +192,7 @@ TEST_F(DumpAtomTest, with_image_run0) TEST_F(DumpAtomTest, with_units_run0) { - auto dump_file = "dump_with_units_run0.melt"; + auto dump_file = dump_filename("with_units_run0"); generate_dump(dump_file, "scale false units 1", 0); ASSERT_FILE_EXISTS(dump_file); @@ -192,7 +207,7 @@ TEST_F(DumpAtomTest, with_units_run0) TEST_F(DumpAtomTest, with_time_run0) { - auto dump_file = "dump_with_time_run0.melt"; + auto dump_file = dump_filename("with_time_run0"); generate_dump(dump_file, "scale off time true", 0); ASSERT_FILE_EXISTS(dump_file); @@ -206,7 +221,7 @@ TEST_F(DumpAtomTest, with_time_run0) TEST_F(DumpAtomTest, with_units_run1) { - auto dump_file = "dump_with_units_run1.melt"; + auto dump_file = dump_filename("with_units_run1"); generate_dump(dump_file, "scale 0 units on", 1); ASSERT_FILE_EXISTS(dump_file); @@ -221,7 +236,7 @@ TEST_F(DumpAtomTest, with_units_run1) TEST_F(DumpAtomTest, no_buffer_with_scale_and_image_run0) { - auto dump_file = "dump_no_buffer_with_scale_and_image_run0.melt"; + auto dump_file = dump_filename("no_buffer_with_scale_and_image_run0"); generate_dump(dump_file, "buffer 0 scale 1 image true", 0); ASSERT_FILE_EXISTS(dump_file); @@ -235,7 +250,7 @@ TEST_F(DumpAtomTest, no_buffer_with_scale_and_image_run0) } TEST_F(DumpAtomTest, triclinic_run0) { - auto dump_file = "dump_triclinic_run0.melt"; + auto dump_file = dump_filename("triclinic_run0"); enable_triclinic(); generate_dump(dump_file, "", 0); @@ -251,7 +266,7 @@ TEST_F(DumpAtomTest, triclinic_run0) TEST_F(DumpAtomTest, triclinic_with_units_run0) { - auto dump_file = "dump_triclinic_with_units_run0.melt"; + auto dump_file = dump_filename("triclinic_with_units_run0"); enable_triclinic(); generate_dump(dump_file, "units on", 0); @@ -269,7 +284,7 @@ TEST_F(DumpAtomTest, triclinic_with_units_run0) TEST_F(DumpAtomTest, triclinic_with_time_run0) { - auto dump_file = "dump_triclinic_with_time_run0.melt"; + auto dump_file = dump_filename("triclinic_with_time_run0"); enable_triclinic(); generate_dump(dump_file, "time on", 0); @@ -286,7 +301,7 @@ TEST_F(DumpAtomTest, triclinic_with_time_run0) TEST_F(DumpAtomTest, triclinic_with_image_run0) { - auto dump_file = "dump_triclinic_with_image_run0.melt"; + auto dump_file = dump_filename("triclinic_with_image_run0"); enable_triclinic(); generate_dump(dump_file, "image yes", 0); @@ -308,8 +323,8 @@ TEST_F(DumpAtomTest, binary_run0) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_text_run0.melt"; - auto binary_file = "dump_binary_run0.melt.bin"; + auto text_file = text_dump_filename("run0"); + auto binary_file = binary_dump_filename("run0"); generate_text_and_binary_dump(text_file, binary_file, "", 0); @@ -329,8 +344,8 @@ TEST_F(DumpAtomTest, binary_with_units_run0) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_text_with_units_run0.melt"; - auto binary_file = "dump_binary_with_units_run0.melt.bin"; + auto text_file = text_dump_filename("with_units_run0"); + auto binary_file = binary_dump_filename("with_units_run0"); generate_text_and_binary_dump(text_file, binary_file, "scale no units yes", 0); @@ -350,8 +365,8 @@ TEST_F(DumpAtomTest, binary_with_time_run0) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_text_with_time_run0.melt"; - auto binary_file = "dump_binary_with_time_run0.melt.bin"; + auto text_file = text_dump_filename("with_time_run0"); + auto binary_file = binary_dump_filename("with_time_run0"); generate_text_and_binary_dump(text_file, binary_file, "scale no time yes", 0); @@ -371,8 +386,8 @@ TEST_F(DumpAtomTest, binary_triclinic_run0) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_text_tri_run0.melt"; - auto binary_file = "dump_binary_tri_run0.melt.bin"; + auto text_file = text_dump_filename("tri_run0"); + auto binary_file = binary_dump_filename("tri_run0"); enable_triclinic(); generate_text_and_binary_dump(text_file, binary_file, "", 0); @@ -393,8 +408,8 @@ TEST_F(DumpAtomTest, binary_triclinic_with_units_run0) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_text_tri_with_units_run0.melt"; - auto binary_file = "dump_binary_tri_with_units_run0.melt.bin"; + auto text_file = text_dump_filename("tri_with_units_run0"); + auto binary_file = binary_dump_filename("tri_with_units_run0"); enable_triclinic(); generate_text_and_binary_dump(text_file, binary_file, "scale no units yes", 0); @@ -415,8 +430,8 @@ TEST_F(DumpAtomTest, binary_triclinic_with_time_run0) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_text_tri_with_time_run0.melt"; - auto binary_file = "dump_binary_tri_with_time_run0.melt.bin"; + auto text_file = text_dump_filename("tri_with_time_run0"); + auto binary_file = binary_dump_filename("tri_with_time_run0"); enable_triclinic(); generate_text_and_binary_dump(text_file, binary_file, "scale no time yes", 0); @@ -437,8 +452,8 @@ TEST_F(DumpAtomTest, binary_triclinic_with_image_run0) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_text_tri_with_image_run0.melt"; - auto binary_file = "dump_binary_tri_with_image_run0.melt.bin"; + auto text_file = text_dump_filename("tri_with_image_run0"); + auto binary_file = binary_dump_filename("tri_with_image_run0"); enable_triclinic(); generate_text_and_binary_dump(text_file, binary_file, "image yes", 0); @@ -457,7 +472,7 @@ TEST_F(DumpAtomTest, binary_triclinic_with_image_run0) TEST_F(DumpAtomTest, run1plus1) { - auto dump_file = "dump_run1plus1.melt"; + auto dump_file = dump_filename("run1plus1"); generate_dump(dump_file, "", 1); ASSERT_FILE_EXISTS(dump_file); @@ -470,7 +485,7 @@ TEST_F(DumpAtomTest, run1plus1) TEST_F(DumpAtomTest, run2) { - auto dump_file = "dump_run2.melt"; + auto dump_file = dump_filename("run2"); generate_dump(dump_file, "", 2); ASSERT_FILE_EXISTS(dump_file); @@ -480,7 +495,7 @@ TEST_F(DumpAtomTest, run2) TEST_F(DumpAtomTest, rerun) { - auto dump_file = "dump_rerun.melt"; + auto dump_file = dump_filename("rerun"); HIDE_OUTPUT([&] { command("fix 1 all nve"); }); @@ -508,38 +523,43 @@ TEST_F(DumpAtomTest, rerun) TEST_F(DumpAtomTest, multi_file_run1) { - auto dump_file = "dump_run1_*.melt"; + auto dump_file = dump_filename("run1_*"); generate_dump(dump_file, "", 1); - ASSERT_FILE_EXISTS("dump_run1_0.melt"); - ASSERT_FILE_EXISTS("dump_run1_1.melt"); - ASSERT_EQ(count_lines("dump_run1_0.melt"), 41); - ASSERT_EQ(count_lines("dump_run1_1.melt"), 41); - delete_file("dump_run1_0.melt"); - delete_file("dump_run1_1.melt"); + auto run1_0 = dump_filename("run1_0"); + auto run1_1 = dump_filename("run1_1"); + ASSERT_FILE_EXISTS(run1_0); + ASSERT_FILE_EXISTS(run1_1); + ASSERT_EQ(count_lines(run1_0), 41); + ASSERT_EQ(count_lines(run1_1), 41); + delete_file(run1_0); + delete_file(run1_1); } TEST_F(DumpAtomTest, per_processor_file_run1) { - auto dump_file = "dump_run1_p%.melt"; + auto dump_file = dump_filename("run1_p%"); generate_dump(dump_file, "", 1); - ASSERT_FILE_EXISTS("dump_run1_p0.melt"); - ASSERT_EQ(count_lines("dump_run1_p0.melt"), 82); - delete_file("dump_run1_p0.melt"); + auto run1_p0 = dump_filename("run1_p0"); + ASSERT_FILE_EXISTS(run1_p0); + ASSERT_EQ(count_lines(run1_p0), 82); + delete_file(run1_p0); } TEST_F(DumpAtomTest, per_processor_multi_file_run1) { - auto dump_file = "dump_run1_p%_*.melt"; + auto dump_file = dump_filename("run1_p%_*"); generate_dump(dump_file, "", 1); - ASSERT_FILE_EXISTS("dump_run1_p0_0.melt"); - ASSERT_FILE_EXISTS("dump_run1_p0_1.melt"); - ASSERT_EQ(count_lines("dump_run1_p0_0.melt"), 41); - ASSERT_EQ(count_lines("dump_run1_p0_1.melt"), 41); - delete_file("dump_run1_p0_0.melt"); - delete_file("dump_run1_p0_1.melt"); + auto run1_p0_0 = dump_filename("run1_p0_0"); + auto run1_p0_1 = dump_filename("run1_p0_1"); + ASSERT_FILE_EXISTS(run1_p0_0); + ASSERT_FILE_EXISTS(run1_p0_1); + ASSERT_EQ(count_lines(run1_p0_0), 41); + ASSERT_EQ(count_lines(run1_p0_1), 41); + delete_file(run1_p0_0); + delete_file(run1_p0_1); } TEST_F(DumpAtomTest, dump_modify_scale_invalid) @@ -573,16 +593,17 @@ TEST_F(DumpAtomTest, dump_modify_invalid) TEST_F(DumpAtomTest, write_dump) { - auto reference = "dump_ref_run0.melt"; - auto dump_file = "write_dump_atom_run0.melt"; + auto reference = dump_filename("run0_ref"); + auto dump_file = fmt::format("write_{}", dump_filename("run*")); BEGIN_HIDE_OUTPUT(); command(fmt::format("dump id all atom 1 {}", reference)); command("dump_modify id scale no units yes"); command("run 0"); - command("write_dump all atom write_dump_atom_run*.melt modify scale no units yes"); + command(fmt::format("write_dump all atom {} modify scale no units yes", dump_file)); END_HIDE_OUTPUT(); + dump_file = fmt::format("write_{}", dump_filename("run0")); ASSERT_FILE_EXISTS(reference); ASSERT_FILE_EXISTS(dump_file); @@ -595,16 +616,17 @@ TEST_F(DumpAtomTest, binary_write_dump) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto reference = "dump_run0.melt.bin"; - auto dump_file = "write_dump_atom_run0_p0.melt.bin"; + auto reference = binary_dump_filename("write_run0_ref"); + auto dump_file = fmt::format("write_{}", binary_dump_filename("write_dump_atom_run*_p%")); BEGIN_HIDE_OUTPUT(); command(fmt::format("dump id all atom 1 {}", reference)); command("dump_modify id scale no units yes"); command("run 0"); - command("write_dump all atom write_dump_atom_run*_p%.melt.bin modify scale no units yes"); + command(fmt::format("write_dump all atom {} modify scale no units yes", dump_file)); END_HIDE_OUTPUT(); + dump_file = fmt::format("write_{}", binary_dump_filename("write_dump_atom_run0_p0")); ASSERT_FILE_EXISTS(reference); ASSERT_FILE_EXISTS(dump_file); diff --git a/unittest/formats/test_dump_custom.cpp b/unittest/formats/test_dump_custom.cpp index 90876dcb2d..5d4132108d 100644 --- a/unittest/formats/test_dump_custom.cpp +++ b/unittest/formats/test_dump_custom.cpp @@ -37,6 +37,21 @@ public: END_HIDE_OUTPUT(); } + std::string dump_filename(std::string ident) + { + return fmt::format("dump_{}_{}.melt", dump_style, ident); + } + + std::string text_dump_filename(std::string ident) + { + return fmt::format("dump_{}_text_{}.melt", dump_style, ident); + } + + std::string binary_dump_filename(std::string ident) + { + return fmt::format("dump_{}_binary_{}.melt.bin", dump_style, ident); + } + void generate_dump(std::string dump_file, std::string fields, std::string dump_modify_options, int ntimesteps) { @@ -87,7 +102,7 @@ public: TEST_F(DumpCustomTest, run1) { - auto dump_file = "dump_custom_run1.melt"; + auto dump_file = dump_filename("run1"); auto fields = "id type proc procp1 mass x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz"; @@ -105,7 +120,7 @@ TEST_F(DumpCustomTest, run1) TEST_F(DumpCustomTest, thresh_run0) { - auto dump_file = "dump_custom_thresh_run0.melt"; + auto dump_file = dump_filename("thresh_run0"); auto fields = "id type x y z"; generate_dump(dump_file, fields, "units yes thresh x < 1 thresh y < 1 thresh z < 1", 0); @@ -126,7 +141,7 @@ TEST_F(DumpCustomTest, compute_run0) command("compute comp all property/atom x y z"); END_HIDE_OUTPUT(); - auto dump_file = "dump_custom_compute_run0.melt"; + auto dump_file = dump_filename("compute_run0"); auto fields = "id type x y z c_comp[1] c_comp[2] c_comp[3]"; generate_dump(dump_file, fields, "units yes", 0); @@ -149,7 +164,7 @@ TEST_F(DumpCustomTest, fix_run0) command("fix numdiff all numdiff 1 0.0001"); END_HIDE_OUTPUT(); - auto dump_file = "dump_custom_compute_run0.melt"; + auto dump_file = dump_filename("fix_run0"); auto fields = "id x y z f_numdiff[1] f_numdiff[2] f_numdiff[3]"; generate_dump(dump_file, fields, "units yes", 0); @@ -171,7 +186,7 @@ TEST_F(DumpCustomTest, custom_run0) command("compute 1 all property/atom i_flag1 d_flag2"); END_HIDE_OUTPUT(); - auto dump_file = "dump_custom_custom_run0.melt"; + auto dump_file = dump_filename("custom_run0"); auto fields = "id x y z i_flag1 d_flag2"; generate_dump(dump_file, fields, "units yes", 0); @@ -190,8 +205,8 @@ TEST_F(DumpCustomTest, binary_run1) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_custom_text_run1.melt"; - auto binary_file = "dump_custom_binary_run1.melt.bin"; + auto text_file = text_dump_filename("run1"); + auto binary_file = binary_dump_filename("run1"); auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz"; generate_text_and_binary_dump(text_file, binary_file, fields, "units yes", 1); @@ -210,7 +225,7 @@ TEST_F(DumpCustomTest, binary_run1) TEST_F(DumpCustomTest, triclinic_run1) { - auto dump_file = "dump_custom_tri_run1.melt"; + auto dump_file = dump_filename("tri_run1"); auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz"; enable_triclinic(); @@ -231,8 +246,8 @@ TEST_F(DumpCustomTest, binary_triclinic_run1) { if (!BINARY2TXT_BINARY) GTEST_SKIP(); - auto text_file = "dump_custom_tri_text_run1.melt"; - auto binary_file = "dump_custom_tri_binary_run1.melt.bin"; + auto text_file = text_dump_filename("tri_run1"); + auto binary_file = binary_dump_filename("tri_run1"); auto fields = "id type proc x y z xs ys zs xsu ysu zsu vx vy vz fx fy fz"; enable_triclinic(); @@ -258,7 +273,7 @@ TEST_F(DumpCustomTest, with_variable_run1) command("variable p atom (c_1%10)+1"); END_HIDE_OUTPUT(); - auto dump_file = "dump_custom_with_variable_run1.melt"; + auto dump_file = dump_filename("with_variable_run1"); auto fields = "id type x y z v_p"; generate_dump(dump_file, fields, "units yes", 1); @@ -275,7 +290,7 @@ TEST_F(DumpCustomTest, with_variable_run1) TEST_F(DumpCustomTest, run1plus1) { - auto dump_file = "dump_custom_run1plus1.melt"; + auto dump_file = dump_filename("run1plus1"); auto fields = "id type x y z"; generate_dump(dump_file, fields, "units yes", 1); @@ -292,7 +307,7 @@ TEST_F(DumpCustomTest, run1plus1) TEST_F(DumpCustomTest, run2) { - auto dump_file = "dump_custom_run2.melt"; + auto dump_file = dump_filename("run2"); auto fields = "id type x y z"; generate_dump(dump_file, fields, "", 2); @@ -303,7 +318,7 @@ TEST_F(DumpCustomTest, run2) TEST_F(DumpCustomTest, rerun) { - auto dump_file = "dump_rerun.melt"; + auto dump_file = dump_filename("rerun"); auto fields = "id type xs ys zs"; HIDE_OUTPUT([&] { diff --git a/unittest/formats/test_file_operations.cpp b/unittest/formats/test_file_operations.cpp index 08baed2e54..bb26dff391 100644 --- a/unittest/formats/test_file_operations.cpp +++ b/unittest/formats/test_file_operations.cpp @@ -491,7 +491,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/formats/test_molecule_file.cpp b/unittest/formats/test_molecule_file.cpp index 5a3e3ca750..2cca7a6832 100644 --- a/unittest/formats/test_molecule_file.cpp +++ b/unittest/formats/test_molecule_file.cpp @@ -17,7 +17,6 @@ #include "input.h" #include "lammps.h" #include "molecule.h" -#include "utils.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -257,7 +256,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/formats/test_potential_file_reader.cpp b/unittest/formats/test_potential_file_reader.cpp index 5f7148b7e4..7cd61d25a4 100644 --- a/unittest/formats/test_potential_file_reader.cpp +++ b/unittest/formats/test_potential_file_reader.cpp @@ -326,7 +326,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/formats/test_text_file_reader.cpp b/unittest/formats/test_text_file_reader.cpp index 4e1f608d25..f0f695ae54 100644 --- a/unittest/formats/test_text_file_reader.cpp +++ b/unittest/formats/test_text_file_reader.cpp @@ -160,7 +160,7 @@ int main(int argc, char **argv) MPI_Init(&argc, &argv); ::testing::InitGoogleMock(&argc, argv); - if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + if (platform::mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) std::cout << "Warning: using OpenMPI without exceptions. " "Death tests will be skipped\n"; diff --git a/unittest/fortran/wrap_commands.cpp b/unittest/fortran/wrap_commands.cpp index bdf38144c5..2605cb7295 100644 --- a/unittest/fortran/wrap_commands.cpp +++ b/unittest/fortran/wrap_commands.cpp @@ -21,8 +21,8 @@ double f_lammps_get_natoms(); class LAMMPS_commands : public ::testing::Test { protected: LAMMPS_NS::LAMMPS *lmp; - LAMMPS_commands(){}; - ~LAMMPS_commands() override{}; + LAMMPS_commands() = default; + ~LAMMPS_commands() override = default; void SetUp() override { diff --git a/unittest/python/python-capabilities.py b/unittest/python/python-capabilities.py index 8f72c39670..4c14cac37d 100644 --- a/unittest/python/python-capabilities.py +++ b/unittest/python/python-capabilities.py @@ -166,9 +166,9 @@ class PythonCapabilities(unittest.TestCase): self.assertIn('single',settings['GPU']['precision']) if self.cmake_cache['PKG_KOKKOS']: - if self.cmake_cache['Kokkos_ENABLE_OPENMP']: + if 'Kokkos_ENABLE_OPENMP' in self.cmake_cache and self.cmake_cache['Kokkos_ENABLE_OPENMP']: self.assertIn('openmp',settings['KOKKOS']['api']) - if self.cmake_cache['Kokkos_ENABLE_SERIAL']: + if 'Kokkos_ENABLE_SERIAL' in self.cmake_cache and self.cmake_cache['Kokkos_ENABLE_SERIAL']: self.assertIn('serial',settings['KOKKOS']['api']) self.assertIn('double',settings['KOKKOS']['precision']) diff --git a/unittest/python/python-commands.py b/unittest/python/python-commands.py index f3526d6d4b..bd8512894f 100644 --- a/unittest/python/python-commands.py +++ b/unittest/python/python-commands.py @@ -1,6 +1,6 @@ -import sys,os,unittest -from lammps import lammps, LMP_VAR_ATOM, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR +import sys,os,unittest,ctypes +from lammps import lammps, LMP_VAR_ATOM, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, LAMMPS_DOUBLE_2D, LAMMPS_AUTODETECT has_manybody=False try: @@ -494,6 +494,43 @@ create_atoms 1 single & self.assertEqual(self.lmp.extract_global("sublo_lambda"), [0.0, 0.0, 0.0]) self.assertEqual(self.lmp.extract_global("subhi_lambda"), [1.0, 1.0, 1.0]) + def test_create_atoms(self): + self.lmp.command("boundary f p m") + self.lmp.command("region box block 0 10 0 10 0 10") + self.lmp.command("create_box 2 box") + # second atom is outside the box -> dropped + self.lmp.create_atoms(2, [1,2], [1,1], [1.0, 1.0, 3.0, 5.0, 8.0, 12.0]) + self.assertEqual(self.lmp.get_natoms(),1) + # non-zero velocities + self.lmp.create_atoms(2, None, [2,2], [2.0, 2.0, 1.0, 3.0, 4.0, 6.0], v=[0.1, 0.2, 0.3, -0.1, -0.2, -0.3]) + self.assertEqual(self.lmp.get_natoms(),3) + # first atom is dropped, extend shrinkwrapped box for second atom, third atoms is wrapped around PBC. + self.lmp.create_atoms(3, [5,8,10], [1,2,1], [-1.0, 1.0, 3.0, 5.0, 8.0, 12.0, 1.0, -1.0, 1.0], shrinkexceed=True) + self.assertEqual(self.lmp.get_natoms(),5) + # set image flags + self.lmp.create_atoms(1, None, [2], [5.0, 8.0, 1.0], image=[self.lmp.encode_image_flags(1,0,-1)]) + self.assertEqual(self.lmp.get_natoms(),6) + tag = self.lmp.extract_atom("id") + typ = self.lmp.extract_atom("type") + pos = self.lmp.extract_atom("x",LAMMPS_DOUBLE_2D) + vel = self.lmp.extract_atom("v",LAMMPS_DOUBLE_2D) + img = self.lmp.extract_atom("image",LAMMPS_AUTODETECT) + # expected results: tag, type, x, v, image + result = [ [ 1, 1, [1.0, 1.0, 3.0], [ 0.0, 0.0, 0.0], [0, 0, 0]],\ + [ 2, 2, [2.0, 2.0, 1.0], [ 0.1, 0.2, 0.3], [0, 0, 0]],\ + [ 3, 2, [3.0, 4.0, 6.0], [-0.1, -0.2, -0.3], [0, 0, 0]],\ + [ 8, 2, [5.0, 8.0, 12.0], [ 0.0, 0.0, 0.0], [0, 0, 0]],\ + [10, 1, [1.0, 9.0, 1.0], [ 0.0, 0.0, 0.0], [0, 0, 0]],\ + [11, 2, [5.0, 8.0, 1.0], [ 0.0, 0.0, 0.0], [1, 0, -1]] ] + for i in range(len(result)): + self.assertEqual(tag[i],result[i][0]) + self.assertEqual(typ[i],result[i][1]) + for j in range(3): + self.assertEqual(pos[i][0:3],result[i][2]) + self.assertEqual(vel[i][0:3],result[i][3]) + self.assertEqual(self.lmp.decode_image_flags(img[i]), result[i][4]) + + ############################## if __name__ == "__main__": unittest.main() diff --git a/unittest/testing/core.h b/unittest/testing/core.h index 6867d88587..c922e96cc0 100644 --- a/unittest/testing/core.h +++ b/unittest/testing/core.h @@ -17,6 +17,7 @@ #include "info.h" #include "input.h" #include "lammps.h" +#include "platform.h" #include "variable.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -36,7 +37,7 @@ using ::testing::MatchesRegex; auto mesg = ::testing::internal::GetCapturedStdout(); \ ASSERT_THAT(mesg, MatchesRegex(errmsg)); \ } else { \ - if (Info::get_mpi_vendor() != "Open MPI") { \ + if (platform::mpi_vendor() != "Open MPI") { \ ::testing::internal::CaptureStdout(); \ ASSERT_DEATH({__VA_ARGS__}, ""); \ auto mesg = ::testing::internal::GetCapturedStdout(); \ diff --git a/unittest/utils/CMakeLists.txt b/unittest/utils/CMakeLists.txt index c1ce7c136f..9f708861cc 100644 --- a/unittest/utils/CMakeLists.txt +++ b/unittest/utils/CMakeLists.txt @@ -13,7 +13,25 @@ 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) add_test(Utils test_utils) -set_tests_properties(Utils PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") + +add_executable(test_platform test_platform.cpp) +target_link_libraries(test_platform PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +add_test(Platform test_platform) + +set_tests_properties(Utils Platform PROPERTIES + ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") + +if(BUILD_SHARED_LIBS) + enable_language(C) + add_library(testsharedobj MODULE testshared.c) + set_target_properties(testsharedobj PROPERTIES PREFIX "" WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + add_library(testsharedlib SHARED testshared.c) + set_target_properties(testsharedlib PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + add_dependencies(test_platform testsharedobj testsharedlib) + target_compile_definitions(test_platform PRIVATE TEST_SHARED_LOAD=1 + TEST_SHARED_LIB=$ + TEST_SHARED_OBJ=$) +endif() add_executable(test_fmtlib test_fmtlib.cpp) target_link_libraries(test_fmtlib PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) diff --git a/unittest/utils/test_platform.cpp b/unittest/utils/test_platform.cpp new file mode 100644 index 0000000000..0f39534c31 --- /dev/null +++ b/unittest/utils/test_platform.cpp @@ -0,0 +1,402 @@ + +#include "platform.h" +#include "utils.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include + +using namespace LAMMPS_NS; +using testing::EndsWith; +using testing::Eq; +using testing::IsEmpty; +using testing::StartsWith; +using testing::StrEq; + +TEST(Platform, clock) +{ + const double wt_start = platform::walltime(); + const double ct_start = platform::cputime(); + + // spend some time computing pi + constexpr double known_pi = 3.141592653589793238462643; + constexpr int n = 10000000; + constexpr double h = 1.0 / (double)n; + double my_pi = 0.0, x; + for (int i = 0; i < n; ++i) { + x = h * ((double)i + 0.5); + my_pi += 4.0 / (1.0 + x * x); + } + my_pi *= h; + const double wt_used = platform::walltime() - wt_start; + const double ct_used = platform::cputime() - ct_start; + + ASSERT_NEAR(my_pi, known_pi, 1e-12); + ASSERT_GT(wt_used, 1e-4); + ASSERT_GT(ct_used, 1e-4); +} + +TEST(Platform, putenv) +{ + const char *var = getenv("UNITTEST_VAR1"); + ASSERT_EQ(var, nullptr); + int rv = platform::putenv("UNITTEST_VAR1"); + var = getenv("UNITTEST_VAR1"); + ASSERT_EQ(rv, 0); + ASSERT_NE(var, nullptr); + // we cannot set environment variables without a value on windows with _putenv() +#if defined(_WIN32) + ASSERT_THAT(var, StrEq("1")); +#else + ASSERT_THAT(var, StrEq("")); +#endif + + rv = platform::putenv("UNITTEST_VAR1=one"); + var = getenv("UNITTEST_VAR1"); + ASSERT_EQ(rv, 0); + ASSERT_NE(var, nullptr); + ASSERT_THAT(var, StrEq("one")); + + rv = platform::putenv("UNITTEST_VAR1=one=two"); + var = getenv("UNITTEST_VAR1"); + ASSERT_EQ(rv, 0); + ASSERT_NE(var, nullptr); + ASSERT_THAT(var, StrEq("one=two")); + + ASSERT_EQ(platform::putenv(""), -1); +} + +TEST(Platform, list_pathenv) +{ + auto dirs = platform::list_pathenv("PATH"); + ASSERT_GT(dirs.size(), 1); +} + +TEST(Platform, find_cmd_path) +{ +#if defined(_WIN32) + ASSERT_THAT(platform::find_exe_path("notepad"), EndsWith("\\notepad.exe")); + ASSERT_THAT(platform::find_exe_path("cmd"), EndsWith("\\cmd.exe")); + ASSERT_THAT(platform::find_exe_path("some_bogus_command"), IsEmpty()); +#else + ASSERT_THAT(platform::find_exe_path("ls"), EndsWith("bin/ls")); + ASSERT_THAT(platform::find_exe_path("sh"), EndsWith("bin/sh")); + ASSERT_THAT(platform::find_exe_path("some_bogus_command"), IsEmpty()); +#endif +} + +#if defined(TEST_SHARED_LOAD) +#define stringify(s) mkstring(s) +#define mkstring(s) #s +TEST(Platform, sharedload) +{ + const std::vector objs = {stringify(TEST_SHARED_OBJ), stringify(TEST_SHARED_LIB)}; + const int *intvar; + const double *doublevar; + void *handle; + int (*intfunc)(int); + double (*doublefunc)(double, int); + + for (const auto &obj : objs) { + handle = platform::dlopen(obj.c_str()); + EXPECT_NE(handle, nullptr); + intvar = (int *)platform::dlsym(handle, "some_int_val"); + EXPECT_NE(intvar, nullptr); + EXPECT_EQ(*intvar, 12345); + doublevar = (double *)platform::dlsym(handle, "some_double_val"); + EXPECT_NE(doublevar, nullptr); + EXPECT_DOUBLE_EQ(*doublevar, 6.78e-9); + intfunc = (int (*)(int))platform::dlsym(handle, "some_int_function"); + EXPECT_NE(intfunc, nullptr); + EXPECT_EQ((*intfunc)(12), 144); + doublefunc = (double (*)(double, int))platform::dlsym(handle, "some_double_function"); + EXPECT_NE(doublefunc, nullptr); + EXPECT_DOUBLE_EQ((*doublefunc)(0.5, 6), 3.0); + EXPECT_EQ(platform::dlsym(handle, "some_nonexisting_symbol"), nullptr); + EXPECT_EQ(platform::dlclose(handle), 0); + } +} +#undef stringify +#undef mkstring +#endif + +TEST(Platform, guesspath) +{ + char buf[256]; + FILE *fp = fopen("test_guesspath.txt", "w"); +#if defined(__linux__) || defined(__APPLE__) || defined(_WIN32) + const char *path = platform::guesspath(fp, buf, sizeof(buf)); + ASSERT_THAT(path, EndsWith("test_guesspath.txt")); +#else + const char *path = platform::guesspath(fp, buf, sizeof(buf)); + ASSERT_THAT(path, EndsWith("(unknown)")); +#endif + fclose(fp); + platform::unlink("test_guesspath.txt"); +} + +TEST(Platform, unlink) +{ + const char test[] = "12345678901234567890"; + platform::unlink("unlink.dat"); + ASSERT_EQ(platform::unlink("dummy.dat"), -1); + FILE *fp = fopen("unlink.dat", "w"); + fwrite(test, sizeof(test), 1, fp); + fclose(fp); + ASSERT_EQ(platform::unlink("unlink.dat"), 0); + ASSERT_EQ(platform::unlink("unlink.dat"), -1); + fp = fopen("unlink.dat", "r"); + ASSERT_EQ(fp, nullptr); + + platform::mkdir("unlink.dir"); + ASSERT_EQ(platform::unlink("unlink.dir"), -1); + platform::rmdir("unlink.dir"); +} + +TEST(Platform, fseek_ftell) +{ + const char test[] = "12345678901234567890"; + platform::unlink("seek_tell.dat"); + FILE *fp = fopen("seek_tell.dat", "w"); + fwrite(test, sizeof(test), 1, fp); + fflush(fp); + ASSERT_EQ(platform::ftell(fp), sizeof(test)); + fclose(fp); + fp = fopen("seek_tell.dat", "r+"); + ASSERT_EQ(fgetc(fp), '1'); + ASSERT_EQ(fgetc(fp), '2'); + ASSERT_EQ(platform::ftell(fp), 2); + ASSERT_EQ(platform::fseek(fp, 15), 0); + ASSERT_EQ(fgetc(fp), '6'); + fflush(fp); + ASSERT_EQ(platform::fseek(fp, platform::END_OF_FILE), 0); + ASSERT_EQ(platform::ftell(fp), 21); + ASSERT_EQ(platform::fseek(fp, 20), 0); + ASSERT_EQ(fgetc(fp), 0); + ASSERT_EQ(platform::ftell(fp), 21); + fclose(fp); + platform::unlink("seek_tell.dat"); +} + +TEST(Platform, ftruncate) +{ + platform::unlink("truncate.dat"); + FILE *fp = fopen("truncate.dat", "w"); + fputs("header one\n", fp); + fputs("header two\n", fp); + fflush(fp); + bigint filepos = platform::ftell(fp); + fputs("line one\n", fp); + fputs("line two\n", fp); + fputs("line three\n", fp); + fflush(fp); + ASSERT_EQ(platform::ftruncate(fp, filepos), 0); + fputs("line four\n", fp); + ASSERT_GT(platform::ftell(fp), filepos); + fputs("line five\n", fp); + fflush(fp); + fclose(fp); + + // check file + fp = fopen("truncate.dat", "r"); + char buf[128]; + char *ptr = fgets(buf, 127, fp); + ASSERT_THAT(ptr, StartsWith("header one")); + ptr = fgets(buf, 127, fp); + ASSERT_THAT(ptr, StartsWith("header two")); + ptr = fgets(buf, 127, fp); + ASSERT_THAT(ptr, StartsWith("line four")); + ptr = fgets(buf, 127, fp); + ASSERT_THAT(ptr, StartsWith("line five")); + ptr = fgets(buf, 127, fp); + ASSERT_EQ(ptr, nullptr); + fclose(fp); + platform::unlink("truncate.dat"); +} + +TEST(Platform, path_basename) +{ +#if defined(_WIN32) + ASSERT_THAT(platform::path_basename("c:\\parent\\folder\\filename"), Eq("filename")); + ASSERT_THAT(platform::path_basename("folder\\"), Eq("")); + ASSERT_THAT(platform::path_basename("c:/parent/folder/filename"), Eq("filename")); +#else + ASSERT_THAT(platform::path_basename("/parent/folder/filename"), Eq("filename")); + ASSERT_THAT(platform::path_basename("/parent/folder/"), Eq("")); +#endif +} + +TEST(Platform, path_dirname) +{ +#if defined(_WIN32) + ASSERT_THAT(platform::path_dirname("c:/parent/folder/filename"), Eq("c:/parent/folder")); + ASSERT_THAT(platform::path_dirname("c:\\parent\\folder\\filename"), Eq("c:\\parent\\folder")); + ASSERT_THAT(platform::path_dirname("c:filename"), Eq(".")); +#else + ASSERT_THAT(platform::path_dirname("/parent/folder/filename"), Eq("/parent/folder")); +#endif + ASSERT_THAT(platform::path_dirname("filename"), Eq(".")); +} + +TEST(Platform, path_join) +{ +#if defined(_WIN32) + ASSERT_THAT(platform::path_join("c:\\folder", "filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder\\", "filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder", "\\filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder\\", "\\filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder", "/filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder\\\\", "\\filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder\\", "\\\\filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder/\\", "/\\filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder\\/", "\\/filename"), Eq("c:\\folder\\filename")); + ASSERT_THAT(platform::path_join("c:\\folder", ""), Eq("c:\\folder")); + ASSERT_THAT(platform::path_join("", "\\/filename"), Eq("\\/filename")); +#else + ASSERT_THAT(platform::path_join("/parent/folder", "filename"), Eq("/parent/folder/filename")); + ASSERT_THAT(platform::path_join("/parent/folder/", "filename"), Eq("/parent/folder/filename")); + ASSERT_THAT(platform::path_join("/parent/folder", "/filename"), Eq("/parent/folder/filename")); + ASSERT_THAT(platform::path_join("/parent/folder/", "/filename"), Eq("/parent/folder/filename")); + ASSERT_THAT(platform::path_join("/parent/folder//", "filename"), Eq("/parent/folder/filename")); + ASSERT_THAT(platform::path_join("/parent/folder", "//filename"), Eq("/parent/folder/filename")); + ASSERT_THAT(platform::path_join("/parent/folder///", "/filename"), + Eq("/parent/folder/filename")); + ASSERT_THAT(platform::path_join("/parent/folder/", "///filename"), + Eq("/parent/folder/filename")); + ASSERT_THAT(platform::path_join("/parent/folder/", ""), Eq("/parent/folder/")); + ASSERT_THAT(platform::path_join("", "\\/filename"), Eq("\\/filename")); +#endif +} + +TEST(Platform, is_console) +{ + platform::unlink("file_is_no_console.txt"); + FILE *fp = fopen("file_is_no_console.txt", "w"); + fputs("some text\n", fp); + EXPECT_FALSE(platform::is_console(fp)); + fclose(fp); + platform::unlink("file_is_no_console.txt"); +} + +TEST(Platform, path_and_directory) +{ + platform::unlink("path_is_directory"); + platform::rmdir("path_is_directory"); + platform::unlink("path_is_file"); + platform::mkdir("path_is_directory"); + FILE *fp = fopen("path_is_file", "w"); + fputs("some text\n", fp); + fclose(fp); + + ASSERT_TRUE(platform::path_is_directory("path_is_directory")); + ASSERT_FALSE(platform::path_is_directory("path_is_file")); + ASSERT_FALSE(platform::path_is_directory("path_does_not_exist")); + platform::unlink("path_is_file"); + +#if defined(_WIN32) + fp = fopen("path_is_directory\\path_is_file", "w"); +#else + fp = fopen("path_is_directory/path_is_file", "w"); +#endif + fputs("some text\n", fp); + fclose(fp); +#if defined(_WIN32) + platform::mkdir("path_is_directory\\path_is_directory"); + fp = fopen("path_is_directory\\path_is_other_file", "w"); +#else + platform::mkdir("path_is_directory/path_is_directory"); + fp = fopen("path_is_directory/path_is_other_file", "w"); +#endif + fputs("some text\n", fp); + fclose(fp); + auto dirs = platform::list_directory("path_is_directory"); + ASSERT_EQ(dirs.size(), 3); + platform::rmdir("path_is_directory"); + ASSERT_FALSE(platform::path_is_directory("path_is_directory")); +} + +TEST(Platform, get_change_directory) +{ + platform::unlink("working_directory"); + platform::rmdir("working_directory"); + + auto cwd = platform::current_directory(); + ASSERT_GT(cwd.size(), 0); + + platform::mkdir("working_directory"); + ASSERT_EQ(platform::chdir("working_directory"), 0); + ASSERT_THAT(platform::current_directory(), EndsWith("working_directory")); + + ASSERT_EQ(platform::chdir(".."), 0); + ASSERT_THAT(platform::current_directory(), StrEq(cwd)); + platform::rmdir("working_directory"); +} + +TEST(Platform, file_is_readable) +{ + platform::unlink("file_is_readable.txt"); + FILE *fp = fopen("file_is_readable.txt", "w"); + fputs("some text\n", fp); + fclose(fp); + + ASSERT_TRUE(platform::file_is_readable("file_is_readable.txt")); + ASSERT_FALSE(platform::file_is_readable("file_does_not_exist.txt")); + platform::unlink("file_is_readable.txt"); + + // windows does not have permission flags +#if !defined(_WIN32) + platform::unlink("file_is_not_readable.txt"); + fp = fopen("file_is_not_readable.txt", "w"); + fputs("some text\n", fp); + fclose(fp); + chmod("file_is_not_readable.txt", 0); + ASSERT_FALSE(platform::file_is_readable("file_is_not_readable.txt")); + platform::unlink("file_is_not_readable.txt"); +#endif +} + +TEST(Platform, has_compress_extension) +{ + ASSERT_FALSE(platform::has_compress_extension("dummy")); + ASSERT_FALSE(platform::has_compress_extension("dum.my")); + ASSERT_TRUE(platform::has_compress_extension("dummy.gz")); + ASSERT_TRUE(platform::has_compress_extension("dummy.bz2")); + ASSERT_TRUE(platform::has_compress_extension("dummy.zst")); + ASSERT_TRUE(platform::has_compress_extension("dummy.xz")); + ASSERT_TRUE(platform::has_compress_extension("dummy.lzma")); + ASSERT_TRUE(platform::has_compress_extension("dummy.lz4")); +} + +TEST(Platform, compress_read_write) +{ + const std::vector test_files = {"zip_test.zip", "zip_test.gz", "zip_test.bz2", + "zip_test.zst", "zip_test.xz", "zip_test.lzma", + "zip_test.lz4", "zip_test.unk", "zip test.gz"}; + for (const auto &file : test_files) { + platform::unlink(file); + FILE *fp = platform::compressed_write(file); + if (!fp) { + platform::unlink(file); + continue; + } + + clearerr(fp); + fputs("line one\n", fp); + fputs("line two\n", fp); + ASSERT_EQ(ferror(fp), 0); + fflush(fp); + platform::pclose(fp); + + fp = platform::compressed_read(file); + ASSERT_NE(fp, nullptr); + char buf[128]; + char *ptr = fgets(buf, 128, fp); + EXPECT_THAT(ptr, StartsWith("line one")); + ptr = fgets(buf, 128, fp); + EXPECT_THAT(ptr, StartsWith("line two")); + ASSERT_EQ(ferror(fp), 0); + platform::pclose(fp); + platform::unlink(file); + } +} diff --git a/unittest/utils/test_utils.cpp b/unittest/utils/test_utils.cpp index e0bc4984cc..72a90a95a0 100644 --- a/unittest/utils/test_utils.cpp +++ b/unittest/utils/test_utils.cpp @@ -13,14 +13,12 @@ #include "lmptype.h" #include "pointers.h" -#include "utils.h" #include "tokenizer.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include -#include #include #include @@ -66,6 +64,14 @@ TEST(Utils, trim) ASSERT_THAT(trimmed, StrEq("")); } +TEST(Utils, casemod) +{ + ASSERT_THAT(utils::lowercase("Gba35%*zAKgRvr"), StrEq("gba35%*zakgrvr")); + ASSERT_THAT(utils::lowercase("A BC DEFG"), StrEq("a bc defg")); + ASSERT_THAT(utils::uppercase("Gba35%*zAKgRvr"), StrEq("GBA35%*ZAKGRVR")); + ASSERT_THAT(utils::uppercase("a bc defg"), StrEq("A BC DEFG")); +} + TEST(Utils, trim_comment) { auto trimmed = utils::trim_comment("some text # comment"); @@ -721,54 +727,6 @@ TEST(Utils, boundsbig_case3) ASSERT_EQ(nhi, -1); } -TEST(Utils, guesspath) -{ - char buf[256]; - FILE *fp = fopen("test_guesspath.txt", "w"); -#if defined(__linux__) || defined(__APPLE__) || defined(_WIN32) - const char *path = utils::guesspath(buf, sizeof(buf), fp); - ASSERT_THAT(path, EndsWith("test_guesspath.txt")); -#else - const char *path = utils::guesspath(buf, sizeof(buf), fp); - ASSERT_THAT(path, EndsWith("(unknown)")); -#endif - fclose(fp); -} - -TEST(Utils, path_join) -{ -#if defined(_WIN32) - ASSERT_THAT(utils::path_join("c:\\parent\\folder", "filename"), - Eq("c:\\parent\\folder\\filename")); -#else - ASSERT_THAT(utils::path_join("/parent/folder", "filename"), Eq("/parent/folder/filename")); -#endif -} - -TEST(Utils, path_basename) -{ -#if defined(_WIN32) - ASSERT_THAT(utils::path_basename("c:\\parent\\folder\\filename"), Eq("filename")); - ASSERT_THAT(utils::path_basename("folder\\"), Eq("")); - ASSERT_THAT(utils::path_basename("c:/parent/folder/filename"), Eq("filename")); -#else - ASSERT_THAT(utils::path_basename("/parent/folder/filename"), Eq("filename")); - ASSERT_THAT(utils::path_basename("/parent/folder/"), Eq("")); -#endif -} - -TEST(Utils, path_dirname) -{ -#if defined(_WIN32) - ASSERT_THAT(utils::path_dirname("c:/parent/folder/filename"), Eq("c:/parent/folder")); - ASSERT_THAT(utils::path_dirname("c:\\parent\\folder\\filename"), Eq("c:\\parent\\folder")); - ASSERT_THAT(utils::path_dirname("c:filename"), Eq(".")); -#else - ASSERT_THAT(utils::path_dirname("/parent/folder/filename"), Eq("/parent/folder")); -#endif - ASSERT_THAT(utils::path_dirname("filename"), Eq(".")); -} - TEST(Utils, getsyserror) { #if defined(__linux__) @@ -792,16 +750,16 @@ TEST(Utils, potential_file) fputs("# CONTRIBUTOR: Pippo\n", fp); fclose(fp); - ASSERT_TRUE(utils::file_is_readable("ctest1.txt")); - ASSERT_TRUE(utils::file_is_readable("ctest2.txt")); - ASSERT_FALSE(utils::file_is_readable("no_such_file.txt")); + ASSERT_TRUE(platform::file_is_readable("ctest1.txt")); + ASSERT_TRUE(platform::file_is_readable("ctest2.txt")); + ASSERT_FALSE(platform::file_is_readable("no_such_file.txt")); ASSERT_THAT(utils::get_potential_file_path("ctest1.txt"), Eq("ctest1.txt")); ASSERT_THAT(utils::get_potential_file_path("no_such_file.txt"), Eq("")); const char *folder = getenv("LAMMPS_POTENTIALS"); if (folder != nullptr) { - std::string path = utils::path_join(folder, "Cu_u3.eam"); + std::string path = platform::path_join(folder, "Cu_u3.eam"); EXPECT_THAT(utils::get_potential_file_path("Cu_u3.eam"), Eq(path)); EXPECT_THAT(utils::get_potential_units(path, "EAM"), Eq("metal")); } diff --git a/unittest/utils/testshared.c b/unittest/utils/testshared.c new file mode 100644 index 0000000000..869be91c2a --- /dev/null +++ b/unittest/utils/testshared.c @@ -0,0 +1,20 @@ +/* file for testing loading of shared objects and libraries */ + +int some_int_val = 12345; +double some_double_val = 6.78e-9; + +int some_int_function(int arg) +{ + return arg*arg; +} + +double some_double_function(double arg1, int arg2) +{ + double sum = 0; + for (int i = 0; i < arg2; ++i) + sum += arg1; + return sum; +} + + +