diff --git a/.github/ISSUE_TEMPLATE/help_request.md b/.github/ISSUE_TEMPLATE/help_request.md index 5e5b3ebffd..bde37650b2 100644 --- a/.github/ISSUE_TEMPLATE/help_request.md +++ b/.github/ISSUE_TEMPLATE/help_request.md @@ -1,6 +1,6 @@ --- name: Request for Help -about: "Don't post help requests here, email the lammps-users mailing list" +about: "Don't post help requests here, post in the LAMMPS forum" title: "" labels: invalid assignees: '' @@ -8,8 +8,9 @@ assignees: '' --- Please **do not** post requests for help (e.g. with installing or using LAMMPS) here. -Instead send an e-mail to the lammps-users mailing list. +Instead, you can post to the LAMMPS category in the Materials Science Community +Discourse forum at: https://matsci.org/lammps/ This issue tracker is for tracking LAMMPS development related issues only. -Thanks for your cooperation. +Thank you in advance for your cooperation. diff --git a/README b/README index bb0f335848..c25506e2c0 100644 --- a/README +++ b/README @@ -16,8 +16,8 @@ National Laboratories, a US Department of Energy facility, with funding from the DOE. It is an open-source code, distributed freely under the terms of the GNU Public License (GPL) version 2. -The primary author of the code is Steve Plimpton, who can be emailed -at sjplimp@sandia.gov. The LAMMPS WWW Site at www.lammps.org has +The code is maintained by the LAMMPS development team who can be emailed +at developers@lammps.org. The LAMMPS WWW Site at www.lammps.org has more information about the code and its uses. The LAMMPS distribution includes the following files and directories: diff --git a/SECURITY.md b/SECURITY.md index f06b781d11..7b0ed1f560 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -14,14 +14,14 @@ and tested by the LAMMPS developers, so it is easy to import bad behavior from calling functions in one of those libraries. Thus is is quite easy to crash LAMMPS through malicious input and do all -kinds of filesystem manipulations. And because of that LAMMPS should +kinds of file system manipulations. And because of that LAMMPS should **NEVER** be compiled or **run** as superuser, either from a "root" or "administrator" account directly or indirectly via "sudo" or "su". Therefore what could be seen as a security vulnerability is usually -either a user mistake or a bug in the code. Bugs can be reported in -the LAMMPS project -[issue tracker on GitHub](https://github.com/lammps/lammps/issues). +either a user mistake or a bug in the code. Bugs can be reported in the +LAMMPS project [issue tracker on +GitHub](https://github.com/lammps/lammps/issues). To mitigate issues with using homoglyphs or bidirectional reordering in unicode, which have been demonstrated as a vector to obfuscate and hide @@ -30,10 +30,18 @@ for unicode characters and only all-ASCII source code is accepted. # Version Updates -LAMMPS follows continuous release development model. We aim to keep all -release versions (stable or patch) fully functional and employ a variety -of automatic testing procedures to detect failures of existing -functionality from adding new features before releases are made. Thus -bugfixes and updates are only integrated into the current development -branch and thus the next (patch) release and users are recommended to -update regularly. +LAMMPS follows continuous release development model. We aim to keep to +keep the development version (develop branch) always fully functional +and employ a variety of automatic testing procedures to detect failures +of existing functionality from adding or modifying features. Most of +those tests are run on pull requests *before* merging to the development +branch. The develop branch is protected, so all changes *must* be +submitted as a pull request and thus cannot avoid the automated tests. + +Additional tests are run *after* merging. Before releases are made +*all* tests must have cleared. Then a release tag is applied and the +release branch fast-forwarded to that tag. Bug fixes and updates are +applied to the current development branch and thus will be available in +the next (patch) release. For stable releases, selected bug fixes are +back-ported and occasionally published as update releases. There are +only updates to the latest stable release. diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 25356e41f6..d5ce4c5895 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -7,11 +7,20 @@ cmake_minimum_required(VERSION 3.10) if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() +# set policy to silence warnings about ignoring ${CMAKE_REQUIRED_LIBRARIES} but use it +if(POLICY CMP0075) + cmake_policy(SET CMP0075 NEW) +endif() # set policy to silence warnings about missing executable permissions in # pythonx.y-config when cross-compiling. review occasionally if it may be set to NEW if(POLICY CMP0109) cmake_policy(SET CMP0109 OLD) endif() +# set policy to silence warnings about timestamps of downloaded files. review occasionally if it may be set to NEW +if(POLICY CMP0135) + cmake_policy(SET CMP0135 OLD) +endif() + ######################################## project(lammps CXX) @@ -100,7 +109,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") 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") + set(CMAKE_TUNE_DEFAULT "-xHost -fp-model fast=2 -no-prec-div -qoverride-limits -diag-disable=10441 -diag-disable=2196") endif() endif() endif() @@ -381,9 +390,9 @@ pkg_depends(EXTRA-MOLECULE MOLECULE) # detect if we may enable OpenMP support by default set(BUILD_OMP_DEFAULT OFF) -find_package(OpenMP QUIET) -if(OpenMP_FOUND) - check_include_file_cxx(omp.h HAVE_OMP_H_INCLUDE) +find_package(OpenMP COMPONENTS CXX QUIET) +if(OpenMP_CXX_FOUND) + check_omp_h_include() if(HAVE_OMP_H_INCLUDE) set(BUILD_OMP_DEFAULT ON) endif() @@ -392,8 +401,8 @@ endif() option(BUILD_OMP "Build with OpenMP support" ${BUILD_OMP_DEFAULT}) if(BUILD_OMP) - find_package(OpenMP REQUIRED) - check_include_file_cxx(omp.h HAVE_OMP_H_INCLUDE) + find_package(OpenMP COMPONENTS CXX REQUIRED) + check_omp_h_include() if(NOT HAVE_OMP_H_INCLUDE) message(FATAL_ERROR "Cannot find the 'omp.h' header file required for full OpenMP support") endif() @@ -727,18 +736,17 @@ list(FIND LANGUAGES "Fortran" _index) if(_index GREATER -1) target_link_libraries(lammps PRIVATE ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) endif() -set(LAMMPS_CXX_HEADERS angle.h atom.h bond.h citeme.h comm.h compute.h dihedral.h domain.h error.h fix.h force.h group.h improper.h - input.h info.h kspace.h lammps.h lattice.h library.h lmppython.h lmptype.h memory.h modify.h neighbor.h neigh_list.h output.h - pair.h pointers.h region.h timer.h universe.h update.h utils.h variable.h) -if(LAMMPS_EXCEPTIONS) - list(APPEND LAMMPS_CXX_HEADERS exceptions.h) -endif() +set(LAMMPS_CXX_HEADERS angle.h atom.h bond.h citeme.h comm.h command.h compute.h dihedral.h domain.h + error.h exceptions.h fix.h force.h group.h improper.h input.h info.h kspace.h lammps.h lattice.h + library.h lmppython.h lmptype.h memory.h modify.h neighbor.h neigh_list.h output.h pair.h + platform.h pointers.h region.h timer.h universe.h update.h utils.h variable.h) +set(LAMMPS_FMT_HEADERS core.h format.h) set_target_properties(lammps PROPERTIES OUTPUT_NAME lammps${LAMMPS_MACHINE}) set_target_properties(lammps PROPERTIES SOVERSION ${SOVERSION}) set_target_properties(lammps PROPERTIES PREFIX "lib") target_include_directories(lammps PUBLIC $) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps/fmt) foreach(_HEADER ${LAMMPS_CXX_HEADERS}) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps/${_HEADER} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAMMPS_SOURCE_DIR}/${_HEADER} ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps/${_HEADER} DEPENDS ${LAMMPS_SOURCE_DIR}/${_HEADER}) add_custom_target(${_HEADER} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps/${_HEADER}) @@ -747,6 +755,14 @@ foreach(_HEADER ${LAMMPS_CXX_HEADERS}) install(FILES ${LAMMPS_SOURCE_DIR}/${_HEADER} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/lammps) endif() endforeach() +foreach(_HEADER ${LAMMPS_FMT_HEADERS}) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps/fmt/${_HEADER} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAMMPS_SOURCE_DIR}/fmt/${_HEADER} ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps/fmt/${_HEADER} DEPENDS ${LAMMPS_SOURCE_DIR}/fmt/${_HEADER}) + add_custom_target(fmt_${_HEADER} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/includes/lammps/fmt/${_HEADER}) + add_dependencies(lammps fmt_${_HEADER}) + if(BUILD_SHARED_LIBS) + install(FILES ${LAMMPS_SOURCE_DIR}/fmt/${_HEADER} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/lammps/fmt) + endif() +endforeach() target_include_directories(lammps INTERFACE $) add_library(LAMMPS::lammps ALIAS lammps) get_target_property(LAMMPS_DEFINES lammps INTERFACE_COMPILE_DEFINITIONS) @@ -854,8 +870,11 @@ if(BUILD_SHARED_LIBS OR PKG_PYTHON) find_package(Python COMPONENTS Interpreter) endif() if(Python_EXECUTABLE) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/python) - install(CODE "execute_process(COMMAND ${Python_EXECUTABLE} setup.py build -b ${CMAKE_BINARY_DIR}/python install --prefix=${CMAKE_INSTALL_PREFIX} --root=\$ENV{DESTDIR}/ WORKING_DIRECTORY ${LAMMPS_PYTHON_DIR})") + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/python/lib) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/python/src) + file(COPY ${LAMMPS_SOURCE_DIR}/version.h DESTINATION ${CMAKE_BINARY_DIR}/python/src) + file(COPY ${LAMMPS_PYTHON_DIR}/README ${LAMMPS_PYTHON_DIR}/pyproject.toml ${LAMMPS_PYTHON_DIR}/setup.py ${LAMMPS_PYTHON_DIR}/lammps DESTINATION ${CMAKE_BINARY_DIR}/python/lib) + install(CODE "if(\"\$ENV{DESTDIR}\" STREQUAL \"\")\n execute_process(COMMAND ${Python_EXECUTABLE} -m pip install -v ${CMAKE_BINARY_DIR}/python/lib --prefix=${CMAKE_INSTALL_PREFIX})\n else()\n execute_process(COMMAND ${Python_EXECUTABLE} -m pip install -v ${CMAKE_BINARY_DIR}/python/lib --prefix=${CMAKE_INSTALL_PREFIX} --root=\$ENV{DESTDIR})\n endif()") endif() endif() @@ -966,9 +985,6 @@ if(PKG_GPU) endif() message(STATUS "GPU precision: ${GPU_PREC}") endif() -if(PKG_KOKKOS) - message(STATUS "Kokkos Arch: ${KOKKOS_ARCH}") -endif() if(PKG_KSPACE) message(STATUS "<<< FFT settings >>> -- Primary FFT lib: ${FFT}") diff --git a/cmake/Modules/FindClangFormat.cmake b/cmake/Modules/FindClangFormat.cmake index 48393f0614..80c3b0d0ae 100644 --- a/cmake/Modules/FindClangFormat.cmake +++ b/cmake/Modules/FindClangFormat.cmake @@ -1,5 +1,10 @@ # Find clang-format find_program(ClangFormat_EXECUTABLE NAMES clang-format + clang-format-15.0 + clang-format-14.0 + clang-format-13.0 + clang-format-12.0 + clang-format-11.0 clang-format-10.0 clang-format-9.0 clang-format-8.0 @@ -14,19 +19,27 @@ if(ClangFormat_EXECUTABLE) OUTPUT_VARIABLE clang_format_version ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) - - if(clang_format_version MATCHES "^clang-format version .*") - # Arch Linux + if(clang_format_version MATCHES "^(Ubuntu |)clang-format version .*") + # Arch Linux output: # clang-format version 10.0.0 - - # Ubuntu 18.04 LTS Output + # + # Ubuntu 18.04 LTS output: # clang-format version 6.0.0-1ubuntu2 (tags/RELEASE_600/final) - string(REGEX REPLACE "clang-format version ([0-9.]+).*" - "\\1" + # + # Ubuntu 20.04 LTS output: + # clang-format version 10.0.0-4ubuntu1 + # + # Ubuntu 22.04 LTS output: + # Ubuntu clang-format version 14.0.0-1ubuntu1 + # + # Fedora 36 output: + # clang-format version 14.0.5 (Fedora 14.0.5-1.fc36) + string(REGEX REPLACE "^(Ubuntu |)clang-format version ([0-9.]+).*" + "\\2" ClangFormat_VERSION "${clang_format_version}") elseif(clang_format_version MATCHES ".*LLVM version .*") - # CentOS 7 Output + # CentOS 7 output: # LLVM (http://llvm.org/): # LLVM version 3.4.2 # Optimized build. diff --git a/cmake/Modules/FindCythonize.cmake b/cmake/Modules/FindCythonize.cmake index 2a4cc753e8..97f0304279 100644 --- a/cmake/Modules/FindCythonize.cmake +++ b/cmake/Modules/FindCythonize.cmake @@ -22,7 +22,7 @@ endif() if(Python_EXECUTABLE) get_filename_component(_python_path ${Python_EXECUTABLE} PATH) find_program(Cythonize_EXECUTABLE - NAMES cythonize3 cythonize cythonize.bat + NAMES cythonize-${Python_VERSION_MAJOR}.${Python_VERSION_MINOR} cythonize3 cythonize cythonize.bat HINTS ${_python_path}) endif() diff --git a/cmake/Modules/LAMMPSUtils.cmake b/cmake/Modules/LAMMPSUtils.cmake index 9b75209e16..561f2168e2 100644 --- a/cmake/Modules/LAMMPSUtils.cmake +++ b/cmake/Modules/LAMMPSUtils.cmake @@ -24,6 +24,21 @@ function(validate_option name values) endif() endfunction(validate_option) +# helper function to check for usable omp.h header +function(check_omp_h_include) + find_package(OpenMP COMPONENTS CXX QUIET) + if(OpenMP_CXX_FOUND) + set(CMAKE_REQUIRED_FLAGS ${OpenMP_CXX_FLAGS}) + set(CMAKE_REQUIRED_INCLUDES ${OpenMP_CXX_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_LINK_OPTIONS ${OpenMP_CXX_FLAGS}) + set(CMAKE_REQUIRED_LIBRARIES ${OpenMP_CXX_LIBRARIES}) + check_include_file_cxx(omp.h _have_omp_h) + else() + set(_have_omp_h FALSE) + endif() + set(HAVE_OMP_H_INCLUDE ${_have_omp_h} PARENT_SCOPE) +endfunction() + # helper function for getting the most recently modified file or folder from a glob pattern function(get_newest_file path variable) file(GLOB _dirs ${path}) diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index 7f23a6f777..c3852abf7c 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -15,8 +15,9 @@ if(Kokkos_ENABLE_OPENMP) if(NOT BUILD_OMP) message(FATAL_ERROR "Must enable BUILD_OMP with Kokkos_ENABLE_OPENMP") else() - if(LAMMPS_OMP_COMPAT_LEVEL LESS 4) - message(FATAL_ERROR "Compiler must support OpenMP 4.0 or later with Kokkos_ENABLE_OPENMP") + # NVHPC does not seem to provide a detectable OpenMP version, but is far beyond version 3.1 + if((OpenMP_CXX_VERSION VERSION_LESS 3.1) AND NOT (CMAKE_CXX_COMPILER_ID STREQUAL "NVHPC")) + message(FATAL_ERROR "Compiler must support OpenMP 3.1 or later with Kokkos_ENABLE_OPENMP") endif() endif() endif() @@ -47,8 +48,8 @@ if(DOWNLOAD_KOKKOS) list(APPEND KOKKOS_LIB_BUILD_ARGS "-DCMAKE_CXX_EXTENSIONS=${CMAKE_CXX_EXTENSIONS}") list(APPEND KOKKOS_LIB_BUILD_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}") include(ExternalProject) - set(KOKKOS_URL "https://github.com/kokkos/kokkos/archive/3.6.01.tar.gz" CACHE STRING "URL for KOKKOS tarball") - set(KOKKOS_MD5 "0ec97fc0c356dd65bd2487defe81a7bf" CACHE STRING "MD5 checksum of KOKKOS tarball") + set(KOKKOS_URL "https://github.com/kokkos/kokkos/archive/3.7.00.tar.gz" CACHE STRING "URL for KOKKOS tarball") + set(KOKKOS_MD5 "84991eca9f066383abe119a5bc7a11c4" CACHE STRING "MD5 checksum of KOKKOS tarball") mark_as_advanced(KOKKOS_URL) mark_as_advanced(KOKKOS_MD5) ExternalProject_Add(kokkos_build @@ -72,7 +73,7 @@ if(DOWNLOAD_KOKKOS) add_dependencies(LAMMPS::KOKKOSCORE kokkos_build) add_dependencies(LAMMPS::KOKKOSCONTAINERS kokkos_build) elseif(EXTERNAL_KOKKOS) - find_package(Kokkos 3.6.01 REQUIRED CONFIG) + find_package(Kokkos 3.7.00 REQUIRED CONFIG) target_link_libraries(lammps PRIVATE Kokkos::kokkos) target_link_libraries(lmp PRIVATE Kokkos::kokkos) else() @@ -138,6 +139,12 @@ if(PKG_KSPACE) endif() endif() +if(PKG_ML-IAP) + list(APPEND KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/mliap_data_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/mliap_descriptor_so3_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/mliap_model_linear_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/mliap_so3_kokkos.cpp) +endif() if(PKG_PHONON) list(APPEND KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/dynamical_matrix_kokkos.cpp) diff --git a/cmake/Modules/Packages/MDI.cmake b/cmake/Modules/Packages/MDI.cmake index 8f7c87b684..c1e25347af 100644 --- a/cmake/Modules/Packages/MDI.cmake +++ b/cmake/Modules/Packages/MDI.cmake @@ -8,8 +8,8 @@ option(DOWNLOAD_MDI "Download and compile the MDI library instead of using an al if(DOWNLOAD_MDI) message(STATUS "MDI download requested - we will build our own") - set(MDI_URL "https://github.com/MolSSI-MDI/MDI_Library/archive/v1.4.11.tar.gz" CACHE STRING "URL for MDI tarball") - set(MDI_MD5 "3791fe5081405c14aac07d4687f1cc58" CACHE STRING "MD5 checksum for MDI tarball") + set(MDI_URL "https://github.com/MolSSI-MDI/MDI_Library/archive/v1.4.12.tar.gz" CACHE STRING "URL for MDI tarball") + set(MDI_MD5 "7a222353ae8e03961d5365e6cd48baee" CACHE STRING "MD5 checksum for MDI tarball") mark_as_advanced(MDI_URL) mark_as_advanced(MDI_MD5) enable_language(C) @@ -49,6 +49,14 @@ if(DOWNLOAD_MDI) set(MDI_USE_PYTHON_PLUGINS ON) endif() endif() + # python plugins are not supported and thus must be always off on Windows + if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + unset(Python_Development_FOUND) + set(MDI_USE_PYTHON_PLUGINS OFF) + if(CMAKE_CROSSCOMPILING) + set(CMAKE_INSTALL_LIBDIR lib) + endif() + endif() # download/ build MDI library # always build static library with -fpic @@ -57,8 +65,9 @@ if(DOWNLOAD_MDI) ExternalProject_Add(mdi_build URL ${MDI_URL} URL_MD5 ${MDI_MD5} + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX= + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} @@ -70,23 +79,23 @@ if(DOWNLOAD_MDI) -Dplugins=ON -Dpython_plugins=${MDI_USE_PYTHON_PLUGINS} UPDATE_COMMAND "" - INSTALL_COMMAND "" - BUILD_BYPRODUCTS "/MDI_Library/libmdi.a" + INSTALL_COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext/src/mdi_build-build --target install + BUILD_BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext/${CMAKE_INSTALL_LIBDIR}/mdi/${CMAKE_STATIC_LIBRARY_PREFIX}mdi${CMAKE_STATIC_LIBRARY_SUFFIX}" ) # where is the compiled library? - ExternalProject_get_property(mdi_build BINARY_DIR) - set(MDI_BINARY_DIR "${BINARY_DIR}/MDI_Library") + ExternalProject_get_property(mdi_build PREFIX) # workaround for older CMake versions - file(MAKE_DIRECTORY ${MDI_BINARY_DIR}) + file(MAKE_DIRECTORY ${PREFIX}/${CMAKE_INSTALL_LIBDIR}/mdi) + file(MAKE_DIRECTORY ${PREFIX}/include/mdi) # create imported target for the MDI library add_library(LAMMPS::MDI UNKNOWN IMPORTED) add_dependencies(LAMMPS::MDI mdi_build) set_target_properties(LAMMPS::MDI PROPERTIES - IMPORTED_LOCATION "${MDI_BINARY_DIR}/libmdi.a" - INTERFACE_INCLUDE_DIRECTORIES ${MDI_BINARY_DIR} - ) + IMPORTED_LOCATION "${PREFIX}/${CMAKE_INSTALL_LIBDIR}/mdi/${CMAKE_STATIC_LIBRARY_PREFIX}mdi${CMAKE_STATIC_LIBRARY_SUFFIX}" + INTERFACE_INCLUDE_DIRECTORIES ${PREFIX}/include/mdi + ) set(MDI_DEP_LIBS "") # if compiling with python plugins we need diff --git a/cmake/Modules/Packages/ML-IAP.cmake b/cmake/Modules/Packages/ML-IAP.cmake index 63f91ba8d3..e2685c78dd 100644 --- a/cmake/Modules/Packages/ML-IAP.cmake +++ b/cmake/Modules/Packages/ML-IAP.cmake @@ -2,7 +2,13 @@ set(MLIAP_ENABLE_PYTHON_DEFAULT OFF) if(PKG_PYTHON) find_package(Cythonize QUIET) - if(Cythonize_FOUND) + if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.14) + find_package(Python COMPONENTS NumPy QUIET) + else() + # assume we have NumPy + set(Python_NumPy_FOUND ON) + endif() + if(Cythonize_FOUND AND Python_NumPy_FOUND) set(MLIAP_ENABLE_PYTHON_DEFAULT ON) endif() endif() @@ -11,6 +17,9 @@ option(MLIAP_ENABLE_PYTHON "Build ML-IAP package with Python support" ${MLIAP_EN if(MLIAP_ENABLE_PYTHON) find_package(Cythonize REQUIRED) + if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.14) + find_package(Python COMPONENTS NumPy REQUIRED) + endif() if(NOT PKG_PYTHON) message(FATAL_ERROR "Must enable PYTHON package for including Python support in ML-IAP") endif() @@ -25,16 +34,18 @@ if(MLIAP_ENABLE_PYTHON) endif() set(MLIAP_BINARY_DIR ${CMAKE_BINARY_DIR}/cython) - set(MLIAP_CYTHON_SRC ${LAMMPS_SOURCE_DIR}/ML-IAP/mliap_model_python_couple.pyx) - get_filename_component(MLIAP_CYTHON_BASE ${MLIAP_CYTHON_SRC} NAME_WE) + file(GLOB MLIAP_CYTHON_SRC ${LAMMPS_SOURCE_DIR}/ML-IAP/*.pyx) file(MAKE_DIRECTORY ${MLIAP_BINARY_DIR}) - add_custom_command(OUTPUT ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.cpp ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.h - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MLIAP_CYTHON_SRC} ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.pyx - COMMAND ${Cythonize_EXECUTABLE} -3 ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.pyx - WORKING_DIRECTORY ${MLIAP_BINARY_DIR} - MAIN_DEPENDENCY ${MLIAP_CYTHON_SRC} - COMMENT "Generating C++ sources with cythonize...") + foreach(MLIAP_CYTHON_FILE ${MLIAP_CYTHON_SRC}) + get_filename_component(MLIAP_CYTHON_BASE ${MLIAP_CYTHON_FILE} NAME_WE) + add_custom_command(OUTPUT ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.cpp ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.h + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MLIAP_CYTHON_FILE} ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.pyx + COMMAND ${Cythonize_EXECUTABLE} -3 ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.pyx + WORKING_DIRECTORY ${MLIAP_BINARY_DIR} + MAIN_DEPENDENCY ${MLIAP_CYTHON_FILE} + COMMENT "Generating C++ sources with cythonize...") + target_sources(lammps PRIVATE ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.cpp) + endforeach() target_compile_definitions(lammps PRIVATE -DMLIAP_PYTHON) - target_sources(lammps PRIVATE ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.cpp) target_include_directories(lammps PRIVATE ${MLIAP_BINARY_DIR}) endif() diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index c553809ff1..0159f36c34 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,6 +1,6 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.10.25.fix2.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2022.10.15.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "32394d799bc282bb57696c78c456e64f" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "848ad6a6cc79fa82745927001fb1c9b5" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) @@ -15,23 +15,9 @@ execute_process( ) get_newest_file(${CMAKE_BINARY_DIR}/lammps-user-pace-* lib-pace) -# enforce building libyaml-cpp as static library and turn off optional features -set(YAML_BUILD_SHARED_LIBS OFF) -set(YAML_CPP_BUILD_CONTRIB OFF) -set(YAML_CPP_BUILD_TOOLS OFF) -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}) +add_subdirectory(${lib-pace} build-pace) set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE}) -target_include_directories(pace PUBLIC ${PACE_EVALUATOR_INCLUDE_DIR} ${YAML_CPP_INCLUDE_DIR}) - -target_link_libraries(pace PRIVATE yaml-cpp-pace) if(CMAKE_PROJECT_NAME STREQUAL "lammps") target_link_libraries(lammps PRIVATE pace) endif() diff --git a/cmake/Modules/Packages/ML-QUIP.cmake b/cmake/Modules/Packages/ML-QUIP.cmake index 56221accab..10e0f38b78 100644 --- a/cmake/Modules/Packages/ML-QUIP.cmake +++ b/cmake/Modules/Packages/ML-QUIP.cmake @@ -58,12 +58,12 @@ if(DOWNLOAD_QUIP) BUILD_COMMAND env QUIP_ARCH=lammps make libquip INSTALL_COMMAND "" BUILD_IN_SOURCE YES - BUILD_BYPRODUCTS /build/lammps/libquip.a + BUILD_BYPRODUCTS /build/lammps/${CMAKE_STATIC_LIBRARY_PREFIX}quip${CMAKE_STATIC_LIBRARY_SUFFIX} ) ExternalProject_get_property(quip_build SOURCE_DIR) add_library(LAMMPS::QUIP UNKNOWN IMPORTED) set_target_properties(LAMMPS::QUIP PROPERTIES - IMPORTED_LOCATION "${SOURCE_DIR}/build/lammps/libquip.a" + IMPORTED_LOCATION "${SOURCE_DIR}/build/lammps/${CMAKE_STATIC_LIBRARY_PREFIX}quip${CMAKE_STATIC_LIBRARY_SUFFIX}" INTERFACE_LINK_LIBRARIES "${LAPACK_LIBRARIES}") target_link_libraries(lammps PRIVATE LAMMPS::QUIP) add_dependencies(LAMMPS::QUIP quip_build) diff --git a/cmake/Modules/Packages/PLUMED.cmake b/cmake/Modules/Packages/PLUMED.cmake index 1b660a2cc8..e0e4ff0dde 100644 --- a/cmake/Modules/Packages/PLUMED.cmake +++ b/cmake/Modules/Packages/PLUMED.cmake @@ -47,15 +47,15 @@ if(DOWNLOAD_PLUMED) endif() message(STATUS "PLUMED download requested - we will build our own") if(PLUMED_MODE STREQUAL "STATIC") - set(PLUMED_BUILD_BYPRODUCTS "/lib/libplumed.a") + set(PLUMED_BUILD_BYPRODUCTS "/lib/${CMAKE_STATIC_LIBRARY_PREFIX}plumed${CMAKE_STATIC_LIBRARY_SUFFIX}") elseif(PLUMED_MODE STREQUAL "SHARED") - set(PLUMED_BUILD_BYPRODUCTS "/lib/libplumed${CMAKE_SHARED_LIBRARY_SUFFIX};/lib/libplumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set(PLUMED_BUILD_BYPRODUCTS "/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumed${CMAKE_SHARED_LIBRARY_SUFFIX};/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") elseif(PLUMED_MODE STREQUAL "RUNTIME") - set(PLUMED_BUILD_BYPRODUCTS "/lib/libplumedWrapper.a") + set(PLUMED_BUILD_BYPRODUCTS "/lib/${CMAKE_STATIC_LIBRARY_PREFIX}plumedWrapper${CMAKE_STATIC_LIBRARY_PREFIX}") endif() - set(PLUMED_URL "https://github.com/plumed/plumed2/releases/download/v2.7.4/plumed-src-2.7.4.tgz" CACHE STRING "URL for PLUMED tarball") - set(PLUMED_MD5 "858e0b6aed173748fc85b6bc8a9dcb3e" CACHE STRING "MD5 checksum of PLUMED tarball") + set(PLUMED_URL "https://github.com/plumed/plumed2/releases/download/v2.8.1/plumed-src-2.8.1.tgz" CACHE STRING "URL for PLUMED tarball") + set(PLUMED_MD5 "6bfe72ebdae63dc38a9ca27d9b0e08f8" CACHE STRING "MD5 checksum of PLUMED tarball") mark_as_advanced(PLUMED_URL) mark_as_advanced(PLUMED_MD5) @@ -78,12 +78,12 @@ if(DOWNLOAD_PLUMED) add_library(LAMMPS::PLUMED UNKNOWN IMPORTED) add_dependencies(LAMMPS::PLUMED plumed_build) if(PLUMED_MODE STREQUAL "STATIC") - set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/libplumed.a INTERFACE_LINK_LIBRARIES "${PLUMED_LINK_LIBS};${CMAKE_DL_LIBS}") + set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}plumed${CMAKE_STATIC_LIBRARY_SUFFIX} INTERFACE_LINK_LIBRARIES "${PLUMED_LINK_LIBS};${CMAKE_DL_LIBS}") elseif(PLUMED_MODE STREQUAL "SHARED") - set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/libplumed${CMAKE_SHARED_LIBRARY_SUFFIX} INTERFACE_LINK_LIBRARIES "${INSTALL_DIR}/lib/libplumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX};${CMAKE_DL_LIBS}") + set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumed${CMAKE_SHARED_LIBRARY_SUFFIX} INTERFACE_LINK_LIBRARIES "${INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX};${CMAKE_DL_LIBS}") elseif(PLUMED_MODE STREQUAL "RUNTIME") - set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_COMPILE_DEFINITIONS "__PLUMED_DEFAULT_KERNEL=${INSTALL_DIR}/lib/libplumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") - set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/libplumedWrapper.a INTERFACE_LINK_LIBRARIES "${CMAKE_DL_LIBS}") + set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_COMPILE_DEFINITIONS "__PLUMED_DEFAULT_KERNEL=${INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}plumedWrapper${CMAKE_STATIC_LIBRARY_SUFFIX} INTERFACE_LINK_LIBRARIES "${CMAKE_DL_LIBS}") endif() set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include) file(MAKE_DIRECTORY ${INSTALL_DIR}/include) @@ -96,7 +96,7 @@ else() elseif(PLUMED_MODE STREQUAL "SHARED") include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.shared) elseif(PLUMED_MODE STREQUAL "RUNTIME") - set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_COMPILE_DEFINITIONS "__PLUMED_DEFAULT_KERNEL=${PLUMED_LIBDIR}/libplumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_COMPILE_DEFINITIONS "__PLUMED_DEFAULT_KERNEL=${PLUMED_LIBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}plumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.runtime) endif() set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_LINK_LIBRARIES "${PLUMED_LOAD}") diff --git a/cmake/Modules/Packages/VTK.cmake b/cmake/Modules/Packages/VTK.cmake index 8c4445167a..a0de1e0ff4 100644 --- a/cmake/Modules/Packages/VTK.cmake +++ b/cmake/Modules/Packages/VTK.cmake @@ -1,4 +1,9 @@ find_package(VTK REQUIRED NO_MODULE) -include(${VTK_USE_FILE}) target_compile_definitions(lammps PRIVATE -DLAMMPS_VTK) -target_link_libraries(lammps PRIVATE ${VTK_LIBRARIES}) +if (VTK_MAJOR_VERSION VERSION_LESS 9.0) + include(${VTK_USE_FILE}) + target_link_libraries(lammps PRIVATE ${VTK_LIBRARIES}) +else() + target_link_libraries(lammps PRIVATE VTK::CommonCore VTK::IOCore VTK::CommonDataModel VTK::IOXML VTK::IOLegacy VTK::IOParallelXML) + vtk_module_autoinit(TARGETS lammps MODULES VTK::CommonCore VTK::IOCore VTK::CommonDataModel VTK::IOXML VTK::IOLegacy VTK::IOParallelXML) +endif() diff --git a/cmake/presets/clang.cmake b/cmake/presets/clang.cmake index f1964f3e0f..fce451d803 100644 --- a/cmake/presets/clang.cmake +++ b/cmake/presets/clang.cmake @@ -28,10 +28,3 @@ set(MPI_CXX "clang++" CACHE STRING "" FORCE) set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE) unset(HAVE_OMP_H_INCLUDE CACHE) -set(OpenMP_C "clang" CACHE STRING "" FORCE) -set(OpenMP_C_FLAGS "-fopenmp" CACHE STRING "" FORCE) -set(OpenMP_C_LIB_NAMES "omp" CACHE STRING "" FORCE) -set(OpenMP_CXX "clang++" CACHE STRING "" FORCE) -set(OpenMP_CXX_FLAGS "-fopenmp" CACHE STRING "" FORCE) -set(OpenMP_CXX_LIB_NAMES "omp" CACHE STRING "" FORCE) -set(OpenMP_omp_LIBRARY "libomp.so" CACHE PATH "" FORCE) diff --git a/cmake/presets/gcc.cmake b/cmake/presets/gcc.cmake index cb626ea019..42cd30d149 100644 --- a/cmake/presets/gcc.cmake +++ b/cmake/presets/gcc.cmake @@ -19,11 +19,3 @@ set(CMAKE_Fortran_FLAGS_DEBUG "-Wall -Og -g -std=f2003" CACHE STRING "" FORCE) set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-g -O2 -DNDEBUG -std=f2003" CACHE STRING "" FORCE) set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -std=f2003" CACHE STRING "" FORCE) unset(HAVE_OMP_H_INCLUDE CACHE) - -set(OpenMP_C "gcc" CACHE STRING "" FORCE) -set(OpenMP_C_FLAGS "-fopenmp" CACHE STRING "" FORCE) -set(OpenMP_C_LIB_NAMES "gomp" CACHE STRING "" FORCE) -set(OpenMP_CXX "g++" CACHE STRING "" FORCE) -set(OpenMP_CXX_FLAGS "-fopenmp" CACHE STRING "" FORCE) -set(OpenMP_CXX_LIB_NAMES "gomp" CACHE STRING "" FORCE) -set(OpenMP_omp_LIBRARY "libgomp.so" CACHE PATH "" FORCE) diff --git a/cmake/presets/intel.cmake b/cmake/presets/intel.cmake index 9baf873608..d61ea20d78 100644 --- a/cmake/presets/intel.cmake +++ b/cmake/presets/intel.cmake @@ -1,4 +1,4 @@ -# preset that will enable Intel compilers with support for MPI and OpenMP (on Linux boxes) +# preset that will enable the classic Intel compilers with support for MPI and OpenMP (on Linux boxes) set(CMAKE_CXX_COMPILER "icpc" CACHE STRING "" FORCE) set(CMAKE_C_COMPILER "icc" CACHE STRING "" FORCE) @@ -18,11 +18,11 @@ set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE) unset(HAVE_OMP_H_INCLUDE CACHE) set(OpenMP_C "icc" CACHE STRING "" FORCE) -set(OpenMP_C_FLAGS "-qopenmp" CACHE STRING "" FORCE) +set(OpenMP_C_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE) set(OpenMP_C_LIB_NAMES "omp" CACHE STRING "" FORCE) set(OpenMP_CXX "icpc" CACHE STRING "" FORCE) -set(OpenMP_CXX_FLAGS "-qopenmp" CACHE STRING "" FORCE) +set(OpenMP_CXX_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE) set(OpenMP_CXX_LIB_NAMES "omp" CACHE STRING "" FORCE) -set(OpenMP_Fortran_FLAGS "-qopenmp" CACHE STRING "" FORCE) +set(OpenMP_Fortran_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE) set(OpenMP_omp_LIBRARY "libiomp5.so" CACHE PATH "" FORCE) diff --git a/cmake/presets/nvhpc.cmake b/cmake/presets/nvhpc.cmake new file mode 100644 index 0000000000..cfacce17ad --- /dev/null +++ b/cmake/presets/nvhpc.cmake @@ -0,0 +1,9 @@ +# preset that will enable Nvidia HPC SDK compilers with support for MPI and OpenMP (on Linux boxes) + +set(CMAKE_CXX_COMPILER "nvc++" CACHE STRING "" FORCE) +set(CMAKE_C_COMPILER "nvc" CACHE STRING "" FORCE) +set(CMAKE_Fortran_COMPILER "nvfortran" CACHE STRING "" FORCE) +set(MPI_CXX "nvc++" CACHE STRING "" FORCE) +set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE) +unset(HAVE_OMP_H_INCLUDE CACHE) + diff --git a/cmake/presets/oneapi.cmake b/cmake/presets/oneapi.cmake index 403494c409..2aacf1a1f5 100644 --- a/cmake/presets/oneapi.cmake +++ b/cmake/presets/oneapi.cmake @@ -18,11 +18,11 @@ set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE) unset(HAVE_OMP_H_INCLUDE CACHE) set(OpenMP_C "icx" CACHE STRING "" FORCE) -set(OpenMP_C_FLAGS "-qopenmp" CACHE STRING "" FORCE) +set(OpenMP_C_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE) set(OpenMP_C_LIB_NAMES "omp" CACHE STRING "" FORCE) set(OpenMP_CXX "icpx" CACHE STRING "" FORCE) -set(OpenMP_CXX_FLAGS "-qopenmp" CACHE STRING "" FORCE) +set(OpenMP_CXX_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE) set(OpenMP_CXX_LIB_NAMES "omp" CACHE STRING "" FORCE) -set(OpenMP_Fortran_FLAGS "-qopenmp" CACHE STRING "" FORCE) +set(OpenMP_Fortran_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE) set(OpenMP_omp_LIBRARY "libiomp5.so" CACHE PATH "" FORCE) diff --git a/cmake/presets/pedantic.cmake b/cmake/presets/pedantic.cmake index 11c74dbaa4..9bc0d036dd 100644 --- a/cmake/presets/pedantic.cmake +++ b/cmake/presets/pedantic.cmake @@ -1,4 +1,4 @@ -# preset that will restore gcc/g++ with support for MPI and OpenMP (on Linux boxes) +# preset that will set gcc/g++ with extra warnings enabled and support for MPI and OpenMP (on Linux boxes) set(CMAKE_CXX_COMPILER "g++" CACHE STRING "" FORCE) set(CMAKE_C_COMPILER "gcc" CACHE STRING "" FORCE) @@ -17,10 +17,3 @@ set(MPI_Fortran "gfortran" CACHE STRING "" FORCE) set(MPI_Fortran_COMPILER "mpifort" CACHE STRING "" FORCE) unset(HAVE_OMP_H_INCLUDE CACHE) -set(OpenMP_C "gcc" CACHE STRING "" FORCE) -set(OpenMP_C_FLAGS "-fopenmp" CACHE STRING "" FORCE) -set(OpenMP_C_LIB_NAMES "gomp" CACHE STRING "" FORCE) -set(OpenMP_CXX "g++" CACHE STRING "" FORCE) -set(OpenMP_CXX_FLAGS "-fopenmp" CACHE STRING "" FORCE) -set(OpenMP_CXX_LIB_NAMES "gomp" CACHE STRING "" FORCE) -set(OpenMP_omp_LIBRARY "libgomp.so" CACHE PATH "" FORCE) diff --git a/cmake/presets/pgi.cmake b/cmake/presets/pgi.cmake index 2b7fee7efa..4d499a2429 100644 --- a/cmake/presets/pgi.cmake +++ b/cmake/presets/pgi.cmake @@ -7,10 +7,3 @@ set(MPI_CXX "pgc++" CACHE STRING "" FORCE) set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE) unset(HAVE_OMP_H_INCLUDE CACHE) -set(OpenMP_C "pgcc" CACHE STRING "" FORCE) -set(OpenMP_C_FLAGS "-mp" CACHE STRING "" FORCE) -set(OpenMP_C_LIB_NAMES "omp" CACHE STRING "" FORCE) -set(OpenMP_CXX "pgc++" CACHE STRING "" FORCE) -set(OpenMP_CXX_FLAGS "-mp" CACHE STRING "" FORCE) -set(OpenMP_CXX_LIB_NAMES "omp" CACHE STRING "" FORCE) -set(OpenMP_omp_LIBRARY "libomp.so" CACHE PATH "" FORCE) diff --git a/doc/Makefile b/doc/Makefile index 4bbc252fb6..3a4a71bd54 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -38,16 +38,14 @@ endif # override settings for PIP commands # PIP_OPTIONS = --cert /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt --proxy http://proxy.mydomain.org -#SPHINXEXTRA = -j $(shell $(PYTHON) -c 'import multiprocessing;print(multiprocessing.cpu_count())') $(shell test -f $(BUILDDIR)/doxygen/xml/run.stamp && printf -- "-E") - # temporarily disable caching so that the hack for the sphinx-tabs extensions to get proper non-html output works -SPHINXEXTRA = -E -j $(shell $(PYTHON) -c 'import multiprocessing;print(multiprocessing.cpu_count())') +SPHINXEXTRA = -j $(shell $(PYTHON) -c 'import multiprocessing;print(multiprocessing.cpu_count())') # grab list of sources from doxygen config file. # we only want to use explicitly listed files. DOXYFILES = $(shell sed -n -e 's/\#.*$$//' -e '/^ *INPUT \+=/,/^[A-Z_]\+ \+=/p' doxygen/Doxyfile.in | sed -e 's/@LAMMPS_SOURCE_DIR@/..\/src/g' -e 's/\\//g' -e 's/ \+/ /' -e 's/[A-Z_]\+ \+= *\(YES\|NO\|\)//') -.PHONY: help clean-all clean clean-spelling epub mobi rst html pdf spelling anchor_check style_check char_check xmlgen fasthtml +.PHONY: help clean-all clean clean-spelling epub mobi html pdf spelling anchor_check style_check char_check xmlgen fasthtml # ------------------------------------------ @@ -89,6 +87,8 @@ html: xmlgen $(VENV) $(SPHINXCONFIG)/conf.py $(ANCHORCHECK) $(MATHJAX) @$(MAKE) $(MFLAGS) -C graphviz all @(\ . $(VENV)/bin/activate ; env PYTHONWARNINGS= \ + sphinx-build -E $(SPHINXEXTRA) -b html -c $(SPHINXCONFIG) -d $(BUILDDIR)/doctrees $(RSTDIR) html ;\ + touch $(RSTDIR)/Fortran.rst ;\ sphinx-build $(SPHINXEXTRA) -b html -c $(SPHINXCONFIG) -d $(BUILDDIR)/doctrees $(RSTDIR) html ;\ ln -sf Manual.html html/index.html;\ rm -f $(BUILDDIR)/doxygen/xml/run.stamp;\ @@ -114,7 +114,9 @@ fasthtml: xmlgen $(VENV) $(SPHINXCONFIG)/conf.py $(ANCHORCHECK) $(MATHJAX) @mkdir -p fasthtml @(\ . $(VENV)/bin/activate ; env PYTHONWARNINGS= \ - sphinx-build -j 4 -b html -c $(SPHINXCONFIG) -d $(BUILDDIR)/fasthtml/doctrees $(RSTDIR) fasthtml ;\ + sphinx-build $(SPHINXEXTRA) -b html -c $(SPHINXCONFIG) -d $(BUILDDIR)/fasthtml/doctrees $(RSTDIR) fasthtml ;\ + touch $(RSTDIR)/Fortran.rst ;\ + sphinx-build $(SPHINXEXTRA) -b html -c $(SPHINXCONFIG) -d $(BUILDDIR)/fasthtml/doctrees $(RSTDIR) fasthtml ;\ deactivate ;\ ) @rm -rf fasthtml/_sources @@ -144,6 +146,8 @@ epub: xmlgen $(VENV) $(SPHINXCONFIG)/conf.py $(ANCHORCHECK) @cp src/JPG/*.* epub/JPG @(\ . $(VENV)/bin/activate ;\ + sphinx-build -E $(SPHINXEXTRA) -b epub -c $(SPHINXCONFIG) -d $(BUILDDIR)/doctrees $(RSTDIR) epub ;\ + touch $(RSTDIR)/Fortran.rst ;\ sphinx-build $(SPHINXEXTRA) -b epub -c $(SPHINXCONFIG) -d $(BUILDDIR)/doctrees $(RSTDIR) epub ;\ rm -f $(BUILDDIR)/doxygen/xml/run.stamp;\ deactivate ;\ @@ -163,7 +167,9 @@ pdf: xmlgen $(VENV) $(SPHINXCONFIG)/conf.py $(ANCHORCHECK) @if [ "$(HAS_PDFLATEX)" == "NO" ] ; then echo "PDFLaTeX or latexmk were not found! Please check README for further instructions" 1>&2; exit 1; fi @(\ . $(VENV)/bin/activate ; env PYTHONWARNINGS= \ - sphinx-build $(SPHINXEXTRA) -b latex -c $(SPHINXCONFIG) -d $(BUILDDIR)/doctrees $(RSTDIR) latex ;\ + sphinx-build -E $(SPHINXEXTRA) -b latex -c $(SPHINXCONFIG) -d $(BUILDDIR)/doctrees $(RSTDIR) latex ;\ + touch $(RSTDIR)/Fortran.rst ;\ + sphinx-build $(SPHINXEXTRA) -b latex -c $(SPHINXCONFIG) -d $(BUILDDIR)/doctrees $(RSTDIR) latex ;\ rm -f $(BUILDDIR)/doxygen/xml/run.stamp;\ echo "############################################" ;\ rst_anchor_check src/*.rst ;\ diff --git a/doc/lammps.1 b/doc/lammps.1 index e4f0f2a9eb..a9d1e2ce6e 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,7 +1,7 @@ -.TH LAMMPS "1" "15 September 2022" "2022-9-15" +.TH LAMMPS "1" "3 November 2022" "2022-11-3" .SH NAME .B LAMMPS -\- Molecular Dynamics Simulator. Version 15 September 2022 +\- Molecular Dynamics Simulator. Version 3 November 2022 .SH SYNOPSIS .B lmp diff --git a/doc/src/Bibliography.rst b/doc/src/Bibliography.rst index dff457836c..2d27d2e6f9 100644 --- a/doc/src/Bibliography.rst +++ b/doc/src/Bibliography.rst @@ -314,7 +314,7 @@ Bibliography Espanol, Revenga, Physical Review E, 67, 026705 (2003). **(Espanol1997)** - Espanol, Europhys Lett, 40(6): 631-636 (1997). DOI: 10.1209/epl/i1997-00515-8 + Espanol, Europhys Lett, 40(6): 631-636 (1997). DOI:10.1209/epl/i1997-00515-8 **(Evans and Morriss)** Evans and Morriss, Phys Rev A, 30, 1528 (1984). @@ -368,7 +368,7 @@ Bibliography Frenkel and Smit, Understanding Molecular Simulation, Academic Press, London, 2002. **(GLE4MD)** - `http://gle4md.org/ `_ + `https://gle4md.org/ `_ **(Gao)** Gao and Weber, Nuclear Instruments and Methods in Physics Research B 191 (2012) 504. @@ -401,13 +401,13 @@ Bibliography Hayre, and Farago, Comp Phys Comm, 185, 524 (2014) **(Groot)** - Groot and Warren, J Chem Phys, 107: 4423-4435 (1997). DOI: 10.1063/1.474784 + Groot and Warren, J Chem Phys, 107: 4423-4435 (1997). DOI:10.1063/1.474784 **(Guenole)** Guenole, Noehring, Vaid, Houlle, Xie, Prakash, Bitzek, Comput Mater Sci, 175, 109584 (2020). **(Gullet)** - Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). + Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). DOI:10.2172/918395 **(Guo)** Guo and Thirumalai, Journal of Molecular Biology, 263, 323-43 (1996). @@ -461,7 +461,7 @@ Bibliography Hunt, Mol Simul, 42, 347 (2016). **(IPI)** - `http://epfl-cosmo.github.io/gle4md/index.html?page=ipi `_ + `https://ipi-code.org/ ` **(IPI-CPC)** Ceriotti, More and Manolopoulos, Comp Phys Comm, 185, 1019-1026 (2014). @@ -605,16 +605,16 @@ Bibliography I.\ Leven et al, J. Chem.Theory Comput. 12, 2896-905 (2016). **(Li2013_POF)** - Li, Hu, Wang, Ma, Zhou, Phys Fluids, 25: 072103 (2013). DOI: 10.1063/1.4812366. + Li, Hu, Wang, Ma, Zhou, Phys Fluids, 25: 072103 (2013). DOI:10.1063/1.4812366. **(Li2014_JCP)** - Li, Tang, Lei, Caswell, Karniadakis, J Comput Phys, 265: 113-127 (2014). DOI: 10.1016/j.jcp.2014.02.003. + Li, Tang, Lei, Caswell, Karniadakis, J Comput Phys, 265: 113-127 (2014). DOI:10.1016/j.jcp.2014.02.003. **(Li2015_CC)** - Li, Tang, Li, Karniadakis, Chem Commun, 51: 11038-11040 (2015). DOI: 10.1039/C5CC01684C. + Li, Tang, Li, Karniadakis, Chem Commun, 51: 11038-11040 (2015). DOI:10.1039/C5CC01684C. **(Li2015_JCP)** - Li, Yazdani, Tartakovsky, Karniadakis, J Chem Phys, 143: 014101 (2015). DOI: 10.1063/1.4923254. + Li, Yazdani, Tartakovsky, Karniadakis, J Chem Phys, 143: 014101 (2015). DOI:10.1063/1.4923254. **(Lisal)** M.\ Lisal, J.K. Brennan, J. Bonet Avalos, "Dissipative particle dynamics at isothermal, isobaric, isoenergetic, and isoenthalpic conditions using Shardlow-like splitting algorithms.", @@ -733,8 +733,8 @@ Bibliography **(Mishin)** Mishin, Mehl, and Papaconstantopoulos, Acta Mater, 53, 4029 (2005). -**(Mitchell and Finchham)** - Mitchell, Finchham, J Phys Condensed Matter, 5, 1031-1038 (1993). +**(Mitchell and Fincham)** + Mitchell, Fincham, J Phys Condensed Matter, 5, 1031-1038 (1993). **(Mitchell2011)** Mitchell. A non-local, ordinary-state-based viscoelasticity model for peridynamics. Sandia National Lab Report, 8064:1-28 (2011). @@ -875,7 +875,7 @@ Bibliography G.A. Tribello, M. Bonomi, D. Branduardi, C. Camilloni and G. Bussi, Comp. Phys. Comm 185, 604 (2014) **(Paquay)** - Paquay and Kusters, Biophys. J., 110, 6, (2016). preprint available at `arXiv:1411.3019 `_. + Paquay and Kusters, Biophys. J., 110, 6, (2016). preprint available at `arXiv:1411.3019 `_. **(Park)** Park, Schulten, J. Chem. Phys. 120 (13), 5946 (2004) diff --git a/doc/src/Build_development.rst b/doc/src/Build_development.rst index 66e12a0d69..102ec67e7e 100644 --- a/doc/src/Build_development.rst +++ b/doc/src/Build_development.rst @@ -140,13 +140,23 @@ of the LAMMPS project on GitHub. The unit testing facility is integrated into the CMake build process of the LAMMPS source code distribution itself. It can be enabled by setting ``-D ENABLE_TESTING=on`` during the CMake configuration step. -It requires the `YAML `_ library and development +It requires the `YAML `_ library and development headers (if those are not found locally a recent version will be downloaded and compiled along with LAMMPS and the test program) to compile and will download and compile a specific recent version of the `Googletest `_ C++ test framework for implementing the tests. +.. admonition:: Software version requirements for testing + :class: note + + The compiler and library version requirements for the testing + framework are more strict than for the main part of LAMMPS. For + example the default GNU C++ and Fortran compilers of RHEL/CentOS 7.x + (version 4.8.x) are not sufficient. The CMake configuration will try + to detect compatible versions and either skip incompatible tests or + stop with an error. + After compilation is complete, the unit testing is started in the build folder using the ``ctest`` command, which is part of the CMake software. The output of this command will be looking something like this:: diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index 0f5f5f8064..8a5eeaa485 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -234,7 +234,7 @@ LAMMPS code. This also applies to the ``-DLAMMPS_BIGBIG``\ , Makefile you use. You can also build the library in one step from the ``lammps/src`` dir, -using a command like these, which simply invoke the ``lib/gpu/Install.py`` +using a command like these, which simply invokes the ``lib/gpu/Install.py`` script with the specified args: .. code-block:: bash @@ -314,7 +314,7 @@ detailed information is available at: In addition to installing the KIM API, it is also necessary to install the library of KIM models (interatomic potentials). -See `Obtaining KIM Models `_ to +See `Obtaining KIM Models `_ to learn how to install a pre-build binary of the OpenKIM Repository of Models. See the list of all KIM models here: https://openkim.org/browse/models @@ -350,7 +350,7 @@ minutes to hours) to build. Of course you only need to do that once.) You can download and build the KIM library manually if you prefer; follow the instructions in ``lib/kim/README``. You can also do this in one step from the lammps/src directory, using a command like - these, which simply invoke the ``lib/kim/Install.py`` script with + these, which simply invokes the ``lib/kim/Install.py`` script with the specified args. .. code-block:: bash @@ -432,7 +432,7 @@ Enabling the extra unit tests have some requirements, ``EAM_Dynamo_MendelevAckland_2007v3_Zr__MO_004835508849_000``, ``EAM_Dynamo_ErcolessiAdams_1994_Al__MO_123629422045_005``, and ``LennardJones612_UniversalShifted__MO_959249795837_003`` KIM models. - See `Obtaining KIM Models `_ + See `Obtaining KIM Models `_ to learn how to install a pre-built binary of the OpenKIM Repository of Models or see `Installing KIM Models `_ @@ -483,6 +483,9 @@ They must be specified in uppercase. * - **Arch-ID** - **HOST or GPU** - **Description** + * - NATIVE + - HOST + - Local machine * - AMDAVX - HOST - AMD 64-bit x86 CPU (AVX 1) @@ -522,9 +525,21 @@ They must be specified in uppercase. * - BDW - HOST - Intel Broadwell Xeon E-class CPU (AVX 2 + transactional mem) + * - SKL + - HOST + - Intel Skylake Client CPU * - SKX - HOST - - Intel Sky Lake Xeon E-class HPC CPU (AVX512 + transactional mem) + - Intel Skylake Xeon Server CPU (AVX512) + * - ICL + - HOST + - Intel Ice Lake Client CPU (AVX512) + * - ICX + - HOST + - Intel Ice Lake Xeon Server CPU (AVX512) + * - SPR + - HOST + - Intel Sapphire Rapids Xeon Server CPU (AVX512) * - KNC - HOST - Intel Knights Corner Xeon Phi @@ -596,7 +611,10 @@ They must be specified in uppercase. - AMD GPU MI100 GFX908 * - VEGA90A - GPU - - AMD GPU + - AMD GPU MI200 GFX90A + * - INTEL_GEN + - GPU + - SPIR64-based devices, e.g. Intel GPUs, using JIT * - INTEL_DG1 - GPU - Intel Iris XeMAX GPU @@ -611,9 +629,12 @@ They must be specified in uppercase. - Intel GPU Gen12LP * - INTEL_XEHP - GPU - - Intel GPUs Xe-HP + - Intel GPU Xe-HP + * - INTEL_PVC + - GPU + - Intel GPU Ponte Vecchio -This list was last updated for version 3.5.0 of the Kokkos library. +This list was last updated for version 3.7.0 of the Kokkos library. .. tabs:: @@ -933,7 +954,7 @@ more details. You can download and build the MS-CG library manually if you prefer; follow the instructions in ``lib/mscg/README``\ . You can also do it in one step from the ``lammps/src`` dir, using a - command like these, which simply invoke the + command like these, which simply invokes the ``lib/mscg/Install.py`` script with the specified args: .. code-block:: bash @@ -990,7 +1011,7 @@ POEMS package ``lib/poems``\ . You can do this manually if you prefer; follow the instructions in ``lib/poems/README``\ . You can also do it in one step from the ``lammps/src`` dir, using a command like these, - which simply invoke the ``lib/poems/Install.py`` script with the + which simply invokes the ``lib/poems/Install.py`` script with the specified args: .. code-block:: bash @@ -1053,7 +1074,7 @@ VORONOI package ----------------------------- To build with this package, you must download and build the -`Voro++ library `_ or install a +`Voro++ library `_ or install a binary package provided by your operating system. .. tabs:: @@ -1079,7 +1100,7 @@ binary package provided by your operating system. You can download and build the Voro++ library manually if you prefer; follow the instructions in ``lib/voronoi/README``. You can also do it in one step from the ``lammps/src`` dir, using a - command like these, which simply invoke the + command like these, which simply invokes the ``lib/voronoi/Install.py`` script with the specified args: .. code-block:: bash @@ -1158,7 +1179,7 @@ The ATC package requires the MANYBODY package also be installed. ``lib/atc``. You can do this manually if you prefer; follow the instructions in ``lib/atc/README``. You can also do it in one step from the ``lammps/src`` dir, using a command like these, - which simply invoke the ``lib/atc/Install.py`` script with the + which simply invokes the ``lib/atc/Install.py`` script with the specified args: .. code-block:: bash @@ -1209,7 +1230,7 @@ AWPMD package ``lib/awpmd``. You can do this manually if you prefer; follow the instructions in ``lib/awpmd/README``. You can also do it in one step from the ``lammps/src`` dir, using a command like these, - which simply invoke the ``lib/awpmd/Install.py`` script with the + which simply invokes the ``lib/awpmd/Install.py`` script with the specified args: .. code-block:: bash @@ -1272,7 +1293,7 @@ be built for the most part with all major versions of the C++ language. In general, it is safer to use build setting consistent with the rest of LAMMPS. This is best carried out from the LAMMPS src - directory using a command like these, which simply invoke the + directory using a command like these, which simply invokes the ``lib/colvars/Install.py`` script with the specified args: .. code-block:: bash @@ -1313,20 +1334,30 @@ This package depends on the KSPACE package. .. tab:: CMake build - No additional settings are needed besides ``-D PKG_KSPACE=yes`` and ``-D - PKG_ELECTRODE=yes``. + No additional settings are needed besides ``-D PKG_KSPACE=yes`` and + ``-D PKG_ELECTRODE=yes``. .. tab:: Traditional make - The package is activated with ``make yes-KSPACE`` and ``make - yes-ELECTRODE`` + Before building LAMMPS, you must configure the ELECTRODE support + libraries and settings in ``lib/electrode``. You can do this + manually, if you prefer, or do it in one step from the + ``lammps/src`` dir, using a command like these, which simply + invokes the ``lib/electrode/Install.py`` script with the specified + args: + + .. code-block:: bash + + $ make lib-electrode # print help message + $ make lib-electrode args="-m serial" # build with GNU g++ compiler and MPI STUBS (settings as with "make serial") + $ make lib-electrode args="-m mpi" # build with default MPI compiler (settings as with "make mpi") - Note that the ``Makefile.lammps`` file has settings for the BLAS and - LAPACK linear algebra libraries. As explained in ``lib/awpmd/README`` - these can either exist on your system, or you can use the files provided - in ``lib/linalg``. In the latter case you also need to build the library - in ``lib/linalg`` with a command like these: + Note that the ``Makefile.lammps`` file has settings for the BLAS + and LAPACK linear algebra libraries. These can either exist on + your system, or you can use the files provided in ``lib/linalg``. + In the latter case you also need to build the library in + ``lib/linalg`` with a command like these: .. code-block:: bash @@ -1335,6 +1366,9 @@ This package depends on the KSPACE package. $ make lib-linalg args="-m mpi" # build with default MPI Fortran compiler (settings as with "make mpi") $ make lib-linalg args="-m gfortran" # build with GNU Fortran compiler + The package itself is activated with ``make yes-KSPACE`` and + ``make yes-ELECTRODE`` + ---------- .. _ml-pace: @@ -1534,7 +1568,7 @@ the HDF5 library. ``lib/h5md``. You can do this manually if you prefer; follow the instructions in ``lib/h5md/README``. You can also do it in one step from the ``lammps/src`` dir, using a command like these, - which simply invoke the ``lib/h5md/Install.py`` script with the + which simply invokes the ``lib/h5md/Install.py`` script with the specified args: .. code-block:: bash @@ -1590,7 +1624,7 @@ details please see ``lib/hdnnp/README`` and the `n2p2 build documentation You can download and build the *n2p2* library manually if you prefer; follow the instructions in ``lib/hdnnp/README``\ . You can also do it in one step from the ``lammps/src`` dir, using a command like these, which - simply invoke the ``lib/hdnnp/Install.py`` script with the specified args: + simply invokes the ``lib/hdnnp/Install.py`` script with the specified args: .. code-block:: bash @@ -1727,7 +1761,7 @@ they will be downloaded the first time this package is installed. Before building LAMMPS, you must build the *mesont* library in ``lib/mesont``\ . You can also do it in one step from the ``lammps/src`` dir, using a command like these, which simply - invoke the ``lib/mesont/Install.py`` script with the specified + invokes the ``lib/mesont/Install.py`` script with the specified args: .. code-block:: bash @@ -1896,7 +1930,7 @@ verified to work in February 2020 with Quantum Espresso versions 6.3 to ``lib/qmmm``. You can do this manually if you prefer; follow the first two steps explained in ``lib/qmmm/README``. You can also do it in one step from the ``lammps/src`` dir, using a command like - these, which simply invoke the ``lib/qmmm/Install.py`` script with + these, which simply invokes the ``lib/qmmm/Install.py`` script with the specified args: .. code-block:: bash @@ -2004,7 +2038,7 @@ To build with this package, you must download and build the You can download and build the ScaFaCoS library manually if you prefer; follow the instructions in ``lib/scafacos/README``. You can also do it in one step from the ``lammps/src`` dir, using a - command like these, which simply invoke the + command like these, which simply invokes the ``lib/scafacos/Install.py`` script with the specified args: .. code-block:: bash @@ -2048,7 +2082,7 @@ Eigen3 is a template library, so you do not need to build it. You can download the Eigen3 library manually if you prefer; follow the instructions in ``lib/smd/README``. You can also do it in one step from the ``lammps/src`` dir, using a command like these, - which simply invoke the ``lib/smd/Install.py`` script with the + which simply invokes the ``lib/smd/Install.py`` script with the specified args: .. code-block:: bash diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index d91ac94be5..c71c536e10 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -176,7 +176,7 @@ math expressions transparently into embedded images. For converting the generated ePUB file to a MOBI format file (for e-book readers, like Kindle, that cannot read ePUB), you also need to have the ``ebook-convert`` tool from the "calibre" software -installed. `http://calibre-ebook.com/ `_ +installed. `https://calibre-ebook.com/ `_ Typing ``make mobi`` will first create the ePUB file and then convert it. On the Kindle readers in particular, you also have support for PDF files, so you could download and view the PDF version as an alternative. @@ -216,9 +216,20 @@ be multiple tests run automatically: - A test that only standard, printable ASCII text characters are used. This runs the command ``env LC_ALL=C grep -n '[^ -~]' src/*.rst`` and thus prints all offending lines with filename and line number - prepended to the screen. Special characters like the Angstrom - :math:`\mathrm{\mathring{A}}` should be typeset with embedded math - (like this ``:math:`\mathrm{\mathring{A}}```\ ). + prepended to the screen. Special characters like Greek letters + (:math:`\alpha~~\sigma~~\epsilon`), super- or subscripts + (:math:`x^2~~\mathrm{U}_{LJ}`), mathematical expressions + (:math:`\frac{1}{2}\mathrm{N}~~x\to\infty`), or the Angstrom symbol + (:math:`\AA`) should be typeset with embedded LaTeX (like this + ``:math:`\alpha \sigma \epsilon```, ``:math:`x^2 \mathrm{E}_{LJ}```, + ``:math:`\frac{1}{2}\mathrm{N} x\to\infty```, or ``:math:`\AA```\ ). + +- Embedded LaTeX is rendered in HTML output with `MathJax + `_ and in PDF output by passing the embedded + text to LaTeX. Some care has to be taken, though, since there are + limitations which macros and features can be used in either mode, so + it is recommended to always check whether any new or changed + documentation does translate and render correctly with either output. - A test whether all styles are documented and listed in their respective overview pages. A typical output with warnings looks like this: diff --git a/doc/src/Build_settings.rst b/doc/src/Build_settings.rst index 7e627a052f..2d83908bb1 100644 --- a/doc/src/Build_settings.rst +++ b/doc/src/Build_settings.rst @@ -111,26 +111,25 @@ LAMMPS can use them if they are available on your system. files in its default search path. You must specify ``FFT_LIB`` with the appropriate FFT libraries to include in the link. -The `KISS FFT library `_ is included in the LAMMPS -distribution. It is portable across all platforms. Depending on the size -of the FFTs and the number of processors used, the other libraries listed -here can be faster. +The `KISS FFT library `_ is +included in the LAMMPS distribution. It is portable across all +platforms. Depending on the size of the FFTs and the number of +processors used, the other libraries listed here can be faster. However, note that long-range Coulombics are only a portion of the -per-timestep CPU cost, FFTs are only a portion of long-range -Coulombics, and 1d FFTs are only a portion of the FFT cost (parallel -communication can be costly). A breakdown of these timings is printed -to the screen at the end of a run when using the -:doc:`kspace_style pppm ` command. The -:doc:`Screen and logfile output ` -page gives more details. A more detailed (and time consuming) -report of the FFT performance is generated with the +per-timestep CPU cost, FFTs are only a portion of long-range Coulombics, +and 1d FFTs are only a portion of the FFT cost (parallel communication +can be costly). A breakdown of these timings is printed to the screen +at the end of a run when using the :doc:`kspace_style pppm +` command. The :doc:`Screen and logfile output +` page gives more details. A more detailed (and time +consuming) report of the FFT performance is generated with the :doc:`kspace_modify fftbench yes ` command. FFTW is a fast, portable FFT library that should also work on any -platform and can be faster than the KISS FFT library. You can -download it from `www.fftw.org `_. LAMMPS requires -version 3.X; the legacy version 2.1.X is no longer supported. +platform and can be faster than the KISS FFT library. You can download +it from `www.fftw.org `_. LAMMPS requires version +3.X; the legacy version 2.1.X is no longer supported. Building FFTW for your box should be as simple as ``./configure; make; make install``. The install command typically requires root privileges diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index abb474b11b..3f5deef24a 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -205,7 +205,7 @@ OPT. * :doc:`mesont/tpm ` * :doc:`mgpt ` * :doc:`mie/cut (g) ` - * :doc:`mliap ` + * :doc:`mliap (k) ` * :doc:`mm3/switch3/coulgauss/long ` * :doc:`momb ` * :doc:`morse (gkot) ` @@ -236,6 +236,7 @@ OPT. * :doc:`oxrna2/xstk ` * :doc:`oxrna2/coaxstk ` * :doc:`pace (k) ` + * :doc:`pace/extrapolation ` * :doc:`pod ` * :doc:`peri/eps ` * :doc:`peri/lps (o) ` @@ -295,6 +296,7 @@ OPT. * :doc:`vashishta (gko) ` * :doc:`vashishta/table (o) ` * :doc:`wf/cut ` + * :doc:`ylz ` * :doc:`yukawa (gko) ` * :doc:`yukawa/colloid (go) ` * :doc:`zbl (gko) ` diff --git a/doc/src/Developer_updating.rst b/doc/src/Developer_updating.rst index 091312d68e..90a138d2cf 100644 --- a/doc/src/Developer_updating.rst +++ b/doc/src/Developer_updating.rst @@ -7,7 +7,7 @@ source files provided as a supplement to a publication) that are written for an older version of LAMMPS and thus need to be updated to be compatible with the current version of LAMMPS. Due to the active development of LAMMPS it is likely to always be incomplete. Please -contact developer@lammps.org in case you run across an issue that is not +contact developers@lammps.org in case you run across an issue that is not (yet) listed here. Please also review the latest information about the LAMMPS :doc:`programming style conventions `, especially if you are considering to submit the updated version for inclusion into diff --git a/doc/src/Errors_debug.rst b/doc/src/Errors_debug.rst index 786a21ecae..787f3f6b34 100644 --- a/doc/src/Errors_debug.rst +++ b/doc/src/Errors_debug.rst @@ -75,7 +75,7 @@ Using the GDB debugger to get a stack trace There are two options to use the GDB debugger for identifying the origin of the segmentation fault or similar crash. The GDB debugger has many more features and options, as can be seen for example its `online -documentation `_. +documentation `_. Run LAMMPS from within the debugger ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index dd848a812e..ec54a594d1 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -1,14 +1,17 @@ -The ``LIBLAMMPS`` Fortran Module -******************************** +The :f:mod:`LIBLAMMPS` Fortran Module +************************************* -The ``LIBLAMMPS`` module provides an interface to call LAMMPS from a -Fortran code. It is based on the LAMMPS C-library interface and -requires a Fortran 2003 compatible compiler to be compiled. +The :f:mod:`LIBLAMMPS` module provides an interface to call LAMMPS from +Fortran. It is based on the LAMMPS C library interface and requires a +fully Fortran 2003-compatible compiler to be compiled. It is designed +to be self-contained and not require any support functions written in C, +C++, or Fortran other than those in the C library interface and the module +itself. While C libraries have a defined binary interface (ABI) and can thus be -used from multiple compiler versions from different vendors for as long +used from multiple compiler versions from different vendors as long as they are compatible with the hosting operating system, the same is -not true for Fortran codes. Thus the LAMMPS Fortran module needs to be +not true for Fortran programs. Thus, the LAMMPS Fortran module needs to be compiled alongside the code using it from the source code in ``fortran/lammps.f90``. When linking, you also need to :doc:`link to the LAMMPS library `. A typical command line @@ -16,14 +19,22 @@ for a simple program using the Fortran interface would be: .. code-block:: bash - mpifort -o testlib.x lammps.f90 testlib.f90 -L. -llammps + mpifort -o testlib.x lammps.f90 testlib.f90 -L. -llammps -Please note, that the MPI compiler wrapper is only required when the -calling the library from an MPI parallel code. Please also note the -order of the source files: the ``lammps.f90`` file needs to be compiled -first, since it provides the ``LIBLAMMPS`` module that is imported by -the Fortran code using the interface. A working example code can be -found together with equivalent examples in C and C++ in the +Please note that the MPI compiler wrapper is only required when the +calling the library from an MPI-parallelized program. Otherwise, using +the plain Fortran compiler (gfortran, ifort, flang, etc.) will suffice. +It may be necessary to link to additional libraries, depending on how +LAMMPS was configured and whether the LAMMPS library :doc:`was compiled +as a static or dynamic library `. + +If the LAMMPS library itself has been compiled with MPI support, the +resulting executable will still be able to run LAMMPS in parallel with +``mpirun``, ``mpiexec`` or equivalent. Please also note that the order +of the source files matters: the ``lammps.f90`` file needs to be +compiled first, since it provides the :f:mod:`LIBLAMMPS` module that is +imported by the Fortran code that uses the interface. A working example +can be found together with equivalent examples in C and C++ in the ``examples/COUPLE/simple`` folder of the LAMMPS distribution. .. versionadded:: 9Oct2020 @@ -39,7 +50,7 @@ found together with equivalent examples in C and C++ in the .. note:: A contributed (and more complete!) Fortran interface that more - closely resembles the C-library interface is available in the + closely resembles the C library interface is available in the ``examples/COUPLE/fortran2`` folder. Please see the ``README`` file in that folder for more information about it and how to contact its author and maintainer. @@ -49,42 +60,42 @@ found together with equivalent examples in C and C++ in the Creating or deleting a LAMMPS object ************************************ -With the Fortran interface the creation of a :cpp:class:`LAMMPS +With the Fortran interface, the creation of a :cpp:class:`LAMMPS ` instance is included in the constructor for creating the :f:func:`lammps` derived type. To import the definition of -that type and its type bound procedures you need to add a ``USE -LIBLAMMPS`` statement. Internally it will call either +that type and its type-bound procedures, you need to add a ``USE LIBLAMMPS`` +statement. Internally, it will call either :cpp:func:`lammps_open_fortran` or :cpp:func:`lammps_open_no_mpi` from the C library API to create the class instance. All arguments are -optional and :cpp:func:`lammps_mpi_init` will be called automatically, -if it is needed. Similarly, a possible call to :cpp:func:`lammps_finalize` -is integrated into the :f:func:`close` function and triggered with -the optional logical argument set to ``.true.``. Here is a simple example: +optional and :cpp:func:`lammps_mpi_init` will be called automatically +if it is needed. Similarly, a possible call to +:cpp:func:`lammps_mpi_finalize` is integrated into the :f:func:`close` +function and triggered with the optional logical argument set to +``.TRUE.``. Here is a simple example: .. code-block:: fortran PROGRAM testlib USE LIBLAMMPS ! include the LAMMPS library interface IMPLICIT NONE - TYPE(lammps) :: lmp ! derived type to hold LAMMPS instance - CHARACTER(len=*), PARAMETER :: args(3) = & - [ CHARACTER(len=12) :: 'liblammps', '-log', 'none' ] + TYPE(lammps) :: lmp ! derived type to hold LAMMPS instance + CHARACTER(LEN=*), PARAMETER :: args(3) = & + [ CHARACTER(LEN=12) :: 'liblammps', '-log', 'none' ] ! create a LAMMPS instance (and initialize MPI) lmp = lammps(args) ! get and print numerical version code PRINT*, 'LAMMPS Version: ', lmp%version() - ! delete LAMMPS instance (and shuts down MPI) - CALL lmp%close(.true.) - + ! delete LAMMPS instance (and shutdown MPI) + CALL lmp%close(.TRUE.) END PROGRAM testlib It is also possible to pass command line flags from Fortran to C/C++ and -thus make the resulting executable behave similar to the standalone -executable (it will ignore the `-in/-i` flag, though). This allows to -use the command line to configure accelerator and suffix settings, +thus make the resulting executable behave similarly to the standalone +executable (it will ignore the `-in/-i` flag, though). This allows +using the command line to configure accelerator and suffix settings, configure screen and logfile output, or to set index style variables -from the command line and more. Here is a correspondingly adapted +from the command line and more. Here is a correspondingly adapted version of the previous example: .. code-block:: fortran @@ -92,8 +103,8 @@ version of the previous example: PROGRAM testlib2 USE LIBLAMMPS ! include the LAMMPS library interface IMPLICIT NONE - TYPE(lammps) :: lmp ! derived type to hold LAMMPS instance - CHARACTER(len=128), ALLOCATABLE :: command_args(:) + TYPE(lammps) :: lmp ! derived type to hold LAMMPS instance + CHARACTER(LEN=128), ALLOCATABLE :: command_args(:) INTEGER :: i, argc ! copy command line flags to `command_args()` @@ -111,20 +122,19 @@ version of the previous example: ! delete LAMMPS instance (and shuts down MPI) CALL lmp%close(.TRUE.) DEALLOCATE(command_args) - END PROGRAM testlib2 -------------------- Executing LAMMPS commands -========================= +************************* Once a LAMMPS instance is created, it is possible to "drive" the LAMMPS -simulation by telling LAMMPS to read commands from a file, or pass +simulation by telling LAMMPS to read commands from a file or to pass individual or multiple commands from strings or lists of strings. This -is done similar to how it is implemented in the `C-library -` interface. Before handing off the calls to the -C-library interface, the corresponding Fortran versions of the calls +is done similarly to how it is implemented in the :doc:`C library +interface `. Before handing off the calls to the +C library interface, the corresponding Fortran versions of the calls (:f:func:`file`, :f:func:`command`, :f:func:`commands_list`, and :f:func:`commands_string`) have to make a copy of the strings passed as arguments so that they can be modified to be compatible with the @@ -136,10 +146,10 @@ Below is a small demonstration of the uses of the different functions: PROGRAM testcmd USE LIBLAMMPS - TYPE(lammps) :: lmp - CHARACTER(len=512) :: cmds - CHARACTER(len=40), ALLOCATABLE :: cmdlist(:) - CHARACTER(len=10) :: trimmed + TYPE(lammps) :: lmp + CHARACTER(LEN=512) :: cmds + CHARACTER(LEN=40), ALLOCATABLE :: cmdlist(:) + CHARACTER(LEN=10) :: trimmed INTEGER :: i lmp = lammps() @@ -148,9 +158,9 @@ Below is a small demonstration of the uses of the different functions: ! define 10 groups of 10 atoms each ALLOCATE(cmdlist(10)) DO i=1, 10 - WRITE(trimmed,'(I10)') 10*i - WRITE(cmdlist(i),'(A,I1,A,I10,A,A)') & - 'group g', i-1, ' id ', 10*(i-1)+1, ':', ADJUSTL(trimmed) + WRITE(trimmed,'(I10)') 10*i + WRITE(cmdlist(i),'(A,I1,A,I10,A,A)') & + 'group g', i-1, ' id ', 10*(i-1)+1, ':', ADJUSTL(trimmed) END DO CALL lmp%commands_list(cmdlist) ! run multiple commands from multi-line string @@ -160,32 +170,208 @@ Below is a small demonstration of the uses of the different functions: 'create_atoms 1 single 1.0 1.0 ${zpos}' CALL lmp%commands_string(cmds) CALL lmp%close(.TRUE.) - END PROGRAM testcmd --------------- -The ``LIBLAMMPS`` module API -**************************** +Accessing system properties +*************************** + +The C library interface allows the :doc:`extraction of different kinds +of information ` about the active simulation +instance and also---in some cases---to apply modifications to it, and the +Fortran interface provides access to the same data using Fortran-style, +C-interoperable data types. In some cases, the Fortran library interface makes +pointers to internal LAMMPS data structures accessible; when accessing them +through the library interfaces, special care is needed to avoid data corruption +and crashes. Please see the documentation of the individual type-bound +procedures for details. + +Below is an example demonstrating some of the possible uses. + +.. code-block:: fortran + + PROGRAM testprop + USE LIBLAMMPS + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int64_t + USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY : OUTPUT_UNIT + TYPE(lammps) :: lmp + INTEGER(KIND=c_int64_t), POINTER :: natoms + REAL(KIND=c_double), POINTER :: dt + INTEGER(KIND=c_int64_t), POINTER :: ntimestep + REAL(KIND=c_double) :: pe, ke + + lmp = lammps() + CALL lmp%file('in.sysinit') + natoms = lmp%extract_global('natoms') + WRITE(OUTPUT_UNIT,'(A,I0,A)') 'Running a simulation with ', natoms, ' atoms' + WRITE(OUTPUT_UNIT,'(I0,A,I0,A,I0,A)') lmp%extract_setting('nlocal'), & + ' local and ', lmp%extract_setting('nghost'), ' ghost atoms. ', & + lmp%extract_setting('ntypes'), ' atom types' + + CALL lmp%command('run 2 post no') + dt = lmp%extract_global('dt') + ntimestep = lmp%extract_global('ntimestep') + WRITE(OUTPUT_UNIT,'(A,I0,A,F4.1,A)') 'At step: ', ntimestep, & + ' Changing timestep from', dt, ' to 0.5' + dt = 0.5_c_double + CALL lmp%command('run 2 post no') + + WRITE(OUTPUT_UNIT,'(A,I0)') 'At step: ', ntimestep + pe = lmp%get_thermo('pe') + ke = lmp%get_thermo('ke') + PRINT*, 'PE = ', pe + PRINT*, 'KE = ', ke + + CALL lmp%close(.TRUE.) + END PROGRAM testprop + +--------------- + +The :f:mod:`LIBLAMMPS` module API +********************************* + +.. f:module:: LIBLAMMPS Below are the detailed descriptions of definitions and interfaces -of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. +of the contents of the :f:mod:`LIBLAMMPS` Fortran interface to LAMMPS. + +.. f:currentmodule:: None .. f:type:: lammps - Derived type that is the general class of the Fortran interface. It - holds a reference to the :cpp:class:`LAMMPS ` - class instance that any of the included calls are forwarded to. + Derived type that is the general class of the Fortran interface. + It holds a reference to the :cpp:class:`LAMMPS ` + class instance to which any of the included calls are forwarded. - :f c_ptr handle: reference to the LAMMPS class - :f close: :f:func:`close` + :f handle: reference to the LAMMPS class + :ftype handle: c_ptr + :f style: derived type to access lammps style constants + :ftype style: type(lammps_style) + :f type: derived type to access lammps type constants + :ftype type: type(lammps_type) + :f close: :f:subr:`close` + :ftype close: subroutine + :f subroutine error: :f:subr:`error` + :ftype error: subroutine + :f file: :f:subr:`file` + :ftype file: subroutine + :f command: :f:subr:`command` + :ftype command: subroutine + :f commands_list: :f:subr:`commands_list` + :ftype commands_list: subroutine + :f commands_string: :f:subr:`commands_string` + :ftype commands_string: subroutine + :f get_natoms: :f:func:`get_natoms` + :ftype get_natoms: function + :f get_thermo: :f:func:`get_thermo` + :ftype get_thermo: function + :f extract_box: :f:subr:`extract_box` + :ftype extract_box: subroutine + :f reset_box: :f:subr:`reset_box` + :ftype reset_box: subroutine + :f memory_usage: :f:subr:`memory_usage` + :ftype memory_usage: subroutine + :f get_mpi_comm: :f:func:`get_mpi_comm` + :ftype get_mpi_comm: function + :f extract_setting: :f:func:`extract_setting` + :ftype extract_setting: function + :f extract_global: :f:func:`extract_global` + :ftype extract_global: function + :f extract_atom: :f:func:`extract_atom` + :ftype extract_atom: function + :f extract_compute: :f:func:`extract_compute` + :ftype extract_compute: function + :f extract_fix: :f:func:`extract_fix` + :ftype extract_fix: function + :f extract_variable: :f:func:`extract_variable` + :ftype extract_variable: function + :f gather_atoms: :f:subr:`gather_atoms` + :ftype gather_atoms: subroutine + :f gather_atoms_concat: :f:subr:`gather_atoms_concat` + :ftype gather_atoms_concat: subroutine + :f gather_atoms_subset: :f:subr:`gather_atoms_subset` + :ftype gather_atoms_subset: subroutine + :f scatter_atoms: :f:subr:`scatter_atoms` + :ftype scatter_atoms: subroutine + :f scatter_atoms_subset: :f:subr:`scatter_atoms_subset` + :ftype scatter_atoms_subset: subroutine + :f gather_bonds: :f:subr:`gather_bonds` + :ftype gather_bonds: subroutine + :f create_atoms: :f:subr:`create_atoms` + :ftype create_atoms: subroutine + :f find_pair_neighlist: :f:func:`find_pair_neighlist` + :ftype find_pair_neighlist: function + :f find_fix_neighlist: :f:func:`find_fix_neighlist` + :ftype find_fix_neighlist: function + :f find_compute_neighlist: :f:func:`find_compute_neighlist` + :ftype find_compute_neighlist: function + :f neighlist_num_elements: :f:func:`neighlist_num_elements` + :ftype neighlist_num_elements: function :f version: :f:func:`version` - :f file: :f:func:`file` - :f command: :f:func:`command` - :f commands_list: :f:func:`commands_list` - :f commands_string: :f:func:`commands_string` + :ftype version: function + :f get_os_info: :f:subr:`get_os_info` + :ftype get_os_info: subroutine + :f config_has_mpi_support: :f:func:`config_has_mpi_support` + :ftype config_has_mpi_support: function + :f config_has_gzip_support: :f:func:`config_has_gzip_support` + :ftype config_has_gzip_support: function + :f config_has_png_support: :f:func:`config_has_png_support` + :ftype config_has_png_support: function + :f config_has_jpeg_support: :f:func:`config_has_jpeg_support` + :ftype config_has_jpeg_support: function + :f config_has_ffmpeg_support: :f:func:`config_has_ffmpeg_support` + :ftype config_has_ffmpeg_support: function + :f config_has_exceptions: :f:func:`config_has_exceptions` + :ftype config_has_exceptions: function + :f config_has_package: :f:func:`config_has_package` + :ftype config_has_package: function + :f config_package_count: :f:func:`config_package_count` + :ftype config_package_count: function + :f config_package_name: :f:func:`config_package_name` + :ftype config_package_name: function + :f installed_packages: :f:subr:`installed_packages` + :ftype installed_packages: subroutine + :f config_accelerator: :f:func:`config_accelerator` + :ftype config_accelerator: function + :f has_gpu_device: :f:func:`has_gpu_device` + :ftype has_gpu_device: function + :f get_gpu_device_info: :f:subr:`get_gpu_device_info` + :ftype get_gpu_device_info: subroutine + :f has_style: :f:func:`has_style` + :ftype has_style: function + :f style_count: :f:func:`style_count` + :ftype style_count: function + :f style_name: :f:func:`style_name` + :ftype style_name: function + :f has_id: :f:func:`has_id` + :ftype has_id: function + :f id_count: :f:func:`id_count` + :ftype id_count: function + :f id_name: :f:subr:`id_name` + :ftype id_name: subroutine + :f plugin_count: :f:func:`plugin_count` + :ftype plugin_count: function + :f plugin_name: :f:subr:`plugin_name` + :ftype plugin_count: subroutine + :f encode_image_flags: :f:func:`encode_image_flags` + :ftype encode_image_flags: function + :f decode_image_flags: :f:subr:`decode_image_flags` + :ftype decode_image_flags: subroutine + :f flush_buffers: :f:subr:`flush_buffers` + :ftype flush_buffers: subroutine + :f is_running: :f:func:`is_running` + :ftype is_running: function + :f force_timeout: :f:subr:`force_timeout` + :ftype force_timeout: subroutine + :f has_error: :f:func:`has_error` + :ftype has_error: function + :f get_last_error_message: :f:subr:`get_last_error_message` + :ftype get_last_error_message: subroutine -.. f:function:: lammps(args[,comm]) +-------- + +.. f:function:: lammps([args][,comm]) This is the constructor for the Fortran class and will forward the arguments to a call to either :cpp:func:`lammps_open_fortran` @@ -198,24 +384,89 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. If *comm* is not provided, ``MPI_COMM_WORLD`` is assumed. For more details please see the documentation of :cpp:func:`lammps_open`. - :p character(len=*) args(*) [optional]: arguments as list of strings - :o integer comm [optional]: MPI communicator + :o args: arguments as list of strings + :otype args: character(len=\*),dimension(:),optional + :o comm: MPI communicator + :otype comm: integer,optional + :to: :cpp:func:`lammps_open_fortran` + :to: :cpp:func:`lammps_open_no_mpi` :r lammps: an instance of the :f:type:`lammps` derived type + .. note:: + + The :f:mod:`MPI_F08` module, which defines Fortran 2008 bindings for MPI, + is not directly supported by this interface due to the complexities of + supporting both the :f:mod:`MPI_F08` and :f:mod:`MPI` modules at the same + time. However, you should be able to use the ``MPI_VAL`` member of the + ``MPI_comm`` derived type to access the integer value of the + communicator, such as in + + .. code-block:: fortran + + PROGRAM testmpi + USE LIBLAMMPS + USE MPI_F08 + TYPE(lammps) :: lmp + lmp = lammps(MPI_COMM_SELF%MPI_VAL) + END PROGRAM testmpi + +.. f:type:: lammps_style + + This derived type is there to provide a convenient interface for the style + constants used with :f:func:`extract_compute`, :f:func:`extract_fix`, and + :f:func:`extract_variable`. Assuming your LAMMPS instance is called ``lmp``, + these constants will be ``lmp%style%global``, ``lmp%style%atom``, + and ``lmp%style%local``. These values are identical to the values described + in :cpp:enum:`_LMP_STYLE_CONST` for the C library interface. + + :f integer(c_int) global: used to request global data + :f integer(c_int) atom: used to request per-atom data + :f integer(c_int) local: used to request local data + +.. f:type:: lammps_type + + This derived type is there to provide a convenient interface for the type + constants used with :f:func:`extract_compute`, :f:func:`extract_fix`, and + :f:func:`extract_variable`. Assuming your LAMMPS instance is called ``lmp``, + these constants will be ``lmp%type%scalar``, ``lmp%type%vector``, and + ``lmp%type%array``. These values are identical to the values described + in :cpp:enum:`_LMP_TYPE_CONST` for the C library interface. + + :f integer(c_int) scalar: used to request scalars + :f integer(c_int) vector: used to request vectors + :f integer(c_int) array: used to request arrays (matrices) + +Procedures Bound to the :f:type:`lammps` Derived Type +===================================================== + .. f:subroutine:: close([finalize]) This method will close down the LAMMPS instance through calling :cpp:func:`lammps_close`. If the *finalize* argument is present and - has a value of ``.true.``, then this subroutine also calls + has a value of ``.TRUE.``, then this subroutine also calls + :cpp:func:`lammps_kokkos_finalize` and :cpp:func:`lammps_mpi_finalize`. - :o logical finalize [optional]: shut down the MPI environment of the LAMMPS library if true. + :o finalize: shut down the MPI environment of the LAMMPS + library if ``.TRUE.``. + :otype finalize: logical,optional + :to: :cpp:func:`lammps_close` + :to: :cpp:func:`lammps_mpi_finalize` + :to: :cpp:func:`lammps_kokkos_finalize` -.. f:function:: version() +-------- - This method returns the numeric LAMMPS version like :cpp:func:`lammps_version` +.. f:subroutine:: error(error_type, error_text) - :r integer: LAMMPS version + This method is a wrapper around the :cpp:func:`lammps_error` function and + will dispatch an error through the LAMMPS Error class. + + .. versionadded:: 3Nov2022 + + :p error_type: constant to select which Error class function to call + :ptype error_type: integer(c_int) + :p character(len=\*) error_text: error message + :to: :cpp:func:`lammps_error` -------- @@ -224,25 +475,1715 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. This method will call :cpp:func:`lammps_file` to have LAMMPS read and process commands from a file. - :p character(len=*) filename: name of file with LAMMPS commands + :p character(len=\*) filename: name of file with LAMMPS commands + :to: :cpp:func:`lammps_file` + +-------- .. f:subroutine:: command(cmd) This method will call :cpp:func:`lammps_command` to have LAMMPS execute a single command. - :p character(len=*) cmd: single LAMMPS command + :p character(len=\*) cmd: single LAMMPS command + :to: :cpp:func:`lammps_command` + +-------- .. f:subroutine:: commands_list(cmds) This method will call :cpp:func:`lammps_commands_list` to have LAMMPS execute a list of input lines. - :p character(len=*) cmd(:): list of LAMMPS input lines + :p character(len=\*) cmd [dimension(:)]: list of LAMMPS input lines + :to: :cpp:func:`lammps_commands_list` + +-------- .. f:subroutine:: commands_string(str) This method will call :cpp:func:`lammps_commands_string` to have LAMMPS execute a block of commands from a string. - :p character(len=*) str: LAMMPS input in string + :p character(len=\*) str: LAMMPS input in string + :to: :cpp:func:`lammps_commands_string` + +-------- + +.. f:function:: get_natoms() + + This function will call :cpp:func:`lammps_get_natoms` and return the number + of atoms in the system. + + :to: :cpp:func:`lammps_get_natoms` + :r real(c_double) natoms: number of atoms + + .. note:: + + If you would prefer to get the number of atoms in its native format + (i.e., as a 32- or 64-bit integer, depending on how LAMMPS was compiled), + this can be extracted with :f:func:`extract_global`. + +-------- + +.. f:function:: get_thermo(name) + + This function will call :cpp:func:`lammps_get_thermo` and return the value + of the corresponding thermodynamic keyword. + + .. versionadded:: 3Nov2022 + + :p character(len=\*) name: string with the name of the thermo keyword + :to: :cpp:func:`lammps_get_thermo` + :r value [real(c_double)]: value of the requested thermo property or `0.0_c_double` + +-------- + +.. f:subroutine:: extract_box([boxlo][, boxhi][, xy][, yz][, xz][, pflags][, boxflag]) + + This subroutine will call :cpp:func:`lammps_extract_box`. All + parameters are optional, though obviously at least one should be + present. The parameters *pflags* and *boxflag* are stored in LAMMPS + as integers, but should be declared as ``LOGICAL`` variables when + calling from Fortran. + + .. versionadded:: 3Nov2022 + + :o real(c_double) boxlo [dimension(3),optional]: vector in which to store + lower-bounds of simulation box + :o real(c_double) boxhi [dimension(3),optional]: vector in which to store + upper-bounds of simulation box + :o real(c_double) xy [optional]: variable in which to store *xy* tilt factor + :o real(c_double) yz [optional]: variable in which to store *yz* tilt factor + :o real(c_double) xz [optional]: variable in which to store *xz* tilt factor + :o pflags: vector in which to store + periodicity flags (``.TRUE.`` means periodic in that dimension) + :otype pflags: logical,dimension(3),optional + :o boxflag: variable in which to store boolean denoting + whether the box will change during a simulation + (``.TRUE.`` means box will change) + :otype boxflag: logical,optional + :to: :cpp:func:`lammps_extract_box` + +.. note:: + + Note that a frequent use case of this function is to extract only one or + more of the options rather than all seven. For example, assuming "lmp" + represents a properly-initialized LAMMPS instance, the following code will + extract the periodic box settings into the variable "periodic": + + .. code-block:: fortran + + ! code to start up + logical :: periodic(3) + ! code to initialize LAMMPS / run things / etc. + call lmp%extract_box(pflags = periodic) + +-------- + +.. f:subroutine:: reset_box(boxlo, boxhi, xy, yz, xz) + + This subroutine will call :cpp:func:`lammps_reset_box`. All parameters + are required. + + .. versionadded:: 3Nov2022 + + :p real(c_double) boxlo [dimension(3)]: vector of three doubles containing + the lower box boundary + :p real(c_double) boxhi [dimension(3)]: vector of three doubles containing + the upper box boundary + :p real(c_double) xy: *x--y* tilt factor + :p real(c_double) yz: *y--z* tilt factor + :p real(c_double) xz: *x--z* tilt factor + :to: :cpp:func:`lammps_reset_box` + +-------- + +.. f:subroutine:: memory_usage(meminfo) + + This subroutine will call :cpp:func:`lammps_memory_usage` and store the + result in the three-element array *meminfo*. + + .. versionadded:: 3Nov2022 + + :p real(c_double) meminfo [dimension(3)]: vector of three doubles in which + to store memory usage data + :to: :cpp:func:`lammps_memory_usage` + +-------- + +.. f:function:: get_mpi_comm() + + This function returns a Fortran representation of the LAMMPS "world" + communicator. + + .. versionadded:: 3Nov2022 + + :to: :cpp:func:`lammps_get_mpi_comm` + :r comm: Fortran integer equivalent to the MPI communicator LAMMPS is + using + :rtype comm: integer + + .. note:: + + The C library interface currently returns type ``int`` instead of + type ``MPI_Fint``, which is the C type corresponding to Fortran + ``INTEGER`` types of the default kind. On most compilers, these + are the same anyway, but this interface exchanges values this way + to avoid warning messages. + + .. note:: + + The :f:mod:`MPI_F08` module, which defines Fortran 2008 bindings for MPI, + is not directly supported by this function. However, you should be + able to convert between the two using the `MPI_VAL` member of the + communicator. For example, + + .. code-block:: fortran + + USE MPI_F08 + USE LIBLAMMPS + TYPE (lammps) :: lmp + TYPE (MPI_Comm) :: comm + ! ... [commands to set up LAMMPS/etc.] + comm%MPI_VAL = lmp%get_mpi_comm() + + should assign an :f:mod:`MPI_F08` communicator properly. + +-------- + +.. f:function:: extract_setting(keyword) + + Query LAMMPS about global settings. See the documentation for the + :cpp:func:`lammps_extract_setting` function from the C library. + + .. versionadded:: 3Nov2022 + + :p character(len=\*) keyword: string containing the name of the thermo keyword + :to: :cpp:func:`lammps_extract_setting` + :r integer(c_int) setting: value of the queried setting or :math:`-1` if + unknown + +-------- + +.. f:function:: extract_global(name) + + This function calls :cpp:func:`lammps_extract_global` and returns + either a string or a pointer to internal global LAMMPS data, + depending on the data requested through *name*. + + .. versionadded:: 3Nov2022 + + Note that this function actually does not return a value, but rather + associates the pointer on the left side of the assignment to point to + internal LAMMPS data (with the exception of string data, which are + copied and returned as ordinary Fortran strings). Pointers must be of + the correct data type to point to said data (typically + ``INTEGER(c_int)``, ``INTEGER(c_int64_t)``, or ``REAL(c_double)``) + and have compatible kind and rank. The pointer being associated with + LAMMPS data is type-, kind-, and rank-checked at run-time via an + overloaded assignment operator. The pointers returned by this + function are generally persistent; therefore it is not necessary to + call the function again, unless a :doc:`clear` command has been + issued, which wipes out and recreates the contents of the + :cpp:class:`LAMMPS ` class. + + For example, + + .. code-block:: fortran + + PROGRAM demo + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t, c_int, c_double + USE LIBLAMMPS + TYPE(lammps) :: lmp + INTEGER(c_int), POINTER :: nlocal => NULL() + INTEGER(c_int64_t), POINTER :: ntimestep => NULL() + REAL(c_double), POINTER :: dt => NULL() + CHARACTER(LEN=10) :: units + lmp = lammps() + ! other commands + nlocal = lmp%extract_global('nlocal') + ntimestep = lmp%extract_global('ntimestep') + dt = lmp%extract_global('dt') + units = lmp%extract_global('units') + ! more commands + lmp.close(.TRUE.) + END PROGRAM demo + + would extract the number of atoms on this processor, the current time step, + the size of the current time step, and the units being used into the + variables *nlocal*, *ntimestep*, *dt*, and *units*, respectively. + + .. note:: + + If :f:func:`extract_global` returns a string, the string must have length + greater than or equal to the length of the string (not including the + terminal ``NULL`` character) that LAMMPS returns. If the variable's + length is too short, the string will be truncated. As usual in Fortran, + strings are padded with spaces at the end. If you use an allocatable + string, the string **must be allocated** prior to calling this function, + but you can automatically reallocate it to the correct length after the + function returns, viz., + + .. code-block :: fortran + + PROGRAM test + USE LIBLAMMPS + TYPE(lammps) :: lmp + CHARACTER(LEN=:), ALLOCATABLE :: str + lmp = lammps() + CALL lmp%command('units metal') + ALLOCATE ( CHARACTER(LEN=80) :: str ) + str = lmp%extract_global('units') + str = TRIM(str) ! re-allocates to length len_trim(str) here + PRINT*, LEN(str), LEN_TRIM(str) + END PROGRAM test + + will print the number 5 (the length of the word "metal") twice. + + :p character(len=\*) name: string with the name of the property to extract + :to: :cpp:func:`lammps_extract_global` + :r pointer [polymorphic]: pointer to LAMMPS data. The left-hand side of the + assignment should be either a string (if expecting string data) or a + C-compatible pointer (e.g., ``INTEGER(c_int), POINTER :: nlocal``) to the + extracted property. If expecting vector data, the pointer should have + dimension ":". + + .. warning:: + + Modifying the data in the location pointed to by the returned pointer + may lead to inconsistent internal data and thus may cause failures, + crashes, or bogus simulations. In general, it is much better + to use a LAMMPS input command that sets or changes these parameters. + Using an input command will take care of all side effects and necessary + updates of settings derived from such settings. + +-------- + +.. f:function:: extract_atom(name) + + This function calls :cpp:func:`lammps_extract_atom` and returns a pointer to + LAMMPS data tied to the :cpp:class:`Atom` class, depending on the data + requested through *name*. + + .. versionadded:: 3Nov2022 + + Note that this function actually does not return a pointer, but rather + associates the pointer on the left side of the assignment to point + to internal LAMMPS data. Pointers must be of the correct type, kind, and + rank (e.g., ``INTEGER(c_int), DIMENSION(:)`` for "type", "mask", or "tag"; + ``INTEGER(c_int64_t), DIMENSION(:)`` for "tag" if LAMMPS was compiled + with the ``-DLAMMPS_BIGBIG`` flag; ``REAL(c_double), DIMENSION(:,:)`` for + "x", "v", or "f"; and so forth). The pointer being associated with LAMMPS + data is type-, kind-, and rank-checked at run-time. + + :p character(len=\*) name: string with the name of the property to extract + :to: :cpp:func:`lammps_extract_atom` + :r pointer: pointer to LAMMPS data. The left-hand side of the + assignment should be a C-interoperable pointer of appropriate kind and rank + (e.g., ``INTEGER(c_int), POINTER :: mask(:)``) to the extracted + property. If expecting vector data, the pointer should have dimension ":"; + if expecting matrix data, the pointer should have dimension ":,:". + :rtype pointer: polymorphic + + .. warning:: + + Pointers returned by this function are generally not persistent, as + per-atom data may be redistributed, reallocated, and reordered at every + re-neighboring operation. It is advisable to re-bind pointers using + :f:func:`extract_atom` between runs. + + .. admonition:: Array index order + + Two-dimensional arrays returned from :f:func:`extract_atom` will be + **transposed** from equivalent arrays in C, and they will be indexed + from 1 instead of 0. For example, in C, + + .. code-block:: c + + void *lmp; + double **x; + /* more code to setup, etc. */ + x = lammps_extract_atom(lmp, "x"); + printf("%f\n", x[5][1]); + + will print the *y*-coordinate of the sixth atom on this processor. + Conversely, + + .. code-block:: fortran + + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:,:), POINTER :: x => NULL() + ! more code to setup, etc. + x = lmp%extract_atom("x") + PRINT '(f0.6)', x(2,6) + + will print the *y*-coordinate of the sixth atom on this processor + (note the transposition of the two indices). This is not a choice, but + rather a consequence of the different conventions adopted by the Fortran + and C standards decades ago: in C, the block of data + + .. parsed-literal:: + + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + + interpreted as a :math:`4\times4` matrix would be + + .. math:: + + \begin{bmatrix} + 1 & 2 & 3 & 4 \\ + 5 & 6 & 7 & 8 \\ + 9 & 10 & 11 & 12 \\ + 13 & 14 & 15 & 16 + \end{bmatrix}, + + that is, in row-major order. In Fortran, the same block of data is + interpreted in column-major order, namely, + + .. math:: + + \begin{bmatrix} + 1 & 5 & 9 & 13 \\ + 2 & 6 & 10 & 14 \\ + 3 & 7 & 11 & 15 \\ + 4 & 8 & 12 & 16 + \end{bmatrix}. + + This difference in interpretation of the same block of data by the two + languages means, in effect, that matrices from C or C++ will be + transposed when interpreted in Fortran. + + .. note:: + + If you would like the indices to start at 0 instead of 1 (which follows + typical notation in C and C++, but not Fortran), you can create another + pointer and associate it thus: + + .. code-block:: fortran + + REAL(c_double), DIMENSION(:,:), POINTER :: x, x0 + x = lmp%extract_atom("x") + x0(0:,0:) => x + + The above would cause the dimensions of *x* to be (1:3, 1:nmax) + and those of *x0* to be (0:2, 0:nmax\ :math:`-`\ 1). + +-------- + +.. f:function:: extract_compute(id, style, type) + + This function calls :cpp:func:`lammps_extract_compute` and returns a pointer + to LAMMPS data tied to the :cpp:class:`Compute` class, specifically data + provided by the compute identified by *id*. Computes may provide global, + per-atom, or local data, and those data may be a scalar, a vector, or an + array. Since computes may provide multiple kinds of data, the user is + required to specify which set of data is to be returned through the + *style* and *type* variables. + + .. versionadded:: 3Nov2022 + + Note that this function actually does not return a value, but rather + associates the pointer on the left side of the assignment to point to + internal LAMMPS data. Pointers must be of the correct data type to point to + said data (i.e., ``REAL(c_double)``) and have compatible rank. The pointer + being associated with LAMMPS data is type-, kind-, and rank-checked at + run-time via an overloaded assignment operator. + + For example, + + .. code-block:: fortran + + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:), POINTER :: COM + ! code to setup, create atoms, etc. + CALL lmp%compute('compute COM all com') + COM = lmp%extract_compute('COM', lmp%style%global, lmp%style%type) + + will bind the variable *COM* to the center of mass of the atoms created in + your simulation. The vector in this case has length 3; the length (or, in + the case of array data, the number of rows and columns) is determined for + you based on data from the :cpp:class:`Compute` class. + + .. admonition:: Array index order + + Two-dimensional arrays returned from :f:func:`extract_compute` will be + **transposed** from equivalent arrays in C, and they will be indexed + from 1 instead of 0. See the note at :f:func:`extract_atom` for + further details. + + The following combinations are possible (assuming ``lmp`` is the name of + your LAMMPS instance): + + .. list-table:: + :header-rows: 1 + :widths: auto + + * - Style + - Type + - Type to assign to + - Returned data + * - ``lmp%style%global`` + - ``lmp%type%scalar`` + - ``REAL(c_double), POINTER`` + - Global scalar + * - ``lmp%style%global`` + - ``lmp%type%vector`` + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Global vector + * - ``lmp%style%global`` + - ``lmp%type%array`` + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Global array + * - ``lmp%style%atom`` + - ``lmp%type%vector`` + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Per-atom vector + * - ``lmp%style%atom`` + - ``lmp%type%array`` + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Per-atom array + * - ``lmp%style%local`` + - ``lmp%type%vector`` + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Local vector + * - ``lmp%style%local`` + - ``lmp%type%array`` + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Local array + + :p character(len=\*) id: compute ID from which to extract data + :p integer(c_int) style: value indicating the style of data to extract + (global, per-atom, or local) + :p integer(c_int) type: value indicating the type of data to extract + (scalar, vector, or array) + :to: :cpp:func:`lammps_extract_compute` + :r pointer: pointer to LAMMPS data. The left-hand side of the assignment + should be a C-compatible pointer (e.g., ``REAL(c_double), POINTER :: x``) + to the extracted property. If expecting vector data, the pointer should + have dimension ":"; if expecting array (matrix) data, the pointer should + have dimension ":,:". + :rtype pointer: polymorphic + + .. note:: + + If the compute's data are not already computed for the current step, the + compute will be invoked. LAMMPS cannot easily check at that time if it is + valid to invoke a compute, so it may fail with an error. The caller has + to check to avoid such an error. + + .. warning:: + + The pointers returned by this function are generally not persistent, + since the computed data may be re-distributed, re-allocated, and + re-ordered at every invocation. It is advisable to re-invoke this + function before the data are accessed or make a copy if the data are to + be used after other LAMMPS commands have been issued. Do **not** modify + the data returned by this function. + +-------- + +.. f:function:: extract_fix(id, style, type[, nrow][, ncol]) + + This function calls :cpp:func:`lammps_extract_fix` and returns a pointer to + LAMMPS data tied to the :cpp:class:`Fix` class, specifically data provided + by the fix identified by *id*. Fixes may provide global, per-atom, or + local data, and those data may be a scalar, a vector, or an array. Since + many fixes provide multiple kinds of data, the user is required to specify + which set of data is to be returned through the *style* and *type* + variables. + + .. versionadded:: 3Nov2022 + + Global data are calculated at the time they are requested and are only + available element-by-element. As such, the user is expected to provide + the *nrow* variable to specify which element of a global vector or the + *nrow* and *ncol* variables to specify which element of a global array the + user wishes LAMMPS to return. The *ncol* variable is optional for global + scalar or vector data, and both *nrow* and *ncol* are optional when a + global scalar is requested, as well as when per-atom or local data are + requested. The following combinations are possible (assuming ``lmp`` is the + name of your LAMMPS instance): + + .. list-table:: + :header-rows: 1 + :widths: auto + + * - Style + - Type + - nrow + - ncol + - Type to assign to + - Returned data + * - ``lmp%style%global`` + - ``lmp%type%scalar`` + - Ignored + - Ignored + - ``REAL(c_double)`` + - Global scalar + * - ``lmp%style%global`` + - ``lmp%type%vector`` + - Required + - Ignored + - ``REAL(c_double)`` + - Element of global vector + * - ``lmp%style%global`` + - ``lmp%type%array`` + - Required + - Required + - ``REAL(c_double)`` + - Element of global array + * - ``lmp%style%atom`` + - ``lmp%type%scalar`` + - + - + - + - (not allowed) + * - ``lmp%style%atom`` + - ``lmp%type%vector`` + - Ignored + - Ignored + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Per-atom vector + * - ``lmp%style%atom`` + - ``lmp%type%array`` + - Ignored + - Ignored + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Per-atom array + * - ``lmp%style%local`` + - ``lmp%type%scalar`` + - + - + - + - (not allowed) + * - ``lmp%style%local`` + - ``lmp%type%vector`` + - Ignored + - Ignored + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Per-atom vector + * - ``lmp%style%local`` + - ``lmp%type%array`` + - Ignored + - Ignored + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Per-atom array + + In the case of global data, this function returns a value of type + ``real(c_double)``. For per-atom or local data, this function does not + return a value but instead associates the pointer on the left side of the + assignment to point to internal LAMMPS data. Pointers must be of the correct + data type to point to said data (i.e., ``REAL(c_double)``) and have + compatible rank. The pointer being associated with LAMMPS data is type-, + kind-, and rank-checked at run-time via an overloaded assignment operator. + + For example, + + .. code-block:: fortran + + TYPE(lammps) :: lmp + REAL(c_double) :: dr, dx, dy, dz + ! more code to set up, etc. + lmp%command('fix george all recenter 2 2 2') + ! more code + dr = lmp%extract_fix("george", lmp%style%global, lmp%style%scalar) + dx = lmp%extract_fix("george", lmp%style%global, lmp%style%vector, 1) + dy = lmp%extract_fix("george", lmp%style%global, lmp%style%vector, 2) + dz = lmp%extract_fix("george", lmp%style%global, lmp%style%vector, 3) + + will extract the global scalar calculated by + :doc:`fix recenter ` into the variable *dr* and the + three elements of the global vector calculated by fix recenter into the + variables *dx*, *dy*, and *dz*, respectively. + + If asked for per-atom or local data, :f:func:`extract_compute` returns a + pointer to actual LAMMPS data. The pointer so returned will have the + appropriate size to match the internal data, and will be + type/kind/rank-checked at the time of the assignment. For example, + + .. code-block:: fortran + + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:), POINTER :: r + ! more code to set up, etc. + lmp%command('fix state all store/state 0 x y z') + ! more code + r = lmp%extract_fix('state', lmp%style%atom, lmp%type%array) + + will bind the pointer *r* to internal LAMMPS data representing the per-atom + array computed by :doc:`fix store/state ` when three + inputs are specified. Similarly, + + .. code-block:: fortran + + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:), POINTER :: x + ! more code to set up, etc. + lmp%command('fix state all store/state 0 x') + ! more code + x = lmp%extract_fix('state', lmp%style%atom, lmp%type%vector) + + will associate the pointer *x* with internal LAMMPS data corresponding to + the per-atom vector computed by :doc:`fix store/state ` + when only one input is specified. Similar examples with ``lmp%style%atom`` + replaced by ``lmp%style%local`` will extract local data from fixes that + define local vectors and/or arrays. + + .. warning:: + + The pointers returned by this function for per-atom or local data are + generally not persistent, since the computed data may be redistributed, + reallocated, and reordered at every invocation of the fix. It is thus + advisable to re-invoke this function before the data are accessed or to + make a copy if the data are to be used after other LAMMPS commands have + been issued. + + .. note:: + + LAMMPS cannot easily check if it is valid to access the data, so it + may fail with an error. The caller has to avoid such an error. + + :p character(len=\*) id: string with the name of the fix from which + to extract data + :p integer(c_int) style: value indicating the style of data to extract + (global, per-atom, or local) + :p integer(c_int) type: value indicating the type of data to extract + (scalar, vector, or array) + :p integer(c_int) nrow: row index (used only for global vectors and arrays) + :p integer(c_int) ncol: column index (only used for global arrays) + :to: :cpp:func:`lammps_extract_fix` + :r data: LAMMPS data (for global data) or a pointer to LAMMPS data + (for per-atom or local data). The left-hand side of the assignment should + be of type ``REAL(c_double)`` and have appropriate rank (i.e., + ``DIMENSION(:)`` if expecting per-atom or local vector data and + ``DIMENSION(:,:)`` if expecting per-atom or local array data). If expecting + local or per-atom data, it should have the ``POINTER`` attribute, but + if expecting global data, it should be an ordinary (non-``POINTER``) + variable. + :rtype data: polymorphic + + .. admonition:: Array index order + + Two-dimensional global, per-atom, or local array data from + :f:func:`extract_fix` will be **transposed** from equivalent arrays in + C (or in the ordinary LAMMPS interface accessed through thermodynamic + output), and they will be indexed from 1, not 0. This is true even for + global data, which are returned as scalars---this is done primarily so + the interface is consistent, as there is no choice but to transpose the + indices for per-atom or local array data. See the similar note under + :f:func:`extract_atom` for further details. + +-------- + +.. f:function:: extract_variable(name[,group]) + + This function calls :cpp:func:`lammps_extract_variable` and returns a scalar, + vector, or string containing the value of the variable identified by + *name*. When the variable is an *equal*-style variable (or one compatible + with that style such as *internal*), the variable is evaluated and the + corresponding value returned. When the variable is an *atom*-style variable, + the variable is evaluated and a vector of values is returned. With all + other variables, a string is returned. The *group* argument is only used + for *atom* style variables and is ignored otherwise. If *group* is absent + for *atom*-style variables, the group is assumed to be "all". + + .. versionadded:: 3Nov2022 + + This function returns the values of the variables, not pointers to them. + Vectors pointing to *atom*-style variables should be of type + ``REAL(c_double)``, be of rank 1 (i.e., ``DIMENSION(:)``), and have the + ``ALLOCATABLE`` attribute. + + .. note:: + + Unlike the C library interface, the Fortran interface does not require + you to deallocate memory when you are through; this is done for you, + behind the scenes. + + For example, + + .. code-block:: fortran + + TYPE(lammps) :: lmp + REAL(c_double) :: area + ! more code to set up, etc. + lmp%command('variable A equal lx*ly') + ! more code + area = lmp%extract_variable("A") + + will extract the *x*\ --*y* cross-sectional area of the simulation into the + variable *area*. + + :p character(len=\*) name: variable name to evaluate + :o character(len=\*) group [optional]: group for which to extract per-atom + data (if absent, use "all") + :to: :cpp:func:`lammps_extract_variable` + :r data: scalar of type ``REAL(c_double)`` (for *equal*-style + variables and others that are *equal*-compatible), vector of type + ``REAL(c_double), DIMENSION(:), ALLOCATABLE`` for *atom*- or *vector*-style + variables, or ``CHARACTER(LEN=*)`` for *string*-style and compatible + variables. Strings whose length is too short to hold the result will be + truncated. Allocatable strings must be allocated before this function is + called; see note at :f:func:`extract_global` regarding allocatable strings. + Allocatable arrays (for *atom*- and *vector*-style data) will be + reallocated on assignment. + :rtype data: polymorphic + +.. note:: + + LAMMPS cannot easily check if it is valid to access the data + referenced by the variables (e.g., computes, fixes, or thermodynamic + info), so it may fail with an error. The caller has to make certain + that the data are extracted only when it is safe to evaluate the variable + and thus an error and crash are avoided. + +-------- + +.. f:subroutine:: gather_atoms(name, count, data) + + This function calls :cpp:func:`lammps_gather_atoms` to gather the named + atom-based entity for all atoms on all processors and return it in the + vector *data*. The vector *data* will be ordered by atom + ID, which requires consecutive atom IDs (1 to *natoms*). + + .. versionadded:: 3Nov2022 + + If you need a similar array but have non-consecutive atom IDs, see + :f:func:`gather_atoms_concat`; for a similar array but for a subset + of atoms, see :f:func:`gather_atoms_subset`. + + The *data* array will be ordered in groups of *count* values, sorted by atom + ID (e.g., if *name* is *x* and *count* = 3, then *data* = x[1][1], x[2][1], + x[3][1], x[1][2], x[2][2], x[3][2], x[1][3], :math:`\dots`); + *data* must be ``ALLOCATABLE`` and will be allocated to length + (*count* :math:`\times` *natoms*), as queried by + :f:func:`extract_setting`. + + :p character(len=\*) name: desired quantity (e.g., *x* or *mask*) + :p integer(c_int) count: number of per-atom values you expect per atom + (e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use + *count* = 3 with *image* if you want a single image flag unpacked into + *x*/*y*/*z* components. + :p real(c_double) data [dimension(:),allocatable]: array into which to store + the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1 + (i.e., ``DIMENSION(:)``). If this array is already allocated, it will be + reallocated to fit the length of the incoming data. + :to: :cpp:func:`lammps_gather_atoms` + + .. note:: + + If you want data from this function to be accessible as a two-dimensional + array, you can declare a rank-2 pointer and reassign it, like so: + + .. code-block:: fortran + + USE, INTRINSIC :: ISO_C_BINDING + USE LIBLAMMPS + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET :: xdata + REAL(c_double), DIMENSION(:,:), POINTER :: x + ! other code to set up, etc. + CALL lmp%gather_atoms('x',3,xdata) + x(1:3,1:size(xdata)/3) => xdata + + You can then access the *y*\ -component of atom 3 with ``x(2,3)``. + See the note about array index order at :f:func:`extract_atom`. + +-------- + +.. f:subroutine:: gather_atoms_concat(name, count, data) + + This function calls :cpp:func:`lammps_gather_atoms_concat` to gather the + named atom-based entity for all atoms on all processors and return it in the + vector *data*. + + .. versionadded:: 3Nov2022 + + The vector *data* will not be ordered by atom ID, and there is no + restriction on the IDs being consecutive. If you need the IDs, you can do + another :f:func:`gather_atoms_concat` with *name* set to ``id``. + + If you need a similar array but have consecutive atom IDs, see + :f:func:`gather_atoms`; for a similar array but for a subset of atoms, see + :f:func:`gather_atoms_subset`. + + :p character(len=\*) name: desired quantity (e.g., *x* or *mask*) + :p integer(c_int) count: number of per-atom values you expect per atom + (e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use + *count* = 3 with *image* if you want a single image flag unpacked into + *x*/*y*/*z* components. + :p real(c_double) data [dimension(:),allocatable]: array into which to store + the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1 + (i.e., ``DIMENSION(:)``). If this array is already allocated, it will be + reallocated to fit the length of the incoming data. + :to: :cpp:func:`lammps_gather_atoms_concat` + +-------- + +.. f:subroutine:: gather_atoms_subset(name, count, ids, data) + + This function calls :cpp:func:`lammps_gather_atoms_subset` to gather the + named atom-based entity for the atoms in the array *ids* from all processors + and return it in the vector *data*. + + .. versionadded:: 3Nov2022 + + This subroutine gathers data for the requested atom IDs and stores them in a + one-dimensional array allocated by the user. The data will be ordered by + atom ID, but there is no requirement that the IDs be consecutive. If you + wish to return a similar array for *all* the atoms, use + :f:func:`gather_atoms` or :f:func:`gather_atoms_concat`. + + The *data* array will be in groups of *count* values, sorted by atom ID + in the same order as the array *ids* (e.g., if *name* is *x*, *count* = 3, + and *ids* is [100, 57, 210], then *data* might look like + [x(1,100), x(2,100), x(3,100), x(1,57), x(2,57), x(3,57), x(1,210), + :math:`\dots`]; *ids* must be provided by the user, and *data* must be + of rank 1 (i.e., ``DIMENSION(:)``) and have the ``ALLOCATABLE`` attribute. + + :p character(len=\*) name: desired quantity (e.g., *x* or *mask*) + :p integer(c_int) count: number of per-atom values you expect per atom + (e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use + *count* = 3 with *image* if you want a single image flag unpacked into + *x*/*y*/*z* components. + :p integer(c_int) ids [dimension(:)]: atom IDs corresponding to the atoms + to be gathered + :p real(c_double) data [dimension(:),allocatable]: array into which to store + the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1 + (i.e., ``DIMENSION(:)``). If this array is already allocated, it will be + reallocated to fit the length of the incoming data. + :to: :cpp:func:`lammps_gather_atoms_subset` + +-------- + +.. f:subroutine:: scatter_atoms(name, data) + + This function calls :cpp:func:`lammps_scatter_atoms` to scatter the named + atom-based entities in *data* to all processors. + + .. versionadded:: 3Nov2022 + + This subroutine takes data stored in a one-dimensional array supplied by the + user and scatters them to all atoms on all processors. The data must be + ordered by atom ID, with the requirement that the IDs be consecutive. + Use :f:func:`scatter_atoms_subset` to scatter data for some (or all) + atoms, in any order. + + The *data* array needs to be ordered in groups of *count* values, sorted by + atom ID (e.g., if *name* is *x* and *count* = 3, then + *data* = [x(1,1) x(2,1) x(3,1) x(1,2) x(2,2) x(3,2) x(1,3) :math:`\dots`]; + *data* must be of length (*count* :math:`\times` *natoms*). + + :p character(len=\*) name: quantity to be scattered (e.g., *x* or *charge*) + :p data: per-atom values packed in a one-dimensional array + containing the data to be scattered. This array must have length *natoms* + (e.g., for *type* or *charge*) or length *natoms*\ :math:`\times 3` + (e.g., for *x* or *f*). The array *data* must be rank 1 (i.e., + ``DIMENSION(:)``) and be of type ``INTEGER(c_int)`` (e.g., for *mask* or + *type*) or of type ``REAL(c_double)`` (e.g., for *x* or *charge* or *f*). + :ptype data: polymorphic,dimension(:) + :to: :cpp:func:`lammps_scatter_atoms` + +-------- + +.. f:subroutine:: scatter_atoms_subset(name, ids, data) + + This function calls :cpp:func:`lammps_scatter_atoms_subset` to scatter the + named atom-based entities in *data* to all processors. + + .. versionadded:: 3Nov2022 + + This subroutine takes data stored in a one-dimensional array supplied by the + user and scatters them to a subset of atoms on all processors. The array + *data* contains data associated with atom IDs, but there is no requirement + that the IDs be consecutive, as they are provided in a separate array, + *ids*. Use :f:func:`scatter_atoms` to scatter data for all atoms, in order. + + The *data* array needs to be organized in groups of 1 or 3 values, + depending on which quantity is being scattered, with the groups in the same + order as the array *ids*. For example, if you want *data* to be the array + [x(1,1) x(2,1) x(3,1) x(1,100) x(2,100) x(3,100) x(1,57) x(2,57) x(3,57)], + then *ids* would be [1 100 57] and *name* would be *x*. + + :p character(len=\*) name: quantity to be scattered (e.g., *x* or *charge*) + :p integer(c_int) ids [dimension(:)]: atom IDs corresponding to the atoms + being scattered + :p data: per-atom values packed into a + one-dimensional array containing the data to be scattered. This array must + have either the same length as *ids* (for *mask*, *type*, etc.) or three + times its length (for *x*, *f*, etc.); the array must be rank 1 + and be of type ``INTEGER(c_int)`` (e.g., for *mask* or *type*) or of type + ``REAL(c_double)`` (e.g., for *charge*, *x*, or *f*). + :ptype data: polymorphic,dimension(:) + :to: :cpp:func:`lammps_scatter_atoms_subset` + +-------- + +.. f:subroutine:: gather_bonds(data) + + Gather type and constituent atom information for all bonds. + + .. versionadded:: 3Nov2022 + + This function copies the list of all bonds into an allocated array. + The array will be filled with (bond type, bond atom 1, bond atom 2) for each + bond. The array is allocated to the right length (i.e., three times the + number of bonds). The array *data* must be of the same type as the LAMMPS + ``tagint`` type, which is equivalent to either ``INTEGER(c_int)`` or + ``INTEGER(c_int64_t)``, depending on whether ``-DLAMMPS_BIGBIG`` was used + when LAMMPS was built. If the supplied array does not match, an error will + result at run-time. + + An example of how to use this routine is below: + + .. code-block:: fortran + + PROGRAM bonds + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int + USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY : OUTPUT_UNIT + USE LIBLAMMPS + IMPLICIT NONE + INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET :: bonds + INTEGER(c_int), DIMENSION(:,:), POINTER :: bonds_array + TYPE(lammps) :: lmp + INTEGER :: i + ! other commands to initialize LAMMPS, create bonds, etc. + CALL lmp%gather_bonds(bonds) + bonds_array(1:3,1:SIZE(bonds)/3) => bonds + DO i = 1, SIZE(bonds)/3 + WRITE(OUTPUT_UNIT,'(A,1X,I4,A,I4,1X,I4)') 'bond', bonds(1,i), & + '; type = ', bonds(2,i), bonds(3,i) + END DO + END PROGRAM bonds + + :p data: array into which to copy the result. \*The ``KIND`` parameter is + either ``c_int`` or, if LAMMPS was compiled with ``-DLAMMPS_BIGBIG``, + kind ``c_int64_t``. + :ptype data: integer(kind=\*),allocatable + :to: :cpp:func:`lammps_gather_bonds` + +-------- + +.. f:subroutine:: create_atoms([id,] type, x, [v,] [image,] [bexpand]) + + This method calls :cpp:func:`lammps_create_atoms` to create additional atoms + from a given list of coordinates and a list of atom types. Additionally, + the atom IDs, velocities, and image flags may be provided. + + .. versionadded:: 3Nov2022 + + :p integer(c_int) type [dimension(N)]: vector of :math:`N` atom types + (required/see note below) + :p real(c_double) x [dimension(3N)]: vector of :math:`3N` x/y/z positions + of the new atoms, arranged as :math:`[x_1,y_1,z_1,x_2,y_2,\dotsc]` + (required/see note below) + :o integer(kind=\*) id [dimension(N)]: vector of :math:`N` atom IDs; if + absent, LAMMPS will generate them for you. \*The ``KIND`` parameter should + be ``c_int`` unless LAMMPS was compiled with ``-DLAMMPS_BIGBIG``, in which + case it should be ``c_int64_t``. + :o real(c_double) v [dimension(3N)]: vector of :math:`3N` x/y/z velocities + of the new atoms, arranged as :math:`[v_{1,x},v_{1,y},v_{1,z},v_{2,x}, + \dotsc]`; if absent, they will be set to zero + :o integer(kind=\*) image [dimension(N)]: vector of :math:`N` image flags; + if absent, they are set to zero. \*The ``KIND`` parameter should be + ``c_int`` unless LAMMPS was compiled with ``-DLAMMPS_BIGBIG``, in which + case it should be ``c_int64_t``. See note below. + :o bexpand: if ``.TRUE.``, atoms outside of shrink-wrap boundaries + will be created, not dropped, and the box dimensions will be extended. + Default is ``.FALSE.`` + :otype bexpand: logical + :to: :cpp:func:`lammps_create_atoms` + + .. note:: + + The *type* and *x* arguments are required, but they are declared + ``OPTIONAL`` in the module because making them mandatory would require + *id* to be present as well. To have LAMMPS generate the ids for you, + use a call something like + + .. code-block:: fortran + + lmp%create_atoms(type=new_types, x=new_xs) + + .. note:: + + When LAMMPS has been compiled with ``-DLAMMPS_BIGBIG``, it is not + possible to include the *image* parameter but omit the *id* parameter. + Either *id* must be present, or both *id* and *image* must be absent. + This is required because having all arguments be optional in both + generic functions creates an ambiguous interface. This limitation does + not exist if LAMMPS was not compiled with ``-DLAMMPS_BIGBIG``. + +-------- + +.. f:function:: find_pair_neighlist(style[, exact][, nsub][, reqid]) + + Find index of a neighbor list requested by a pair style. + + .. versionadded:: 3Nov2022 + + This function determines which of the available neighbor lists for pair + styles matches the given conditions. It first matches the style name. + If *exact* is ``.TRUE.``, the name must match exactly; if ``.FALSE.``, a + regular expression or sub-string match is done. If the pair style is + *hybrid* or *hybrid/overlay*, the style is matched against the sub-styles + instead. If the same pair style is used multiple times as a sub-style, the + *nsub* argument must be :math:`> 0`; this argument represents the *n*\ th + instance of the sub-style (same as for the :doc:`pair_coeff ` + command, for example). In that case, *nsub*\ :math:`{} = 0` will not + produce a match, and the function will return :math:`-1`. + + The final condition to be checked is the request ID (\ *reqid*\ ). This + will usually be zero, but some pair styles request multiple neighbor + lists and set the request ID to a value greater than zero. + + :p character(len=\*) style: String used to search for pair style instance. + :o exact: Flag to control whether style should match exactly or only a + regular expression/sub-string match is applied. Default: ``.TRUE.``. + :otype exact: logical + :o integer(c_int) nsub: Match *nsub*\ th hybrid sub-style instance of + the same style. Default: 0. + :o integer(c_int) reqid: Request ID to identify the neighbor list in + case there are multiple requests from the same pair style instance. + Default: 0. + :to: :cpp:func:`lammps_find_pair_neighlist` + :r integer(c_int) index: Neighbor list index if found, otherwise + :math:`-1`. + +-------- + +.. f:function:: find_fix_neighlist(id[, reqid]) + + Find index of a neighbor list requested by a fix. + + .. versionadded:: 3Nov2022 + + The neighbor list request from a fix is identified by the fix ID and the + request ID. The request ID is typically zero, but will be :math:`>0` for + fixes with multiple neighbor list requests. + + :p character(len=\*) id: Identifier of fix instance + :o integer(c_int) reqid: request ID to identify the neighbor list in cases + in which there are multiple requests from the same fix. Default: 0. + :to: :cpp:func:`lammps_find_fix_neighlist` + :r index: neighbor list index if found, otherwise :math:`-1` + :rtype index: integer(c_int) + +-------- + +.. f:function:: find_compute_neighlist(id[, reqid]) + + Find index of a neighbor list requested by a compute. + + .. versionadded:: 3Nov2022 + + The neighbor list request from a compute is identified by the compute ID and + the request ID. The request ID is typically zero, but will be :math:`> 0` + in case a compute has multiple neighbor list requests. + + :p character(len=\*) id: Identifier of compute instance. + :o integer(c_int) reqid: request ID to identify the neighbor list in cases + in which there are multiple requests from the same compute. Default: 0. + :to: :cpp:func:`lammps_find_compute_neighlist` + :r index: neighbor list index if found, otherwise :math:`-1`. + :rtype index: integer(c_int) + +-------- + +.. f:function:: neighlist_num_elements(idx) + + Return the number of entries in the neighbor list with the given index. + + .. versionadded:: 3Nov2022 + + :p integer(c_int) idx: neighbor list index + :to: :cpp:func:`lammps_neighlist_num_elements` + :r inum: number of entries in neighbor list, or :math:`-1` if *idx* is not + a valid index. + :rtype inum: integer(c_int) + +-------- + +.. f:function:: version() + + This method returns the numeric LAMMPS version like + :cpp:func:`lammps_version` does. + + :to: :cpp:func:`lammps_version` + :r version: LAMMPS version + :rtype version: integer + +-------- + +.. f:subroutine:: get_os_info(buffer) + + This function can be used to retrieve detailed information about the hosting + operating system and compiler/runtime environment. + + .. versionadded:: 3Nov2022 + + A suitable buffer has to be provided. The assembled text will be truncated + so as not to overflow this buffer. The string is typically a few hundred + bytes long. + + :p character(len=\*) buffer: string that will house the information. + :to: :cpp:func:`lammps_get_os_info` + + +-------- + +.. f:function:: config_has_mpi_support() + + This function is used to query whether LAMMPS was compiled with a real MPI + library or in serial. + + .. versionadded:: 3Nov2022 + + :to: :cpp:func:`lammps_config_has_mpi_support` + :r has_mpi: ``.FALSE.`` when compiled with STUBS, ``.TRUE.`` if + complied with MPI. + :rtype has_mpi: logical + +-------- + +.. f:function:: config_has_gzip_support() + + Check if the LAMMPS library supports reading or writing compressed + files via a pipe to gzip or similar compression programs. + + .. versionadded:: 3Nov2022 + + 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 ``gzip`` or any other supported compression + programs themselves are installed and usable. + + :to: :cpp:func:`lammps_config_has_gzip_support` + :r has_gzip: + :rtype has_gzip: logical + +-------- + +.. f:function:: config_has_png_support() + + Check if the LAMMPS library supports writing PNG format images. + + .. versionadded:: 3Nov2022 + + The LAMMPS :doc:`dump style image ` supports writing multiple + image file formats. Most of them, however, need support from an external + library, and using that has to be :ref:`enabled at compile time `. + This function checks whether support for the `PNG image file format + `_ is available + in the current LAMMPS library. + + :to: :cpp:func:`lammps_config_has_png_support` + :r has_png: + :rtype has_png: logical + +-------- + +.. f:function:: config_has_jpeg_support() + + Check if the LAMMPS library supports writing JPEG format images. + + .. versionadded:: 3Nov2022 + + The LAMMPS :doc:`dump style image ` supports writing multiple + image file formats. Most of them, however, need support from an external + library, and using that has to be :ref:`enabled at compile time `. + This function checks whether support for the `JPEG image file format + `_ is available in the current LAMMPS library. + + :to: :cpp:func:`lammps_config_has_jpeg_support` + :r has_jpeg: + :rtype has_jpeg: logical + +-------- + +.. f:function:: config_has_ffmpeg_support() + + Check if the LAMMPS library supports creating movie files via a pipe to + ffmpeg. + + .. versionadded:: 3Nov2022 + + The LAMMPS :doc:`dump style movie ` supports generating movies + from images on-the-fly via creating a pipe to the + `ffmpeg `_ program. + This function checks whether this feature was + :ref:`enabled at compile time `. + It does **not** check whether the ``ffmpeg`` itself is installed and usable. + + :to: :cpp:func:`lammps_config_has_ffmpeg_support` + :r has_ffmpeg: + :rtype has_ffmpeg: logical + +-------- + +.. f:function:: config_has_exceptions() + + Check whether LAMMPS errors will throw C++ exceptions. + + .. versionadded:: 3Nov2022 + + In case of an error, LAMMPS will either abort or throw a C++ exception. + The latter has to be :ref:`enabled at compile time `. + This function checks if exceptions were enabled. + + When using the library interface with C++ exceptions enabled, the library + interface functions will "catch" them, and the error status can then be + checked by calling :f:func:`has_error`. The most recent error message can be + retrieved via :f:func:`get_last_error_message`. + This can allow one to restart a calculation or delete and recreate + the LAMMPS instance when a C++ exception occurs. One application + of using exceptions this way is the :ref:`lammps_shell`. If C++ + exceptions are disabled and an error happens during a call to + LAMMPS or the Fortran API, the application will terminate. + + :to: :cpp:func:`lammps_config_has_exceptions` + :r has_exceptions: + :rtype has_exceptions: logical + +-------- + +.. f:function:: config_has_package(name) + + Check whether a specific package has been included in LAMMPS + + .. versionadded:: 3Nov2022 + + This function checks whether the LAMMPS library in use includes the specific + :doc:`LAMMPS package ` provided as argument. + + :to: :cpp:func:`lammps_config_has_package` + :r has_package: + :rtype has_package: logical + +-------- + +.. f:function:: config_package_count() + + Count the number of installed packages in the LAMMPS library. + + .. versionadded:: 3Nov2022 + + This function counts how many :doc:`LAMMPS packages ` are + included in the LAMMPS library in use. It directly calls the C library + function :cpp:func:`lammps_config_package_count`. + + :to: :cpp:func:`lammps_config_package_count` + :r integer(c_int) npackages: number of packages installed + +-------- + +.. f:subroutine:: config_package_name(idx, buffer) + + Get the name of a package in the list of installed packages in the LAMMPS + library. + + .. versionadded:: 3Nov2022 + + This subroutine copies the name of the package with the index *idx* into the + provided string *buffer*. If the name of the package exceeds the length of + the buffer, it will be truncated accordingly. If the index is out of range, + *buffer* is set to an empty string. + + :p integer(c_int) idx: index of the package in the list of included packages + :math:`(0 \le idx < \text{package count})` + :p character(len=\*) buffer: string to hold the name of the package + :to: :cpp:func:`lammps_config_package_name` + +-------- + +.. f:subroutine:: installed_packages(package[, length]) + + Obtain a list of the names of enabled packages in the LAMMPS shared library + and store it in *package*. + + .. versionadded:: 3Nov2022 + + This function is analogous to the :py:func`installed_packages` function in + the Python API. The optional argument *length* sets the length of each + string in the vector *package* (default: 31). + + :p character(len=:) package [dimension(:),allocatable]: list of packages; + *must* have the ``ALLOCATABLE`` attribute and be of rank 1 + (i.e., ``DIMENSION(:)``) with allocatable length. + :o length: length of each string in the list. Default: 31. + :otype length: integer,optional + :to: :cpp:func:`lammps_config_package_count` + :to: :cpp:func:`lammps_config_package_name` + +-------- + +.. f:function:: config_accelerator(package, category, setting) + + This function calls :cpp:func:`lammps_config_accelerator` to check the + availability of compile time settings of included + :doc:`accelerator packages ` in LAMMPS. + + .. versionadded:: 3Nov2022 + + Supported packages names are "GPU", "KOKKOS", "INTEL", and "OPENMP". + Supported categories are "api" with possible settings "cuda", "hip", "phi", + "pthreads", "opencl", "openmp", and "serial"; and "precision" with + possible settings "double", "mixed", and "single". + + :p character(len=\*) package: string with the name of the accelerator + package + :p character(len=\*) category: string with the name of the setting + :p character(len=\*) setting: string with the name of the specific + setting + :to: :cpp:func:`lammps_config_accelerator` + :r available: ``.TRUE.`` if the combination of package, category, + and setting is available, otherwise ``.FALSE.``. + :rtype available: logical + +-------- + +.. f:function:: has_gpu_device() + + Checks for the presence of a viable GPU package device. + + .. versionadded:: 3Nov2022 + + This function calls :cpp:func:`lammps_has_gpu_device`, which checks at + runtime whether an accelerator device is present that can be used with the + :doc:`GPU package `. + + More detailed information about the available device or devices can + be obtained by calling the + :f:subr:`get_gpu_device_info` subroutine. + + :to: :cpp:func:`lammps_has_gpu_device` + :r available: ``.TRUE.`` if a viable device is available, ``.FALSE.`` if not. + :rtype available: logical + +-------- + +.. f:subroutine:: get_gpu_device_info(buffer) + + Get GPU package device information. + + .. versionadded:: 3Nov2022 + + Calls :cpp:func:`lammps_get_gpu_device_info` to retrieve detailed + information about any accelerator devices that are viable for use with the + :doc:`GPU package `. It will fill *buffer* with a string that is + equivalent to the output of the ``nvc_get_device`` or ``ocl_get_device`` or + ``hip_get_device`` tools that are compiled alongside LAMMPS if the GPU + package is enabled. + + A suitable-length Fortran string has to be provided. The assembled text will + be truncated so as not to overflow this buffer. This string can be several + kilobytes long if multiple devices are present. + + :p character(len=\*) buffer: string into which to copy the information. + :to: :cpp:func:`lammps_get_gpu_device_info` + +-------- + +.. f:function:: has_style(category, name) + + Check whether a specific style has been included in LAMMPS. + + .. versionadded:: 3Nov2022 + + This function calls :cpp:func:`lammps_has_style` to check whether the + LAMMPS library in use includes the specific style *name* associated with a + specific *category* provided as arguments. Please see + :cpp:func:`lammps_has_style` for a list of valid categories. + + :p character(len=\*) category: category of the style + :p character(len=\*) name: name of the style + :to: :cpp:func:`lammps_has_style` + :r has_style: ``.TRUE.`` if included, ``.FALSE.`` if not. + :rtype has_style: logical + +-------- + +.. f:function:: style_count(category) + + Count the number of styles of *category* in the LAMMPS library. + + .. versionadded:: 3Nov2022 + + This function counts how many styles in the provided *category* are + included in the LAMMPS library currently in use. Please see + :cpp:func:`lammps_has_style` for a list of valid categories. + + :p character(len=\*) category: category of styles to count + :to: :cpp:func:`lammps_style_count` + :r integer(c_int) count: number of styles in *category* + +-------- + +.. f:subroutine:: style_name(category, idx, buffer) + + Look up the name of a style by index in the list of styles of a given + category in the LAMMPS library. + + .. versionadded:: 3Nov2022 + + This function calls :cpp:func:`lammps_style_name` and copies the name of + the *category* style with index *idx* into the provided string *buffer*. + The length of *buffer* must be long enough to contain the name of the + style; if it is too short, the name will be truncated accordingly. + If *idx* is out of range, *buffer* will be the empty string and a warning + will be issued. + + :p character(len=\*) category: category of styles + :p integer(c_int) idx: index of the style in the list of *category* + styles :math:`(1 \leq idx \leq \text{style count})` + :p character(len\*) buffer: string buffer to copy the name of the style + into + :to: :cpp:func:`lammps_style_name` + +-------- + +.. f:function:: has_id(category, name) + + This function checks if the current LAMMPS instance a *category* ID of + the given *name* exists. Valid categories are: *compute*\ , *dump*\ , + *fix*\ , *group*\ , *molecule*\ , *region*\ , and *variable*\ . + + .. versionadded:: 3Nov2022 + + :p character(len=\*) category: category of the ID + :p character(len=\*) name: name of the ID + :to: :cpp:func:`lammps_has_id` + :r has_id: ``.TRUE.`` if *category* style *name* exists, ``.FALSE.`` if not. + :rtype has_id: logical + +-------- + +.. f:function:: id_count(category) + + This function counts how many IDs in the provided *category* are defined in + the current LAMMPS instance. Please see :f:func:`has_id` for a list of + valid categories. + + .. versionadded:: 3Nov2022 + + :p character(len=\*) category: category of the ID + :to: :cpp:func:`lammps_id_count` + :r count: number of IDs in *category* + :rtype count: integer(c_int) + +-------- + +.. f:subroutine:: id_name(category, idx, buffer) + + Look up the name of an ID by index in the list of IDs of a given category. + + .. versionadded:: 3Nov2022 + + This function copies the name of the *category* ID with the index *idx* into + the provided string *buffer*\ . The length of the buffer must be long + enough to hold the string; if the name of the style exceeds the length of + the buffer, it will be truncated accordingly. If *buffer* is + ``ALLOCATABLE``, it must be allocated *before* the function is called. + If *idx* is out of range, *buffer* is set to an empty string and a warning + is issued. + + :p character(len=\*) category: category of IDs + :p integer(c_int) idx: index of the ID in the list of *category* + styles (:math:`0 \leq idx < count`) + :p character(len=\*) buffer: string into which to copy the name of the + style + :to: :cpp:func:`lammps_id_name` + +-------- + +.. f:function:: plugin_count() + + This function counts the number of loaded plugins. + + .. versionadded:: 3Nov2022 + + :to: :cpp:func:`lammps_plugin_count` + :r n: number of loaded plugins + :rtype n: integer(c_int) + +-------- + +.. f:subroutine:: plugin_name(idx, stylebuf, namebuf) + + Look up the style and name of a plugin by its index in the list of plugins. + + .. versionadded:: 3Nov2022 + + This function copies the name of the *style* plugin with the index *idx* + into the provided C-style string buffer. The length of the buffer must be + provided as *buf_size* argument. If the name of the style exceeds the + length of the buffer, it will be truncated accordingly. If the index is out + of range, both strings are set to the empty string and a warning is + printed. + + :p integer(c_int) idx: index of the plugin in the list all or + *style* plugins + :p character(len=\*) stylebuf: string into which to copy the style of the + plugin + :p character(len=\*) namebuf: string into which to copy the style of the + plugin + :to: :cpp:func:`lammps_plugin_name` + +-------- + +.. f:function:: encode_image_flags(ix, iy, iz) + + Encodes three integer image flags into a single imageint. + + .. versionadded:: 3Nov2022 + + This function performs the bit-shift, addition, and bit-wise OR operations + necessary to combine the values of three integers representing the image + flags in the :math:`x`-, :math:`y`-, and :math:`z`-directions. Unless LAMMPS + is compiled with ``-DLAMMPS_BIGBIG``, those integers are limited to 10-bit + signed integers :math:`[-512,512]`. If ``-DLAMMPS_BIGBIG`` was used when + compiling, then the return value is of kind ``c_int64_t`` instead of + kind ``c_int``, and the valid range for the individual image flags becomes + :math:`[-1048576,1048575]` (i.e., the range of a 21-bit signed integer). + There is no check on whether the arguments conform to these requirements. + + :p integer(c_int) ix: image flag in :math:`x`-direction + :p integer(c_int) iy: image flag in :math:`y`-direction + :p integer(c_int) iz: image flag in :math:`z`-direction + :r integer(kind=\*) imageint: encoded image flag. \*The ``KIND`` parameter + is ``c_int`` unless LAMMPS was built with ``-DLAMMPS_BIGBIG``, in which + case it is ``c_int64_t``. + + .. note:: + + The fact that the programmer does not know the ``KIND`` parameter of the + return value until compile time means that it is impossible to define an + interface that works for both sizes of ``imageint``. One side effect of + this is that you must assign the return value of this function to a + variable; it cannot be used as the argument to another function or as part + of an array constructor. For example, + + .. code-block:: fortran + + my_images = [lmp%encode_image_flags(0,0,0), lmp%encode_image_flags(1,0,0)] + + will *not* work; instead, do something like + + .. code-block:: fortran + + my_images(1) = lmp%encode_image_flags(0,0,0) + my_images(2) = lmp%encode_image_flags(1,0,0) + +-------- + +.. f:subroutine:: decode_image_flags(image, flags) + + This function does the reverse operation of :f:func:`encode_image_flags`: + it takes the image flag and performs the bit-shift and bit-masking + operations to decode it and stores the resulting three integers into the + array *flags*. + + .. versionadded:: 3Nov2022 + + :p integer(kind=\*) image: encoded image flag. \*The ``KIND`` parameter is + either ``c_int`` or, if LAMMPS was compiled with ``-DLAMMPS_BIGBIG``, + ``c_int64_t``. Kind compatibility is checked at run-time. + :p integer(c_int) flags [dimension(3)]: three-element vector where the + decoded image flags will be stored. + +-------- + +.. f:subroutine:: flush_buffers() + + This function calls :cpp:func:`lammps_flush_buffers`, which flushes buffered + output to be written to screen and logfile. This can simplify capturing + output from LAMMPS library calls. + + .. versionadded:: 3Nov2022 + + :to: :cpp:func:`lammps_flush_buffers` + +-------- + +.. f:function:: is_running() + + Check if LAMMPS is currently inside a run or minimization. + + .. versionadded:: 3Nov2022 + + This function can be used from signal handlers or multi-threaded + applications to determine if the LAMMPS instance is currently active. + + :to: :cpp:func:`lammps_is_running` + :r is_running: ``.FALSE.`` if idle or ``.TRUE.`` if active + :rtype is_running: logical + +-------- + +.. f:subroutine:: force_timeout() + + Force a timeout to stop an ongoing run cleanly. + + .. versionadded:: 3Nov2022 + + This function can be used from signal handlers or multi-threaded + applications to cleanly terminate an ongoing run. + + :to: :cpp:func:`lammps_force_timeout` + +-------- + +.. f:function:: has_error() + + Check if there is a (new) error message available. + + .. versionadded:: 3Nov2022 + + This function can be used to query if an error inside of LAMMPS + has thrown a :ref:`C++ exception `. + + .. note:: + + This function will always report "no error" when the LAMMPS library + has been compiled without ``-DLAMMPS_EXCEPTIONS``, which turns fatal + errors aborting LAMMPS into C++ exceptions. You can use the library + function :cpp:func:`lammps_config_has_exceptions` to check if this is + the case. + + :to: :cpp:func:`lammps_has_error` + :r has_error: ``.TRUE.`` if there is an error. + :rtype has_error: logical + +-------- + +.. f:subroutine:: get_last_error_message(buffer[,status]) + + Copy the last error message into the provided buffer. + + .. versionadded:: 3Nov2022 + + This function can be used to retrieve the error message that was set + in the event of an error inside of LAMMPS that resulted in a + :ref:`C++ exception `. A suitable buffer for a string has + to be provided. If the internally-stored error message is longer than the + string and the string does not have ``ALLOCATABLE`` length, it will be + truncated accordingly. The optional argument *status* indicates the + kind of error: a "1" indicates an error that occurred on all MPI ranks and + is often recoverable, while a "2" indicates an abort that would happen only + in a single MPI rank and thus may not be recoverable, as other MPI ranks may + be waiting on the failing MPI rank(s) to send messages. + + .. note:: + + This function will do nothing when the LAMMPS library has been + compiled without ``-DLAMMPS_EXCEPTIONS``, which turns errors aborting + LAMMPS into C++ exceptions. You can use the function + :f:func:`config_has_exceptions` to check whether this is the case. + + :p character(len=\*) buffer: string buffer to copy the error message into + :o integer(c_int) status [optional]: 1 when all ranks had the error, + 2 on a single-rank error. + :to: :cpp:func:`lammps_get_last_error_message` diff --git a/doc/src/Howto.rst b/doc/src/Howto.rst index 715f13f09b..d1bb1733fc 100644 --- a/doc/src/Howto.rst +++ b/doc/src/Howto.rst @@ -85,6 +85,7 @@ Packages howto Howto_coreshell Howto_drude Howto_drude2 + Howto_peri Howto_manifold Howto_spins diff --git a/doc/src/Howto_amoeba.rst b/doc/src/Howto_amoeba.rst index c6df8a9b5c..6b84fc9f00 100644 --- a/doc/src/Howto_amoeba.rst +++ b/doc/src/Howto_amoeba.rst @@ -281,7 +281,7 @@ Here is more information about the extended XYZ format defined and used by Tinker, and links to programs that convert standard PDB files to the extended XYZ format: -* `http://openbabel.org/docs/current/FileFormats/Tinker_XYZ_format.html `_ +* `https://openbabel.org/docs/current/FileFormats/Tinker_XYZ_format.html `_ * `https://github.com/emleddin/pdbxyz-xyzpdb `_ * `https://github.com/TinkerTools/tinker/blob/release/source/pdbxyz.f `_ diff --git a/doc/src/Howto_bioFF.rst b/doc/src/Howto_bioFF.rst index 172ba3da3a..8899f7520c 100644 --- a/doc/src/Howto_bioFF.rst +++ b/doc/src/Howto_bioFF.rst @@ -3,24 +3,20 @@ CHARMM, AMBER, COMPASS, and DREIDING force fields A force field has 2 parts: the formulas that define it and the coefficients used for a particular system. Here we only discuss -formulas implemented in LAMMPS that correspond to formulas commonly -used in the CHARMM, AMBER, COMPASS, and DREIDING force fields. Setting +formulas implemented in LAMMPS that correspond to formulas commonly used +in the CHARMM, AMBER, COMPASS, and DREIDING force fields. Setting coefficients is done either from special sections in an input data file via the :doc:`read_data ` command or in the input script with -commands like :doc:`pair_coeff ` or -:doc:`bond_coeff ` and so on. See the :doc:`Tools ` doc -page for additional tools that can use CHARMM, AMBER, or Materials -Studio generated files to assign force field coefficients and convert -their output into LAMMPS input. +commands like :doc:`pair_coeff ` or :doc:`bond_coeff +` and so on. See the :doc:`Tools ` doc page for +additional tools that can use CHARMM, AMBER, or Materials Studio +generated files to assign force field coefficients and convert their +output into LAMMPS input. -See :ref:`(MacKerell) ` for a description of the CHARMM force -field. See :ref:`(Cornell) ` for a description of the AMBER -force field. See :ref:`(Sun) ` for a description of the COMPASS -force field. - -.. _charmm: http://www.scripps.edu/brooks - -.. _amber: http://amber.scripps.edu +See :ref:`(MacKerell) ` for a description of the CHARMM +force field. See :ref:`(Cornell) ` for a description of +the AMBER force field. See :ref:`(Sun) ` for a description +of the COMPASS force field. The interaction styles listed below compute force field formulas that are consistent with common options in CHARMM or AMBER. See each @@ -41,9 +37,10 @@ command's documentation for the formula it computes. .. note:: - For CHARMM, newer *charmmfsw* or *charmmfsh* styles were released - in March 2017. We recommend they be used instead of the older *charmm* - styles. See discussion of the differences on the :doc:`pair charmm ` and :doc:`dihedral charmm ` doc + For CHARMM, newer *charmmfsw* or *charmmfsh* styles were released in + March 2017. We recommend they be used instead of the older *charmm* + styles. See discussion of the differences on the :doc:`pair charmm + ` and :doc:`dihedral charmm ` doc pages. COMPASS is a general force field for atomistic simulation of common diff --git a/doc/src/Howto_bpm.rst b/doc/src/Howto_bpm.rst index 2f015162e0..46e7e70131 100644 --- a/doc/src/Howto_bpm.rst +++ b/doc/src/Howto_bpm.rst @@ -33,46 +33,6 @@ reference state of a bond. Bonds that are created midway into a run, such as those created by pouring grains using :doc:`fix pour `, are initialized on that timestep. -As bonds can be broken between neighbor list builds, the -:doc:`special_bonds ` command works differently for BPM -bond styles. There are two possible settings which determine how pair -interactions work between bonded particles. First, one can turn off -all pair interactions between bonded particles. Unlike :doc:`bond -quartic `, this is not done by subtracting pair forces -during the bond computation but rather by dynamically updating the -special bond list. This is the default behavior of BPM bond styles and -is done by updating the 1-2 special bond list as bonds break. To do -this, LAMMPS requires :doc:`newton ` bond off such that all -processors containing an atom know when a bond breaks. Additionally, -one must do either (A) or (B). - -A) Use the following special bond settings - - .. code-block:: LAMMPS - - special_bonds lj 0 1 1 coul 1 1 1 - - These settings accomplish two goals. First, they turn off 1-3 and 1-4 - special bond lists, which are not currently supported for BPMs. As - BPMs often have dense bond networks, generating 1-3 and 1-4 special - bond lists is expensive. By setting the lj weight for 1-2 bonds to - zero, this turns off pairwise interactions. Even though there are no - charges in BPM models, setting a nonzero coul weight for 1-2 bonds - ensures all bonded neighbors are still included in the neighbor list - in case bonds break between neighbor list builds. - -B) Alternatively, one can simply overlay pair interactions such that all - bonded particles also feel pair interactions. This can be - accomplished by using the *overlay/pair* keyword present in all bpm - bond styles and by using the following special bond settings - - .. code-block:: LAMMPS - - special_bonds lj/coul 1 1 1 - -See the :doc:`Howto ` page on broken bonds for -more information. - ---------- Currently there are two types of bonds included in the BPM @@ -91,12 +51,6 @@ This also requires a unique integrator :doc:`fix nve/bpm/sphere ` which numerically integrates orientation similar to :doc:`fix nve/asphere `. -To monitor the fracture of bonds in the system, all BPM bond styles -have the ability to record instances of bond breakage to output using -the :doc:`dump local ` command. Additionally, one can use -:doc:`compute nbond/atom ` to tally the current -number of bonds per atom. - In addition to bond styles, a new pair style :doc:`pair bpm/spring ` was added to accompany the bpm/spring bond style. This pair style is simply a hookean repulsion with similar @@ -104,6 +58,73 @@ velocity damping as its sister bond style. ---------- +Bond data can be output using a combination of standard LAMMPS commands. +A list of IDs for bonded atoms can be generated using the +:doc:`compute property/local ` command. +Various properties of bonds can be computed using the +:doc:`compute bond/local ` command. This +command allows one to access data saved to the bond's history +such as the reference length of the bond. More information on +bond history data can be found on the documentation pages for the specific +BPM bond styles. Finally, this data can be output using a :doc:`dump local ` +command. As one may output many columns from the same compute, the +:doc:`dump modify ` *colname* option may be used to provide +more helpful column names. An example of this procedure is found in +/examples/bpm/pour/. External software, such as OVITO, can read these dump +files to render bond data. + +---------- + +As bonds can be broken between neighbor list builds, the +:doc:`special_bonds ` command works differently for BPM +bond styles. There are two possible settings which determine how pair +interactions work between bonded particles. First, one can overlay +pair forces with bond forces such that all bonded particles also +feel pair interactions. This can be accomplished by using the *overlay/pair* +keyword present in all bpm bond styles and by using the following special +bond settings + + .. code-block:: LAMMPS + + special_bonds lj/coul 1 1 1 + +Alternatively, one can turn off all pair interactions between bonded +particles. Unlike :doc:`bond quartic `, this is not done +by subtracting pair forces during the bond computation but rather by +dynamically updating the special bond list. This is the default behavior +of BPM bond styles and is done by updating the 1-2 special bond list as +bonds break. To do this, LAMMPS requires :doc:`newton ` bond off +such that all processors containing an atom know when a bond breaks. +Additionally, one must use the following special bond settings + + .. code-block:: LAMMPS + + special_bonds lj 0 1 1 coul 1 1 1 + +These settings accomplish two goals. First, they turn off 1-3 and 1-4 +special bond lists, which are not currently supported for BPMs. As +BPMs often have dense bond networks, generating 1-3 and 1-4 special +bond lists is expensive. By setting the lj weight for 1-2 bonds to +zero, this turns off pairwise interactions. Even though there are no +charges in BPM models, setting a nonzero coul weight for 1-2 bonds +ensures all bonded neighbors are still included in the neighbor list +in case bonds break between neighbor list builds. + +To monitor the fracture of bonds in the system, all BPM bond styles +have the ability to record instances of bond breakage to output using +the :doc:`dump local ` command. Since one may frequently output +a list of broken bonds and the time they broke, the +:doc:`dump modify ` option *header no* may be useful to +avoid repeatedly printing the header of the dump file. An example of +this procedure is found in /examples/bpm/impact/. Additionally, +one can use :doc:`compute nbond/atom ` to tally the +current number of bonds per atom. + +See the :doc:`Howto ` page on broken bonds for +more information. + +---------- + While LAMMPS has many utilities to create and delete bonds, *only* the following are currently compatible with BPM bond styles: diff --git a/doc/src/Howto_github.rst b/doc/src/Howto_github.rst index 315bacac69..9209477986 100644 --- a/doc/src/Howto_github.rst +++ b/doc/src/Howto_github.rst @@ -10,7 +10,7 @@ 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 familiarize yourself with some of the +`_ to familiarize yourself with some of the more advanced git features used below. As of fall 2016, submitting contributions to LAMMPS via pull requests diff --git a/doc/src/Howto_manifold.rst b/doc/src/Howto_manifold.rst index 8c2cbadc42..67c9d70ea6 100644 --- a/doc/src/Howto_manifold.rst +++ b/doc/src/Howto_manifold.rst @@ -47,4 +47,4 @@ to the relevant fixes. .. _Paquay1: **(Paquay)** Paquay and Kusters, Biophys. J., 110, 6, (2016). -preprint available at `arXiv:1411.3019 `_. +preprint available at `arXiv:1411.3019 `_. diff --git a/doc/src/Howto_peri.rst b/doc/src/Howto_peri.rst new file mode 100644 index 0000000000..4c78d04833 --- /dev/null +++ b/doc/src/Howto_peri.rst @@ -0,0 +1,1078 @@ +Peridynamics with LAMMPS +======================== + +This Howto is based on the Sandia report 2010-5549 by Michael L. Parks, +Pablo Seleson, Steven J. Plimpton, Richard B. Lehoucq, and +Stewart A. Silling. + +Overview +"""""""" + +Peridynamics is a nonlocal extension of classical continuum mechanics. +The discrete peridynamic model has the same computational structure as a +molecular dynamics model. This Howto provides a brief overview of the +peridynamic model of a continuum, then discusses how the peridynamic +model is discretized within LAMMPS as described in the original article +:ref:`(Parks) `. An example problem with comments is also +included. + +Quick Start +""""""""""" + +The peridynamics styles are included in the optional :ref:`PERI package +`. If your LAMMPS executable does not already include the +PERI package, you can see the :doc:`build instructions for packages +` for how to enable the package when compiling a custom +version of LAMMPS from source. + +Here is a minimal example for setting up a peridynamics simulation. + +.. code-block:: LAMMPS + + units si + boundary s s s + lattice sc 0.0005 + atom_style peri + atom_modify map array + neighbor 0.0010 bin + region target cylinder y 0.0 0.0 0.0050 -0.0050 0.0 units box + create_box 1 target + create_atoms 1 region target + + pair_style peri/pmb + pair_coeff * * 1.6863e22 0.0015001 0.0005 0.25 + set group all density 2200 + set group all volume 1.25e-10 + velocity all set 0.0 0.0 0.0 sum no units box + fix 1 all nve + compute 1 all damage/atom + timestep 1.0e-7 + +Some notes on this input example: + +- peridynamics simulations typically use SI :doc:`units ` +- particles must be created on a :doc:`simple cubic lattice ` +- using the :doc:`atom style peri ` is required +- an :doc:`atom map ` is required for indexing particles +- The :doc:`skin distance ` used when computing neighbor lists + should be defined appropriately for your choice of simulation + parameters. The *skin* should be set to a value such that the + peridynamic horizon plus the skin distance is larger than the maximum + possible distance between two bonded particles (before their bond + breaks). Here it is set to 0.001 meters. +- a :doc:`peridynamics pair style ` is required. Available + choices are currently: *peri/eps*, *peri/lps*, *peri/pmb*, and + *peri/ves*. The model parameters are set with a :doc:`pair_coeff + ` command. +- the mass density and volume fraction for each particle must be + defined. This is done with the two :doc:`set ` commands for + *density* and *volume*. For a simple cubic lattice, the volume of a + particle should be equal to the cube of the lattice constant, here + :math:`V_i = \Delta x ^3`. +- with the :doc:`velocity ` command all particles are initially at rest +- a plain :doc:`velocity-Verlet time integrator ` is used, + which is algebraically equivalent to a centered difference in time, + but numerically more stable +- you can compute the damage at the location of each particle with + :doc:`compute damage/atom ` +- finally, the timestep is set to 0.1 microseconds with the + :doc:`timestep ` command. + + +Peridynamic Model of a Continuum +"""""""""""""""""""""""""""""""" + +The following is not a complete overview of peridynamics, but a +discussion of only those details specific to the model we have +implemented within LAMMPS. For more on the peridynamic theory, the +reader is referred to :ref:`(Silling 2007) `. To begin, +we define the notation we will use. + +Basic Notation +^^^^^^^^^^^^^^ + +Within the peridynamic literature, the following notational conventions +are generally used. The position of a given point in the reference +configuration is :math:`\textbf{x}`. Let +:math:`\mathbf{u}(\mathbf{x},t)` and :math:`\mathbf{y}(\mathbf{x},t)` +denote the displacement and position, respectively, of the point +:math:`\mathbf{x}` at time :math:`t`. Define the relative position and +displacement vectors of two bonded points :math:`\textbf{x}` and +:math:`\textbf{x}^\prime` as :math:`\mathbf{\xi} = \textbf{x}^\prime - +\textbf{x}` and :math:`\mathbf{\eta} = \textbf{u}(\textbf{x}^\prime,t) - +\textbf{u}(\textbf{x},t)`, respectively. We note here that +:math:`\mathbf{\eta}` is time-dependent, and that :math:`\mathbf{\xi}` +is not. It follows that the relative position of the two bonded points +in the current configuration can be written as :math:`\boldsymbol{\xi} + +\boldsymbol{\eta} = +\mathbf{y}(\mathbf{x}^{\prime},t)-\mathbf{y}(\mathbf{x},t)`. + +Peridynamic models are frequently written using *states*, which we +briefly describe here. For the purposes of our discussion, all states +are operators that act on vectors in :math:`\mathbb{R}^3`. For a more +complete discussion of states, see :ref:`(Silling 2007) +`. A *vector state* is an operator whose image is a +vector, and may be viewed as a generalization of a second-rank +tensor. Similarly, a *scalar state* is an operator whose image is a +scalar. Of particular interest is the vector force state +:math:`\underline{\mathbf{T}}\left[ \mathbf{x},t \right]\left< +\mathbf{x}^{\prime}-\mathbf{x} \right>`, which is a mapping, having +units of force per volume squared, of the vector +:math:`\mathbf{x}^{\prime}-\mathbf{x}` to the force vector state +field. The vector state operator :math:`\underline{\mathbf{T}}` may +itself be a function of :math:`\mathbf{x}` and :math:`t`. The +constitutive model is completely contained within +:math:`\underline{\mathbf{T}}`. + +In the peridynamic theory, the deformation at a point depends +collectively on all points interacting with that point. Using the +notation of :ref:`(Silling 2007) `, we write the +peridynamic equation of motion as + +.. _periNewtonII: + +.. math:: + + \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = + \int_{\mathcal{H}_{\mathbf{x}}} \left\{ + \underline{\mathbf{T}}\left[\mathbf{x},t + \right]\left<\mathbf{x}^{\prime}-\mathbf{x} \right> - + \underline{\mathbf{T}}\left[\mathbf{x}^{\prime},t + \right]\left<\mathbf{x}-\mathbf{x}^{\prime} \right> \right\} + {d}V_{\mathbf{x}^\prime} + \mathbf{b}(\mathbf{x},t), \qquad\qquad\textrm{(1)} + +where :math:`\rho` represents the mass density, +:math:`\underline{\mathbf{T}}` the force vector state, and +:math:`\mathbf{b}` an external body force density. A point +:math:`\mathbf{x}` interacts with all the points +:math:`\mathbf{x}^{\prime}` within the neighborhood +:math:`\mathcal{H}_{\mathbf{x}}`, assumed to be a spherical region of +radius :math:`\delta>0` centered at :math:`\mathbf{x}`. :math:`\delta` +is called the *horizon*, and is analogous to the cutoff radius used in +molecular dynamics. Conditions on :math:`\underline{\mathbf{T}}` for +which :ref:`(1) ` satisfies the balance of linear and angular +momentum are given in :ref:`(Silling 2007) `. + +We consider only force vector states that can be written as + +.. math:: + + \underline{\mathbf{T}} = \underline{t}\,\underline{\mathbf{M}}, + +with :math:`\underline{t}` a *scalar force state* and +:math:`\underline{\mathbf{M}}` the *deformed direction vector +state*, defined by + +.. math:: + + \underline{\mathbf{M}}\left< \boldsymbol{\xi} \right> = + \left\{ \begin{array}{cl} + \frac{\boldsymbol{\xi} + \boldsymbol{\eta}}{ + \left\Vert \boldsymbol{\xi} + \boldsymbol{\eta} \right\Vert + } & \left\Vert \boldsymbol{\xi} + \boldsymbol{\eta} \right\Vert \neq 0 \\ + \boldsymbol{0} & \textrm{otherwise} + \end{array} + \right. . \qquad\qquad\textrm{(2)} + +Such force states correspond to so-called *ordinary* materials +:ref:`(Silling 2007) `. These are the materials for which +the force between any two interacting points :math:`\textbf{x}` and +:math:`\textbf{x}^\prime` acts along the line between the points. + + +Linear Peridynamic Solid (LPS) Model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We summarize the linear peridynamic solid (LPS) material model. For more +on this model, the reader is referred to :ref:`(Silling 2007) +`. This model is a nonlocal analogue to a classical +linear elastic isotropic material. The elastic properties of a a +classical linear elastic isotropic material are determined by (for +example) the bulk and shear moduli. For the LPS model, the elastic +properties are analogously determined by the bulk and shear moduli, +along with the horizon :math:`\delta`. + +The LPS model has a force scalar state + +.. math:: + + \underline{t} = \frac{3K\theta}{m}\underline{\omega}\,\underline{x} + + \alpha \underline{\omega}\,\underline{e}^{\rm d}, \qquad\qquad\textrm{(3)} + +with :math:`K` the bulk modulus and :math:`\alpha` related to the shear +modulus :math:`G` as + +.. math:: + + \alpha = \frac{15 G}{m}. + +The remaining components of the model are described as follows. Define +the reference position scalar state :math:`\underline{x}` so that +:math:`\underline{x}\left<\boldsymbol{\xi} \right> = \left\Vert +\boldsymbol{\xi} \right\Vert`. Then, the weighted volume :math:`m` is +defined as + +.. math:: + + m\left[ \mathbf{x} \right] = \int_{\mathcal{H}_\mathbf{x}} + \underline{\omega} \left<\boldsymbol{\xi}\right> + \underline{x}\left<\boldsymbol{\xi} \right> + \underline{x}\left<\boldsymbol{\xi} \right>{d}V_{\boldsymbol{\xi} }. \qquad\qquad\textrm{(4)} + +Let + +.. math:: + + \underline{e}\left[ \mathbf{x},t \right] \left<\boldsymbol{\xi} + \right> = \left\Vert \boldsymbol{\xi} + \boldsymbol{\eta} + \right\Vert - \left\Vert \boldsymbol{\xi} \right\Vert + +be the extension scalar state, and + +.. math:: + + \theta\left[ \mathbf{x}, t \right] = \frac{3}{m\left[ \mathbf{x} + \right]}\int_{\mathcal{H}_\mathbf{x}} \underline{\omega} + \left<\boldsymbol{\xi}\right> \underline{x}\left<\boldsymbol{\xi} + \right> \underline{e}\left[ \mathbf{x},t + \right]\left<\boldsymbol{\xi} \right>{d}V_{\boldsymbol{\xi}} + +be the dilatation. The isotropic and deviatoric parts of the extension +scalar state are defined, respectively, as + +.. math:: + + \underline{e}^{\rm i}=\frac{\theta \underline{x}}{3}, \qquad + \underline{e}^{\rm d} = \underline{e}- \underline{e}^{\rm i}, + + +where the arguments of the state functions and the vectors on which they +operate are omitted for simplicity. We note that the LPS model is linear +in the dilatation :math:`\theta`, and in the deviatoric part of the +extension :math:`\underline{e}^{\rm d}`. + +.. note:: + + The weighted volume :math:`m` is time-independent, and does + not change as bonds break. It is computed with respect to the bond + family defined at the reference (initial) configuration. + +The non-negative scalar state :math:`\underline{\omega}` is an +*influence function* :ref:`(Silling 2007) `. For more on +influence functions, see :ref:`(Seleson 2010) `. If an +influence function :math:`\underline{\omega}` depends only upon the +scalar :math:`\left\Vert \boldsymbol{\xi} \right\Vert`, (i.e., +:math:`\underline{\omega}\left<\boldsymbol{\xi}\right> = +\underline{\omega}\left<\left\Vert \boldsymbol{\xi} \right\Vert\right>`\ +), then :math:`\underline{\omega}` is a spherical influence function. +For a spherical influence function, the LPS model is isotropic +:ref:`(Silling 2007) `. + +.. note:: + + In the LAMMPS implementation of the LPS model, the influence function + :math:`\underline{\omega}\left<\left\Vert \boldsymbol{\xi} + \right\Vert\right> = 1 / \left\Vert \boldsymbol{\xi} \right\Vert` is + used. However, the user can define their own influence function by + altering the method "influence_function" in the file + ``pair_peri_lps.cpp``. The LAMMPS peridynamics code permits both + spherical and non-spherical influence functions (e.g., isotropic and + non-isotropic materials). + + +Prototype Microelastic Brittle (PMB) Model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We summarize the prototype microelastic brittle (PMB) material +model. For more on this model, the reader is referred to +:ref:`(Silling 2000) ` and :ref:`(Silling 2005) +`. This model is a special case of the LPS model; see +:ref:`(Seleson 2010) ` for the derivation. The elastic +properties of the PMB model are determined by the bulk modulus :math:`K` +and the horizon :math:`\delta`. + +The PMB model is expressed using the scalar force state field + +.. _periPMBState: + +.. math:: + + \underline{t}\left[ \mathbf{x},t \right]\left< \boldsymbol{\xi} \right> = \frac{1}{2} f\left( \boldsymbol{\eta} ,\boldsymbol{\xi} \right), \qquad\qquad\textrm{(5)} + +with :math:`f` a scalar-valued function. We assume that :math:`f` takes +the form + +.. math:: + + f = c s, + +where + +.. _peric: + +.. math:: + + c = \frac{18K}{\pi \delta^4}, \qquad\qquad\textrm{(6)} + +with :math:`K` the bulk modulus and :math:`\delta` the horizon, and +:math:`s` the bond stretch, defined as + +.. math:: + + s(t,\mathbf{\eta},\mathbf{\xi}) = \frac{ \left\Vert {\mathbf{\eta}+\mathbf{\xi}} \right\Vert - \left\Vert {\mathbf{\xi}} \right\Vert }{\left\Vert {\mathbf{\xi}} \right\Vert}. + +Bond stretch is a unitless quantity, and identical to a one-dimensional +definition of strain. As such, we see that a bond at its equilibrium +length has stretch :math:`s=0`, and a bond at twice its equilibrium +length has stretch :math:`s=1`. The constant :math:`c` given above is +appropriate for 3D models only. For more on the origins of the constant +:math:`c`, see :ref:`(Silling 2005) `. For the derivation +of :math:`c` for 1D and 2D models, see :ref:`(Emmrich) `. + +Given :ref:`(5) `, :ref:`(1) ` reduces to + +.. math:: + + \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = \int_{\mathcal{H}_\mathbf{x}} \mathbf{f} \left( \boldsymbol{\eta},\boldsymbol{\xi} \right){d}V_{\boldsymbol{\xi}} + \mathbf{b}(\mathbf{x},t), \qquad\qquad\textrm{(7)} + +with + +.. math:: + + \mathbf{f} \left( \boldsymbol{\eta}, \boldsymbol{\xi}\right) =f \left( \boldsymbol{\eta}, \boldsymbol{\xi}\right) \frac{\boldsymbol{\xi}+ \boldsymbol{\eta}}{ \left\Vert {\boldsymbol{\xi} + \boldsymbol{\eta}} \right\Vert}. + +Unlike the LPS model, the PMB model has a Poisson ratio of +:math:`\nu=1/4` in 3D, and :math:`\nu=1/3` in 2D. This is reflected in +the input for the PMB model, which requires only the bulk modulus of the +material, whereas the LPS model requires both the bulk and shear moduli. + +.. _peridamage: + +Damage +^^^^^^ + +Bonds are made to break when they are stretched beyond a given +limit. Once a bond fails, it is failed forever :ref:`(Silling) +`. Further, new bonds are never created during the course +of a simulation. We discuss only one criterion for bond breaking, called +the *critical stretch* criterion. + +Define :math:`\mu` to be the history-dependent scalar +boolean function + +.. _perimu: + +.. math:: + + \mu(t,\mathbf{\eta},\mathbf{\xi}) = \left\{ + \begin{array}{cl} + 1 & \mbox{if $s(t^\prime,\mathbf{\eta},\mathbf{\xi})< \min \left(s_0(t^\prime,\mathbf{\eta},\mathbf{\xi}) , s_0(t^\prime,\mathbf{\eta}^\prime,\mathbf{\xi}^\prime) \right)$ for all $0 \leq t^\prime \leq t$} \\ + 0 & \mbox{otherwise} + \end{array}\right\}. \qquad\qquad\textrm{(8)} + +where :math:`\mathbf{\eta}^\prime = \textbf{u}(\textbf{x}^{\prime +\prime},t) - \textbf{u}(\textbf{x}^\prime,t)` and +:math:`\mathbf{\xi}^\prime = \textbf{x}^{\prime \prime} - +\textbf{x}^\prime`. Here, :math:`s_0(t,\mathbf{\eta},\mathbf{\xi})` is a +critical stretch defined as + +.. _peris0: + +.. math:: + + s_0(t,\mathbf{\eta},\mathbf{\xi}) = s_{00} - \alpha s_{\min}(t,\mathbf{\eta},\mathbf{\xi}), \qquad s_{\min}(t) = \min_{\mathbf{\xi}} s(t,\mathbf{\eta},\mathbf{\xi}), \qquad\qquad\textrm{(9)} + +where :math:`s_{00}` and :math:`\alpha` are material-dependent +constants. The history function :math:`\mu` breaks bonds when the +stretch :math:`s` exceeds the critical stretch :math:`s_0`. + +Although :math:`s_0(t,\mathbf{\eta},\mathbf{\xi})` is expressed as a +property of a particle, bond breaking must be a symmetric operation for +all particle pairs sharing a bond. That is, particles :math:`\textbf{x}` +and :math:`\textbf{x}^\prime` must utilize the same test when deciding +to break their common bond. This can be done by any method that treats +the particles symmetrically. In the definition of :math:`\mu` above, we +have chosen to take the minimum of the two :math:`s_0` values for +particles :math:`\textbf{x}` and :math:`\textbf{x}^\prime` when +determining if the :math:`\textbf{x}`--:math:`\textbf{x}^\prime` bond +should be broken. + +Following :ref:`(Silling) `, we can define the damage at a +point :math:`\textbf{x}` as + +.. _peridamageeq: + +.. math:: + + \varphi(\textbf{x}, t) = 1 - \frac{\int_{\mathcal{H}_{\textbf{x}}} \mu(t,\mathbf{\eta},\mathbf{\xi}) dV_{\textbf{x}^\prime} + }{ \int_{\mathcal{H}_{\textbf{x}}} dV_{\textbf{x}^\prime} }. \qquad\qquad\textrm{(10)} + +Discrete Peridynamic Model and LAMMPS Implementation +"""""""""""""""""""""""""""""""""""""""""""""""""""" + +In LAMMPS, instead of :ref:`(1) `, we model this equation of +motion: + +.. math:: + + \rho(\mathbf{x}) \ddot{\textbf{y}}(\mathbf{x},t) = \int_{\mathcal{H}_{\mathbf{x}}} + \left\{ \underline{\mathbf{T}}\left[ \mathbf{x},t \right]\left<\mathbf{x}^{\prime}-\mathbf{x} \right> + - \underline{\mathbf{T}}\left[\mathbf{x}^{\prime},t \right]\left<\mathbf{x}-\mathbf{x}^{\prime} \right> \right\} + {d}V_{\mathbf{x}^\prime} + \mathbf{b}(\mathbf{x},t), + +where we explicitly track and store at each timestep the positions and +not the displacements of the particles. We observe that +:math:`\ddot{\textbf{y}}(\textbf{x}, t) = \ddot{\textbf{x}} + +\ddot{\textbf{u}}(\textbf{x}, t) = \ddot{\textbf{u}}(\textbf{x}, t)`, so +that this is equivalent to :ref:`(1) `. + +Spatial Discretization +^^^^^^^^^^^^^^^^^^^^^^ + +The region defining a peridynamic material is discretized into particles +forming a simple cubic lattice with lattice constant :math:`\Delta x`, +where each particle :math:`i` is associated with some volume fraction +:math:`V_i`. For any particle :math:`i`, let :math:`\mathcal{F}_i` +denote the family of particles for which particle :math:`i` shares a +bond in the reference configuration. That is, + +.. _periBondFamily: + +.. math:: + + \mathcal{F}_i = \{ p ~ | ~ \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert \leq \delta \}. \qquad\qquad\textrm{(11)} + +The discretized equation of motion replaces :ref:`(1) ` with + +.. _peridiscreteNewtonII: + +.. math:: + + \rho \ddot{\textbf{y}}_i^n = + \sum_{p \in \mathcal{F}_i} + \left\{ \underline{\mathbf{T}}\left[ \textbf{x}_i,t \right]\left<\textbf{x}_p^{\prime}-\textbf{x}_i \right> + - \underline{\mathbf{T}}\left[\textbf{x}_p,t \right]\left<\textbf{x}_i-\textbf{x}_p \right> \right\} + V_{p} + \textbf{b}_i^n, \qquad\qquad\textrm{(12)} + +where :math:`n` is the timestep number and subscripts denote the particle number. + +Short-Range Forces +^^^^^^^^^^^^^^^^^^ + +In the model discussed so far, particles interact only through their +bond forces. A particle with no bonds becomes a free non-interacting +particle. To account for contact forces, short-range forces are +introduced :ref:`(Silling 2007) `. We add to the force in +:ref:`(12) ` the following force + +.. math:: + + \textbf{f}_S(\textbf{y}_p,\textbf{y}_i) = \min \left\{ 0, \frac{c_S}{\delta}(\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert - d_{pi}) \right\} + \frac{\textbf{y}_p-\textbf{y}_i}{\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert}, \qquad\qquad\textrm{(13)} + +where :math:`d_{pi}` is the short-range interaction distance between +particles :math:`p` and :math:`i`, and :math:`c_S` is a multiple of the +constant :math:`c` from :ref:`(6) `. Note that the short-range force +is always repulsive, never attractive. In practice, we choose + +.. _pericS: + +.. math:: + + c_S = 15 \frac{18K}{\pi \delta^4}. \qquad\qquad\textrm{(14)} + +For the short-range interaction distance, we choose :ref:`(Silling 2007) +` + +.. math:: + + d_{pi} = \min \left\{ 0.9 \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert, 1.35 (r_p + r_i) \right\}, \qquad\qquad\textrm{(15)} + +where :math:`r_i` is called the *node radius* of particle +:math:`i`. Given a discrete lattice, we choose :math:`r_i` to be half +the lattice constant. + +.. note:: + + For a simple cubic lattice, :math:`\Delta x = \Delta y = \Delta z`. + +Given this definition of :math:`d_{pi}`, contact forces appear only when +particles are under compression. + +When accounting for short-range forces, it is convenient to define the +short-range family of particles + +.. math:: + + \mathcal{F}^S_i = \{ p ~ | ~ \left\Vert {\textbf{y}_p - \textbf{y}_i} \right\Vert \leq d_{pi} \}. + + +Modification to the Particle Volume +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The right-hand side of :ref:`(12) ` may be thought of as +a midpoint quadrature of :ref:`(1) `. To slightly improve the +accuracy of this quadrature, we discuss a modification to the particle +volume used in :ref:`(12) `. In a situation where two +particles share a bond with :math:`\left\Vert { \textbf{x}_p - +\textbf{x}_i }\right\Vert = \delta`, for example, we suppose that only +approximately half the volume of each particle is "seen" by the other +:ref:`(Silling 2007) `. When computing the force of each +particle on the other we use :math:`V_p / 2` rather than :math:`V_p` in +:ref:`(12) `. As such, we introduce a nodal volume +scaling function for all bonded particles where :math:`\delta - r_i \leq +\left\Vert { \textbf{x}_p - \textbf{x}_i } \right\Vert \leq \delta` (see +the Figure below). + +We choose to use a linear unitless nodal volume scaling function + +.. math:: + + \nu(\textbf{x}_p - \textbf{x}_i) = \left\{ + \begin{array}{cl} + -\frac{1}{2 r_i} \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert + \left( \frac{\delta}{2 r_i} + \frac{1}{2} \right) & \mbox{if } + \delta - r_i \leq \left\Vert {\textbf{x}_p - \textbf{x}_i } \right\Vert \leq \delta \\ + 1 & \mbox{if } \left\Vert {\textbf{x}_p - \textbf{x}_i } \right\Vert \leq \delta - r_i \\ + 0 & \mbox{otherwise} + \end{array} + \right\} + +If :math:`\left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert = \delta`, :math:`\nu = 0.5`, and if +:math:`\left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert = \delta - r_i`, :math:`\nu = 1.0`, for +example. + + +.. figure:: JPG/pdlammps_fig1.png + :figwidth: 80% + :figclass: align-center + + Diagram showing horizon of a particular particle, demonstrating that + the volume associated with particles near the boundary of the horizon is + not completely contained within the horizon. + +Temporal Discretization +^^^^^^^^^^^^^^^^^^^^^^^ + +When discretizing time in LAMMPS, we use a velocity-Verlet scheme, where +both the position and velocity of the particle are stored +explicitly. The velocity-Verlet scheme is generally expressed in three +steps. In :ref:`Algorithm 1 `, :math:`\rho_i` denotes the +mass density of a particle and :math:`\widetilde{\textbf{f}}_i^n` +denotes the the net force density on particle :math:`i` at timestep +:math:`n`. The LAMMPS command :doc:`fix nve ` performs a +velocity-Verlet integration. + + .. _algvelverlet: + + .. admonition:: Algorithm 1: Velocity Verlet + :class: tip + + | 1: :math:`\textbf{v}_i^{n + 1/2} = \textbf{v}_i^n + \frac{\Delta t}{2 \rho_i} \widetilde{\textbf{f}}_i^n` + | 2: :math:`\textbf{y}_i^{n+1} = \textbf{y}_i^n + \Delta t \textbf{v}_i^{n + 1/2}` + | 3: :math:`\textbf{v}_i^{n+1} = \textbf{v}_i^{n+1/2} + \frac{\Delta t}{2 \rho_i} \widetilde{\textbf{f}}_i^{n+1}` + +Breaking Bonds +^^^^^^^^^^^^^^ + +During the course of simulation, it may be necessary to break bonds, as +described in the :ref:`Damage section `. Bonds are recorded +as broken in a simulation by removing them from the bond family +:math:`\mathcal{F}_i` (see :ref:`(11) `). + +A naive implementation would have us first loop over all bonds and +compute :math:`s_{min}` in :ref:`(9) `, then loop over all bonds +again and break bonds with a stretch :math:`s > s0` as in +:ref:`(8) `, and finally loop over all particles and compute forces +for the next step of :ref:`Algorithm 1 `. For reasons of +computational efficiency, we will utilize the values of :math:`s_0` from +the *previous* timestep when deciding to break a bond. + +.. note:: + + For the first timestep, :math:`s_0` is initialized to + :math:`\mathbf{\infty}` for all nodes. This means that no bonds may + be broken until the second timestep. As such, it is recommended that + the first few timesteps of the peridynamic simulation not involve any + actions that might result in the breaking of bonds. As a practical + example, the projectile in the :ref:`commented example below + ` is placed such that it does not impact the target + brittle plate until several timesteps into the simulation. + +LPS Pseudocode +^^^^^^^^^^^^^^ + +A sketch of the LPS model implementation in the PERI package appears in +:ref:`Algorithm 2 `. This algorithm makes use of the +routines in :ref:`Algorithm 3 ` and :ref:`Algorithm 4 +`. + + .. _algperilps: + + .. admonition:: Algorithm 2: LPS Peridynamic Model Pseudocode + :class: tip + + | Fix :math:`s_{00}`, :math:`\alpha`, horizon :math:`\delta`, bulk modulus :math:`K`, shear modulus :math:`G`, timestep :math:`\Delta t`, and generate initial lattice of particles with lattice constant :math:`\Delta x`. Let there be :math:`N` particles. Define constant :math:`c_S` for repulsive short-range forces. + | Initialize bonds between all particles :math:`i \neq j` where :math:`\left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert \leq \delta` + | Initialize weighted volume :math:`m` for all particles using :ref:`Algorithm 3 ` + | Initialize :math:`s_0 = \mathbf{\infty}` {*Initialize each entry to MAX_DOUBLE*} + | **while** not done **do** + | Perform step 1 of :ref:`Algorithm 1 `, updating velocities of all particles + | Perform step 2 of :ref:`Algorithm 1 `, updating positions of all particles + | :math:`\tilde{s}_0 = \mathbf{\infty}` {*Initialize each entry to MAX_DOUBLE*} + | **for** :math:`i=1` to :math:`N` **do** + | {Compute short-range forces} + | **for all** particles :math:`j \in \mathcal{F}^S_i` (the short-range family of nodes for particle :math:`i`) **do** + | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` + | :math:`dr = \min \{ 0, r - d \}` {*Short-range forces are only repulsive, never attractive*} + | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in :ref:`(14) `*} + | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` + | **end for** + | **end for** + | Compute the dilatation for each particle using :ref:`Algorithm 4 ` + | **for** :math:`i=1` to :math:`N` **do** + | {Compute bond forces} + | **for all** particles :math:`j` sharing an unbroken bond with particle :math:`i` **do** + | :math:`e = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert - \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert` + | :math:`\omega_+ = \underline{\omega}\left<\textbf{x}_j - \textbf{x}_i\right>` {*Influence function evaluation*} + | :math:`\omega_- = \underline{\omega}\left<\textbf{x}_i - \textbf{x}_j\right>` {*Influence function evaluation*} + | :math:`\hat{f} = \left[ (3K-5G)\left( \frac{\theta(i)}{m(i)}\omega_+ + \frac{\theta(j)}{m(j)}\omega_- \right) \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert + 15G \left( \frac{\omega_+}{m(i)} + \frac{\omega_-}{m(j)} \right) e \right] \nu(\textbf{x}_j - \textbf{x}_i) V_j` + | :math:`\textbf{f} = \textbf{f} + \hat{f} \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` + | **if** :math:`(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert) > \min(s_0(i), s_0(j))` **then** + | Break :math:`i`'s bond with :math:`j` {:math:`j` *'s bond with* :math:`i` *will be broken when this loop iterates on* :math:`j`} + | **end if** + | :math:`\tilde{s}_0(i) = \min (\tilde{s}_0(i),s_{00}-\alpha(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert))` + | **end for** + | **end for** + | :math:`s_0 = \tilde{s}_0` {*Store for use in next timestep*} + | Perform step 3 of :ref:`Algorithm 1 `, updating velocities of all particles + | **end while** + + + .. _algperilpsm: + + .. admonition:: Algorithm 3: Computation of Weighted Volume *m* + :class: tip + + | **for** :math:`i=1` to :math:`N` **do** + | :math:`m(i) = 0.0` + | **for all** particles :math:`j` sharing a bond with particle :math:`i` **do** + | :math:`m(i) = m(i) + \underline{\omega}\left<\textbf{x}_j - \textbf{x}_i\right> \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert^2 \nu(\textbf{x}_j - \textbf{x}_i) V_j` + | **end for** + | **end for** + + .. _algperilpstheta: + + .. admonition:: Algorithm 4: Computation of Dilatation :math:`\theta` + :class: tip + + | **for** :math:`i=1` to :math:`N` **do** + | :math:`\theta(i) = 0.0` + | **for all** particles :math:`j` sharing an unbroken bond with particle :math:`i` **do** + | :math:`e = \left\Vert {\textbf{y}_i - \textbf{y}_j} \right\Vert - \left\Vert {\textbf{x}_i - \textbf{x}_j} \right\Vert` + | :math:`\theta(i) = \theta(i) + \underline{\omega}\left<\textbf{x}_j - \textbf{x}_i\right> \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert e \nu(\textbf{x}_j - \textbf{x}_i) V_j` + | **end for** + | :math:`\theta(i) = \frac{3}{m(i)}\theta(i)` + | **end for** + +PMB Pseudocode +^^^^^^^^^^^^^^ + +A sketch of the PMB model implementation in the PERI package appears in +:ref:`Algorithm 5 `. + + .. _algperipmb: + + .. admonition:: Algorithm 5: PMB Peridynamic Model Pseudocode + :class: tip + + | Fix :math:`s_{00}`, :math:`\alpha`, horizon :math:`\delta`, spring constant :math:`c`, timestep :math:`\Delta t`, and generate initial lattice of particles with lattice constant :math:`\Delta x`. Let there be :math:`N` particles. + | Initialize bonds between all particles :math:`i \neq j` where :math:`\left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert \leq \delta` + | Initialize :math:`s_0 = \mathbf{\infty}` {*Initialize each entry to MAX_DOUBLE*} + | **while** not done **do** + | Perform step 1 of :ref:`Algorithm 1 `, updating velocities of all particles + | Perform step 2 of :ref:`Algorithm 1 `, updating positions of all particles + | :math:`\tilde{s}_0 = \mathbf{\infty}` {*Initialize each entry to MAX_DOUBLE*} + | **for** :math:`i=1` to :math:`N` **do** + | {Compute short-range forces} + | **for all** particles :math:`j \in \mathcal{F}^S_i` (the short-range family of nodes for particle :math:`i`) **do** + | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` + | :math:`dr = \min \{ 0, r - d \}` {*Short-range forces are only repulsive, never attractive*} + | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in :ref:`(14) `*} + | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` + | **end for** + | **end for** + | **for** :math:`i=1` to :math:`N` **do** + | {Compute bond forces} + | **for all** particles :math:`j` sharing an unbroken bond with particle :math:`i` **do** + | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` + | :math:`dr = r - \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert` + | :math:`k = \frac{c}{\left\Vert {\textbf{x}_i - \textbf{x}_j} \right\Vert} \nu(\textbf{x}_i - \textbf{x}_j) V_j dr` {:math:`c` *defined in :ref:`(6) `*} + | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` + | **if** :math:`(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert) > \min(s_0(i), s_0(j))` **then** + | Break :math:`i`'s bond with :math:`j` {:math:`j`\ *'s bond with* :math:`i` *will be broken when this loop iterates on* :math:`j`} + | **end if** + | :math:`\tilde{s}_0(i) = \min (\tilde{s}_0(i),s_{00}-\alpha(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert))` + | **end for** + | **end for** + | :math:`s_0 = \tilde{s}_0` {*Store for use in next timestep*} + | Perform step 3 of :ref:`Algorithm 1 `, updating velocities of all particles + | **end while** + +Damage +^^^^^^ + +The damage associated with every particle (see :ref:`(10) `) can +optionally be computed and output with a LAMMPS data dump. To do this, +your input script must contain the command :doc:`compute damage/atom +` This enables a LAMMPS per-atom compute to +calculate the damage associated with each particle every time a LAMMPS +:doc:`data dump ` frame is written. + +Visualizing Simulation Results +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There are multiple ways to visualize the simulation results. Typically, +you want to display the particles and color code them by the value +computed with the :doc:`compute damage/atom ` +command. + +This can be done, for example, by using the built-in visualizer of the +:doc:`dump image or dump movie ` command to create snapshot +images or a movie. Below are example command lines for using dump image +with the :ref:`example listed below ` and a set of images +created for steps 300, 600, and 2000 this way. + +.. code-block:: LAMMPS + + dump D2 all image 100 dump.peri.*.png c_C1 type box no 0.0 view 30 60 zoom 1.5 up 0 0 -1 ssao yes 4539 0.6 + dump_modify D2 pad 5 adiam * 0.001 amap 0.0 1.0 ca 0.1 3 min blue 0.5 yellow max red + +.. |periimage1| image:: JPG/dump.peri.300.png + :width: 32% + +.. |periimage2| image:: JPG/dump.peri.600.png + :width: 32% + +.. |periimage3| image:: JPG/dump.peri.2000.png + :width: 32% + +|periimage1| |periimage2| |periimage3| + +For interactive visualization, the `Ovito `_ is very +convenient to use. Below are steps to create a visualization of the +:ref:`same example from below ` now using the generated +trajectory in the ``dump.peri`` file. + +- Launch Ovito +- File -> Load File -> ``dump.peri`` +- Select "-> Particle types" and under "Appearance" set "Display radius:" to 0.0005 +- From the "Add modification:" drop down list select "Color coding" +- Under "Color coding" select from the "Color gradient" drop down list "Jet" +- Also under "Color coding" set "Start value:" to 0 and "End value:" to 1 +- You can improve the image quality by adding the "Ambient occlusion" modification + +.. figure:: JPG/ovito-peri-snap.png + :figwidth: 80% + :figclass: align-center + + Screenshot of visualizing a trajectory with Ovito + +Pitfalls +^^^^^^^^ + +**Parallel Scalability** + +LAMMPS operates in parallel in a :doc:`spatial-decomposition mode +`, where each processor owns a spatial sub-domain of +the overall simulation domain and communicates with its neighboring +processors via distributed-memory message passing (MPI) to acquire ghost +atom information to allow forces on the atoms it owns to be +computed. LAMMPS also uses Verlet neighbor lists which are recomputed +every few timesteps as particles move. On these timesteps, particles +also migrate to new processors as needed. LAMMPS decomposes the overall +simulation domain so that spatial sub-domains of nearly equal volume are +assigned to each processor. When each sub-domain contains nearly the +same number of particles, this results in a reasonable load balance +among all processors. As is more typical with some peridynamic +simulations, some sub-domains may contain many particles while other +sub-domains contain few particles, resulting in a load imbalance that +impacts parallel scalability. + +**Setting the "skin" distance** + +The :doc:`neighbor ` command with LAMMPS is used to set the +so-called "skin" distance used when building neighbor lists. All atom +pairs within a cutoff distance equal to the horizon :math:`\delta` plus +the skin distance are stored in the list. Unexpected crashes in LAMMPS +may be due to too small a skin distance. The skin should be set to a +value such that :math:`\delta` plus the skin distance is larger than the +maximum possible distance between two bonded particles. For example, if +:math:`s_{00}` is increased, the skin distance may also need to be +increased. + +**"Lost" particles** + +All particles are contained within the "simulation box" of LAMMPS. The +boundaries of this box may change with time, or not, depending on how +the LAMMPS :doc:`boundary ` command has been set. If a +particle drifts outside the simulation box during the course of a +simulation, it is called *lost*. + +As an option of the :doc:`themo_modify ` command of +LAMMPS, the lost keyword determines whether LAMMPS checks for lost atoms +each time it computes thermodynamics and what it does if atoms are +lost. If the value is *ignore*, LAMMPS does not check for lost atoms. If +the value is *error* or *warn*, LAMMPS checks and either issues an error +or warning. The code will exit with an error and continue with a +warning. This can be a useful debugging option. The default behavior of +LAMMPS is to exit with an error if a particle is lost. + +The peridynamic module within LAMMPS does not check for lost atoms. If a +particle with unbroken bonds is lost, those bonds are marked as broken +by the remaining particles. + +**Defining the peridynamic horizon** :math:`\mathbf{\delta}` + +In the :doc:`pair_coeff ` command, the user must specify the +horizon :math:`\delta`. This argument determines which particles are +bonded when the simulation is initialized. It is recommended that +:math:`\delta` be set to a small fraction of a lattice constant larger than +desired. + +For example, if the lattice constant is 0.0005 and you wish to set the +horizon to three times the lattice constant, then set :math:`\delta` to +be 0.0015001, a value slightly larger than three times the lattice +constant. This guarantees that particles three lattice constants away +from each other are still bonded. If :math:`\delta` is set to 0.0015, +for example, floating point error may result in some pairs of particles +three lattice constants apart not being bonded. + +**Breaking bonds too early** + +For technical reasons, the bonds in the simulation are not created until +the end of the first timestep of the simulation. Therefore, one should +not attempt to break bonds until at least the second step of the +simulation. + +Bugs +^^^^ + +The user is cautioned that this code is a beta release. If you are +confident that you have found a bug in the peridynamic module, please +report it in a `GitHub Issue ` +or send an email to the LAMMPS developers. First, check the `New +features and bug fixes `_ section of +the LAMMPS website site to see if the bug has already been reported or +fixed. If not, the most useful thing you can do for us is to isolate the +problem. Run it on the smallest number of atoms and fewest number of +processors and with the simplest input script that reproduces the +bug. In your message, describe the problem and any ideas you have as to +what is causing it or where in the code the problem might be. We'll +request your input script and data files if necessary. + +Modifying and Extending the Peridynamic Module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To add new features or peridynamic potentials to the peridynamic module, +the user is referred to the :doc:`Modifying & extending LAMMPS ` +section. To develop a new bond-based material, start with the *peri/pmb* +pair style as a template. To develop a new state-based material, start +with the *peri/lps* pair style as a template. + +A Numerical Example +""""""""""""""""""" + +To introduce the peridynamic implementation within LAMMPS, we replicate +a numerical experiment taken from section 6 of :ref:`(Silling 2005) +`. + +Problem Description and Setup +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We consider the impact of a rigid sphere on a homogeneous disk of +brittle material. The sphere has diameter :math:`0.01` m and velocity +100 m/s directed normal to the surface of the target. The target +material has density :math:`\rho = 2200` kg/m:math:`^3`. A PMB material +model is used with :math:`K = 14.9` GPa and critical bond stretch +parameters given by :math:`s_{00} = 0.0005` and :math:`\alpha = 0.25`. A +three-dimensional simple cubic lattice is constructed with lattice +constant :math:`0.0005` m and horizon :math:`0.0015` m. (The horizon is +three times the lattice constant.) The target is a cylinder of diameter +:math:`0.074` m and thickness :math:`0.0025` m, and the associated +lattice contains 103,110 particles. Each particle :math:`i` has volume +fraction :math:`V_i = 1.25 \times 10^{-10} \textrm{m}^3`. + +The spring constant in the PMB material model is (see :ref:`(6) `) + +.. math:: + + c = \frac{18k}{\pi \delta^4} = \frac{18 (14.9 \times 10^9)}{ \pi (1.5 \times 10^{-3})^4} \approx 1.6863 \times 10^{22}. + +The CFL analysis from :ref:`(Silling2005) ` shows that a +timestep of :math:`1.0 \times 10^{-7}` is safe. + +We observe here that in IEEE double-precision floating point arithmetic +when computing the bond stretch :math:`s(t,\mathbf{\eta},\mathbf{\xi})` +at each iteration where :math:`\left\Vert {\mathbf{\eta}+\mathbf{\xi}} +\right\Vert` is computed during the iteration and :math:`\left\Vert +{\mathbf{\xi}} \right\Vert` was computed and stored for the initial +lattice, it may be that :math:`fl(s) = \varepsilon` with :math:`\left| +\varepsilon \right| \leq \varepsilon_{machine}` for an unstretched +bond. Taking :math:`\varepsilon = 2.220446049250313 \times 10^{-16}`, we +see that the value :math:`c s V_i \approx 4.68 \times 10^{-4}`, computed +when determining :math:`f`, is perhaps larger than we would like, +especially when the true force should be zero. One simple way to avoid +this issue is to insert the following instructions in Algorithm +:ref:`Algorithm 5 ` after instruction 21 (and similarly for +Algorithm :ref:`Algorithm 2 `): + + | **if** :math:`\left| dr \right| < \varepsilon_{machine}` **then** + | :math:`dr = 0` + | **end if** + +Qualitatively, this says that displacements from equilibrium on the +order of :math:`10^{-16}`\ m are taken to be exactly zero, a seemingly +reasonable assumption. + +The Projectile +^^^^^^^^^^^^^^ + +The projectile used in the following experiments is not the one used in +:ref:`(Silling 2005) `. The projectile used here exerts a +force + +.. math:: + + F(r) = - k_s (r - R)^2 + +on each atom where :math:`k_s` is a specified force constant, :math:`r` is +the distance from the atom to the center of the indenter, and :math:`R` +is the radius of the projectile. The force is repulsive and :math:`F(r) = +0` for :math:`r > R`. For our problem, the projectile radius :math:`R = +0.05` m, and we have chosen :math:`k_s = 1.0 \times 10^{17}` (compare +with :ref:`(6) ` above). + +Writing the LAMMPS Input File +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We discuss the example input script :ref:`listed below `. +In line 2 we specify that SI units are to be used. We specify the +dimension (3) and boundary conditions ("shrink-wrapped") for the +computational domain in lines 3 and 4. In line 5 we specify that +peridynamic particles are to be used for this simulation. In line 7, we +set the "skin" distance used in building the LAMMPS neighbor list. In +line 8 we set the lattice constant (in meters) and in line 10 we define +the spatial region where the target will be placed. In line 12 we +specify a rectangular box enclosing the target region that defines the +simulation domain. Line 14 fills the target region with atoms. Lines 15 +and 17 define the peridynamic material model, and lines 19 and 21 set +the particle density and particle volume, respectively. The particle +volume should be set to the cube of the lattice constant for a simple +cubic lattice. Line 23 sets the initial velocity of all particles to +zero. Line 25 instructs LAMMPS to integrate time with velocity-Verlet, +and lines 27-30 create the spherical projectile, sending it with a +velocity of 100 m/s towards the target. Line 32 declares a compute style +for the damage (percentage of broken bonds) associated with each +particle. Line 33 sets the timestep, line 34 instructs LAMMPS to +provide a screen dump of thermodynamic quantities every 200 timesteps, +and line 35 instructs LAMMPS to create a data file (``dump.peri``) with +a complete snapshot of the system every 100 timesteps. This file can be +used to create still images or movies. Finally, line 36 instructs LAMMPS +to run for 2000 timesteps. + +.. _periexample: + +.. code-block:: LAMMPS + :linenos: + :caption: Peridynamics Example LAMMPS Input Script + + # 3D Peridynamic simulation with projectile" + units si + dimension 3 + boundary s s s + atom_style peri + atom_modify map array + neighbor 0.0010 bin + lattice sc 0.0005 + # Create desired target + region target cylinder y 0.0 0.0 0.037 -0.0025 0.0 units box + # Make 1 atom type + create_box 1 target + # Create the atoms in the simulation region + create_atoms 1 region target + pair_style peri/pmb + # + pair_coeff * * 1.6863e22 0.0015001 0.0005 0.25 + # Set mass density + set group all density 2200 + # volume = lattice constant^3 + set group all volume 1.25e-10 + # Zero out velocities of particles + velocity all set 0.0 0.0 0.0 sum no units box + # Use velocity-Verlet time integrator + fix F1 all nve + # Construct spherical indenter to shatter target + variable y0 equal 0.00510 + variable vy equal -100 + variable y equal "v_y0 + step*dt*v_vy" + fix F2 all indent 1e17 sphere 0.0000 v_y 0.0000 0.0050 units box + # Compute damage for each particle + compute C1 all damage/atom + timestep 1.0e-7 + thermo 200 + dump D1 all custom 100 dump.peri id type x y z c_C1 + run 2000 + +.. note:: + + To use the LPS model, replace line 15 with :doc:`pair_style peri/lps + ` and modify line 16 accordingly. + +Numerical Results and Discussion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We ran the :ref:`input script from above `. Images of the +disk (projectile not shown) appear in Figure below. The plot of damage +on the top monolayer was created by coloring each particle according to +its damage. + +The symmetry in the computed solution arises because a "perfect" lattice +was used, and a because a perfectly spherical projectile impacted the +lattice at its geometric center. To break the symmetry in the solution, +the nodes in the peridynamic body may be perturbed slightly from the +lattice sites. To do this, the lattice of points can be slightly +perturbed using the :doc:`displace_atoms ` command. + +.. _figperitarget: + +.. figure:: JPG/pdlammps_fig2.png + :figwidth: 80% + :figclass: align-center + + Target during (a) and after (b,c) impact + +------------ + +.. _Emmrich2007: + +**(Emmrich)** Emmrich, Weckner, Commun. Math. Sci., 5, 851-864 (2007), + +.. _Parks2: + +**(Parks)** Parks, Lehoucq, Plimpton, Silling, Comp Phys Comm, 179(11), 777-783 (2008). + +.. _Silling2000_2: + +**(Silling 2000)** Silling, J Mech Phys Solids, 48, 175-209 (2000). + +.. _Silling2005: + +**(Silling 2005)** Silling Askari, Computer and Structures, 83, 1526-1535 (2005). + +.. _Silling2007_2: + +**(Silling 2007)** Silling, Epton, Weckner, Xu, Askari, J Elasticity, 88, 151-184 (2007). + +.. _Seleson2010: + +**(Seleson 2010)** Seleson, Parks, Int J Mult Comp Eng 9(6), pp. 689-706, 2011. diff --git a/doc/src/Howto_spc.rst b/doc/src/Howto_spc.rst index d334b09b4a..520942547e 100644 --- a/doc/src/Howto_spc.rst +++ b/doc/src/Howto_spc.rst @@ -38,7 +38,7 @@ the partial charge assignments change: See the :ref:`(Berendsen) ` reference for more details on both the SPC and SPC/E models. -Wikipedia also has a nice article on `water models `_. +Wikipedia also has a nice article on `water models `_. ---------- diff --git a/doc/src/Howto_spins.rst b/doc/src/Howto_spins.rst index 87e30a5f6f..8ca220f596 100644 --- a/doc/src/Howto_spins.rst +++ b/doc/src/Howto_spins.rst @@ -30,9 +30,11 @@ can be coupled to another Langevin thermostat applied to the atoms using :doc:`fix langevin ` in order to simulate thermostatted spin-lattice systems. -The magnetic Gilbert damping can also be applied using :doc:`fix langevin/spin `. It allows to either dissipate -the thermal energy of the Langevin thermostat, or to perform a -relaxation of the magnetic configuration toward an equilibrium state. +The magnetic damping can also be applied +using :doc:`fix langevin/spin `. +It allows to either dissipate the thermal energy of the Langevin +thermostat, or to perform a relaxation of the magnetic configuration +toward an equilibrium state. The command :doc:`fix setforce/spin ` allows to set the components of the magnetic precession vectors (while erasing and @@ -52,9 +54,11 @@ All the computed magnetic properties can be output by two main commands. The first one is :doc:`compute spin `, that enables to evaluate magnetic averaged quantities, such as the total magnetization of the system along x, y, or z, the spin temperature, or -the magnetic energy. The second command is :doc:`compute property/atom `. It enables to output all the -per atom magnetic quantities. Typically, the orientation of a given -magnetic spin, or the magnetic force acting on this spin. +the magnetic energy. The second command +is :doc:`compute property/atom `. +It enables to output all the per atom magnetic quantities. Typically, +the orientation of a given magnetic spin, or the magnetic force +acting on this spin. ---------- diff --git a/doc/src/Howto_tip3p.rst b/doc/src/Howto_tip3p.rst index 7f7ddbdf2a..5571b3291a 100644 --- a/doc/src/Howto_tip3p.rst +++ b/doc/src/Howto_tip3p.rst @@ -49,7 +49,7 @@ details: | :math:`\theta` of HOH angle = 104.52\ :math:`^{\circ}` | -Wikipedia also has a nice article on `water models `_. +Wikipedia also has a nice article on `water models `_. ---------- diff --git a/doc/src/Howto_tip4p.rst b/doc/src/Howto_tip4p.rst index 9856b8fbe7..19b811a282 100644 --- a/doc/src/Howto_tip4p.rst +++ b/doc/src/Howto_tip4p.rst @@ -8,18 +8,28 @@ This site M is located at a fixed distance away from the oxygen along the bisector of the HOH bond angle. A bond style of *harmonic* and an angle style of *harmonic* or *charmm* should also be used. -A TIP4P model is run with LAMMPS using either this command +A TIP4P model is run with LAMMPS using either these commands for a cutoff model: +* :doc:`pair_style tip4p/cut ` * :doc:`pair_style lj/cut/tip4p/cut ` -or these two commands for a long-range model: +or these commands for a long-range model: +* :doc:`pair_style tip4p/long ` * :doc:`pair_style lj/cut/tip4p/long ` +* :doc:`pair_style lj/long/tip4p/long ` +* :doc:`pair_style tip4p/long/soft ` +* :doc:`pair_style lj/cut/tip4p/long/soft ` * :doc:`kspace_style pppm/tip4p ` +* :doc:`kspace_style pppm/disp/tip4p ` -For both models, the bond lengths and bond angles should be held fixed -using the :doc:`fix shake ` command. +The bond lengths and bond angles should be held fixed using the +:doc:`fix shake ` or :doc:`fix rattle ` command, +unless a parameterization for a flexible TIP4P model is used. The +parameter sets listed below are all for rigid TIP4P model variants and +thus the bond and angle force constants are not used and can be set to +any legal value; only equilibrium length and angle are used. These are the additional parameters (in real units) to set for O and H atoms and the water molecule to run a rigid TIP4P model with a cutoff @@ -87,17 +97,18 @@ solver (e.g. Ewald or PPPM in LAMMPS): | LJ :math:`\epsilon`, :math:`\sigma` of OH, HH = 0.0 | -Note that the when using the TIP4P pair style, the neighbor list -cutoff for Coulomb interactions is effectively extended by a distance -2 \* (OM distance), to account for the offset distance of the -fictitious charges on O atoms in water molecules. Thus it is -typically best in an efficiency sense to use a LJ cutoff >= Coulomb -cutoff + 2\*(OM distance), to shrink the size of the neighbor list. -This leads to slightly larger cost for the long-range calculation, so -you can test the trade-off for your model. The OM distance and the LJ -and Coulombic cutoffs are set in the :doc:`pair_style lj/cut/tip4p/long ` command. +Note that the when using the TIP4P pair style, the neighbor list cutoff +for Coulomb interactions is effectively extended by a distance 2 \* (OM +distance), to account for the offset distance of the fictitious charges +on O atoms in water molecules. Thus it is typically best in an +efficiency sense to use a LJ cutoff >= Coulomb cutoff + 2\*(OM +distance), to shrink the size of the neighbor list. This leads to +slightly larger cost for the long-range calculation, so you can test the +trade-off for your model. The OM distance and the LJ and Coulombic +cutoffs are set in the :doc:`pair_style lj/cut/tip4p/long +` command. -Wikipedia also has a nice article on `water models `_. +Wikipedia also has a nice article on `water models `_. ---------- diff --git a/doc/src/Howto_viz.rst b/doc/src/Howto_viz.rst index 7c74aab8bf..28ecbfb838 100644 --- a/doc/src/Howto_viz.rst +++ b/doc/src/Howto_viz.rst @@ -17,9 +17,10 @@ formats. See the :doc:`Tools ` page for details. A Python-based toolkit distributed by our group can read native LAMMPS dump files, including custom dump files with additional columns of -user-specified atom information, and convert them to various formats -or pipe them into visualization software directly. See the `Pizza.py WWW site `_ for details. Specifically, Pizza.py can convert -LAMMPS dump files into PDB, XYZ, `EnSight `_, and VTK formats. +user-specified atom information, and convert them to various formats or +pipe them into visualization software directly. See the `Pizza.py WWW +site `_ for details. Specifically, Pizza.py can convert LAMMPS +dump files into PDB, XYZ, `EnSight `_, and VTK formats. Pizza.py can pipe LAMMPS dump files directly into the Raster3d and RasMol visualization programs. Pizza.py has tools that do interactive 3d OpenGL visualization and one that creates SVG images of dump file diff --git a/doc/src/Install_conda.rst b/doc/src/Install_conda.rst index efb7b6146a..34b45fcf8b 100644 --- a/doc/src/Install_conda.rst +++ b/doc/src/Install_conda.rst @@ -5,7 +5,7 @@ Binaries are available for MacOS or Linux via `Conda `_. First, one must setup the Conda package manager on your system. Follow the instructions to install `Miniconda `_, then create a conda -environment (named `my-lammps-env` or whatever you prefer) for your lammps +environment (named `my-lammps-env` or whatever you prefer) for your LAMMPS install: .. code-block:: bash @@ -13,7 +13,7 @@ install: % conda config --add channels conda-forge % conda create -n my-lammps-env -Then, you can install lammps on your system with the following command: +Then, you can install LAMMPS on your system with the following command: .. code-block:: bash diff --git a/doc/src/Install_windows.rst b/doc/src/Install_windows.rst index 108c03c249..fc167d7e68 100644 --- a/doc/src/Install_windows.rst +++ b/doc/src/Install_windows.rst @@ -6,7 +6,7 @@ Windows system can be downloaded from this site: .. parsed-literal:: - `http://packages.lammps.org/windows.html `_ + `https://packages.lammps.org/windows.html `_ Note that each installer package has a date in its name, which corresponds to the LAMMPS version of the same date. Installers for diff --git a/doc/src/Intro_authors.rst b/doc/src/Intro_authors.rst index a0902ccda1..b76e2486de 100644 --- a/doc/src/Intro_authors.rst +++ b/doc/src/Intro_authors.rst @@ -4,13 +4,13 @@ Authors of LAMMPS The primary LAMMPS developers are at Sandia National Labs and Temple University: -* `Steve Plimpton `_, sjplimp at sandia.gov +* `Steve Plimpton `_, sjplimp at gmail.com * Aidan Thompson, athomps at sandia.gov * Stan Moore, stamoor at sandia.gov * Axel Kohlmeyer, akohlmey at gmail.com * Richard Berger, richard.berger at outlook.com -.. _sjp: http://www.cs.sandia.gov/~sjplimp +.. _sjp: https://sjplimp.github.io .. _lws: https://www.lammps.org Past developers include Paul Crozier and Mark Stevens, both at Sandia, diff --git a/doc/src/Intro_citing.rst b/doc/src/Intro_citing.rst index aaf62028ae..56955cae3a 100644 --- a/doc/src/Intro_citing.rst +++ b/doc/src/Intro_citing.rst @@ -27,7 +27,7 @@ namely https://www.lammps.org. The original publication describing the parallel algorithms used in the initial versions of LAMMPS is: - `S. Plimpton, Fast Parallel Algorithms for Short-Range Molecular Dynamics, J Comp Phys, 117, 1-19 (1995). `_ + `S. Plimpton, Fast Parallel Algorithms for Short-Range Molecular Dynamics, J Comp Phys, 117, 1-19 (1995). `_ DOI for the LAMMPS source code diff --git a/doc/src/Intro_features.rst b/doc/src/Intro_features.rst index 2b0409b007..9344710a16 100644 --- a/doc/src/Intro_features.rst +++ b/doc/src/Intro_features.rst @@ -95,7 +95,7 @@ commands) * metal-organic framework potentials (QuickFF, MO-FF) * implicit solvent potentials: hydrodynamic lubrication, Debye * force-field compatibility with common CHARMM, AMBER, DREIDING, OPLS, GROMACS, COMPASS options -* access to the `OpenKIM Repository `_ of potentials via :doc:`kim command ` +* access to the `OpenKIM Repository `_ of potentials via the :doc:`kim command ` * hybrid potentials: multiple pair, bond, angle, dihedral, improper potentials can be used in one simulation * overlaid potentials: superposition of multiple pair potentials (including many-body) with optional scale factor @@ -205,7 +205,7 @@ Pre- and post-processing .. _pizza: https://lammps.github.io/pizza -.. _python: http://www.python.org +.. _python: https://www.python.org .. _special: diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index d9a977196f..b1d68c8594 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -33,7 +33,7 @@ Here are suggestions on how to perform these tasks: linear bead-spring polymer chains. The moltemplate program is a true molecular builder that will generate complex molecular models. See the :doc:`Tools ` page for details on tools packaged with - LAMMPS. The `Pre/post processing page `_ of the LAMMPS website + LAMMPS. The `Pre/post processing page `_ of the LAMMPS website describes a variety of third party tools for this task. Furthermore, some LAMMPS internal commands allow to reconstruct, or selectively add topology information, as well as provide the option to insert molecule @@ -80,5 +80,5 @@ Here are suggestions on how to perform these tasks: `Pizza.py `_ which can do certain kinds of setup, analysis, plotting, and visualization (via OpenGL) for LAMMPS simulations. It thus provides some functionality for several of the - above bullets. Pizza.py is written in `Python `_ - and is available for download from `this page `_. + above bullets. Pizza.py is written in `Python `_ + and is available for download from `this page `_. diff --git a/doc/src/Intro_opensource.rst b/doc/src/Intro_opensource.rst index a1baaf5185..fba0a78189 100644 --- a/doc/src/Intro_opensource.rst +++ b/doc/src/Intro_opensource.rst @@ -23,9 +23,9 @@ applies to LAMMPS is in the LICENSE file included in the LAMMPS distribution. .. _lgpl: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html -.. _gnuorg: http://www.gnu.org +.. _gnuorg: https://www.gnu.org -.. _opensource: http://www.opensource.org +.. _opensource: https://www.opensource.org Here is a more specific summary of what the GPL means for LAMMPS users: diff --git a/doc/src/JPG/dump.peri.2000.png b/doc/src/JPG/dump.peri.2000.png new file mode 100644 index 0000000000..d8cacb4bb2 Binary files /dev/null and b/doc/src/JPG/dump.peri.2000.png differ diff --git a/doc/src/JPG/dump.peri.300.png b/doc/src/JPG/dump.peri.300.png new file mode 100644 index 0000000000..17771bc26c Binary files /dev/null and b/doc/src/JPG/dump.peri.300.png differ diff --git a/doc/src/JPG/dump.peri.600.png b/doc/src/JPG/dump.peri.600.png new file mode 100644 index 0000000000..6fdeb036bc Binary files /dev/null and b/doc/src/JPG/dump.peri.600.png differ diff --git a/doc/src/JPG/ovito-peri-snap.png b/doc/src/JPG/ovito-peri-snap.png new file mode 100644 index 0000000000..80b0f3c55e Binary files /dev/null and b/doc/src/JPG/ovito-peri-snap.png differ diff --git a/doc/src/JPG/pdlammps_fig1.png b/doc/src/JPG/pdlammps_fig1.png new file mode 100644 index 0000000000..94fc6a3e85 Binary files /dev/null and b/doc/src/JPG/pdlammps_fig1.png differ diff --git a/doc/src/JPG/pdlammps_fig2.png b/doc/src/JPG/pdlammps_fig2.png new file mode 100644 index 0000000000..618a83be4c Binary files /dev/null and b/doc/src/JPG/pdlammps_fig2.png differ diff --git a/doc/src/Library.rst b/doc/src/Library.rst index 05b652f7a7..3533c347c8 100644 --- a/doc/src/Library.rst +++ b/doc/src/Library.rst @@ -2,12 +2,13 @@ LAMMPS Library Interfaces ************************* As described on the :doc:`library interface to LAMMPS ` -page, LAMMPS can be built as a library (static or shared), so that -it can be called by another code, used in a :doc:`coupled manner +page, LAMMPS can be built as a library (static or shared), so that it +can be called by another code, used in a :doc:`coupled manner ` with other codes, or driven through a :doc:`Python -script `. Even the LAMMPS standalone executable is -essentially a thin wrapper on top of the LAMMPS library, creating a -LAMMPS instance, processing input and then existing. +script `. The LAMMPS standalone executable itself is +essentially a thin wrapper on top of the LAMMPS library, which creates a +LAMMPS instance, passes the input for processing to that instance, and +then exits. Most of the APIs described below are based on C language wrapper functions in the files ``src/library.h`` and ``src/library.cpp``, but @@ -87,6 +88,18 @@ run LAMMPS in serial mode. message retrieved `. We thus recommend enabling C++ exceptions when using the library interface, +.. admonition:: Using the C library interface as a plugin + :class: note + + Rather than including the C library directly and link to the LAMMPS + library at compile time, you can use the ``liblammpsplugin.h`` header + file and the ``liblammpsplugin.c`` C code in the + ``examples/COUPLE/plugin`` folder for an interface to LAMMPS that is + largely identical to the regular library interface, only that it will + load a LAMMPS shared library file at runtime. This can be useful for + applications where the interface to LAMMPS would be an optional + feature. + .. warning:: No checks are made on the arguments of the function calls of the C @@ -163,5 +176,3 @@ The following links provide some examples and references to the C++ API. :maxdepth: 1 Cplusplus - - diff --git a/doc/src/Library_create.rst b/doc/src/Library_create.rst index 8043819891..8ccc2e80ce 100644 --- a/doc/src/Library_create.rst +++ b/doc/src/Library_create.rst @@ -11,6 +11,7 @@ This section documents the following functions: - :cpp:func:`lammps_mpi_finalize` - :cpp:func:`lammps_kokkos_finalize` - :cpp:func:`lammps_python_finalize` +- :cpp:func:`lammps_error` -------------------- @@ -115,3 +116,8 @@ calling program. .. doxygenfunction:: lammps_python_finalize :project: progguide + +----------------------- + +.. doxygenfunction:: lammps_error + :project: progguide diff --git a/doc/src/Library_objects.rst b/doc/src/Library_objects.rst index eed14b3a05..8ebecfcc94 100644 --- a/doc/src/Library_objects.rst +++ b/doc/src/Library_objects.rst @@ -6,6 +6,7 @@ fixes, or variables in LAMMPS using the following functions: - :cpp:func:`lammps_extract_compute` - :cpp:func:`lammps_extract_fix` +- :cpp:func:`lammps_extract_variable_datatype` - :cpp:func:`lammps_extract_variable` - :cpp:func:`lammps_set_variable` @@ -21,6 +22,11 @@ fixes, or variables in LAMMPS using the following functions: ----------------------- +.. doxygenfunction:: lammps_extract_variable_datatype + :project: progguide + +----------------------- + .. doxygenfunction:: lammps_extract_variable :project: progguide @@ -36,3 +42,5 @@ fixes, or variables in LAMMPS using the following functions: .. doxygenenum:: _LMP_STYLE_CONST .. doxygenenum:: _LMP_TYPE_CONST + +.. doxygenenum:: _LMP_VAR_CONST diff --git a/doc/src/Library_properties.rst b/doc/src/Library_properties.rst index e023c78185..dfd72adc95 100644 --- a/doc/src/Library_properties.rst +++ b/doc/src/Library_properties.rst @@ -15,21 +15,21 @@ This section documents the following functions: -------------------- -The library interface allows extraction of different kinds of -information about the active simulation instance and also -modifications to it. This enables combining of a LAMMPS simulation -with other processing and simulation methods computed by the calling -code, or by another code that is coupled to LAMMPS via the library -interface. In some cases the data returned is direct reference to the -original data inside LAMMPS, cast to a void pointer. In that case the -data needs to be cast to a suitable pointer for the calling program to -access it, and you may need to know the correct dimensions and -lengths. This also means you can directly change those value(s) from -the calling program, e.g. to modify atom positions. Of course, this -should be done with care. When accessing per-atom data, please note -that this data is the per-processor **local** data and is indexed -accordingly. Per-atom data can change sizes and ordering at every -neighbor list rebuild or atom sort event as atoms migrate between +The library interface allows the extraction of different kinds of +information about the active simulation instance and also---in some +cases---to apply modifications to it. This enables combining of a +LAMMPS simulation with other processing and simulation methods computed +by the calling code, or by another code that is coupled to LAMMPS via +the library interface. In some cases the data returned is direct +reference to the original data inside LAMMPS, cast to a void pointer. +In that case the data needs to be cast to a suitable pointer for the +calling program to access it, and you may need to know the correct +dimensions and lengths. This also means you can directly change those +value(s) from the calling program (e.g., to modify atom positions). Of +course, changing values should be done with care. When accessing per-atom +data, please note that these data are the per-processor **local** data and are +indexed accordingly. Per-atom data can change sizes and ordering at +every neighbor list rebuild or atom sort event as atoms migrate between sub-domains and processors. .. code-block:: C diff --git a/doc/src/Library_utility.rst b/doc/src/Library_utility.rst index da64e3b8f0..9d16daae0b 100644 --- a/doc/src/Library_utility.rst +++ b/doc/src/Library_utility.rst @@ -19,6 +19,7 @@ functions. They do not directly call the LAMMPS library. - :cpp:func:`lammps_force_timeout` - :cpp:func:`lammps_has_error` - :cpp:func:`lammps_get_last_error_message` +- :cpp:func:`lammps_python_api_version` The :cpp:func:`lammps_free` function is a clean-up function to free memory that the library had allocated previously via other function @@ -100,3 +101,9 @@ where such memory buffers were allocated that require the use of .. doxygenfunction:: lammps_get_last_error_message :project: progguide + +----------------------- + +.. doxygenfunction:: lammps_python_api_version + :project: progguide + diff --git a/doc/src/Manual.rst b/doc/src/Manual.rst index 14d4862c40..5a5d5c88fa 100644 --- a/doc/src/Manual.rst +++ b/doc/src/Manual.rst @@ -42,7 +42,7 @@ descriptions of all commands included in the LAMMPS code. .. only:: html Once you are familiar with LAMMPS, you may want to bookmark - :doc:`this page ` since it gives quick access + :doc:`this page ` since it gives quick access to the documentation for all LAMMPS commands. .. _lws: https://www.lammps.org diff --git a/doc/src/Modify_style.rst b/doc/src/Modify_style.rst index 9b394f23a9..ad2cb656d0 100644 --- a/doc/src/Modify_style.rst +++ b/doc/src/Modify_style.rst @@ -359,6 +359,12 @@ you are uncertain, please ask. - I/O is done via the C-style stdio library and **not** iostreams. +- Do not use so-called "alternative tokens" like ``and``, ``or``, + ``not`` and similar, but rather use the corresponding operators + ``&&``, ``||``, and ``!``. The alternative tokens are not available + by default on all compilers, and also we want to maintain a consistent + programming style. + - Output to the screen and the logfile should be using the corresponding FILE pointers and only be done on MPI rank 0. Use the :cpp:func:`utils::logmesg` convenience function where possible. diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index cd85839b9f..84a7eb9b87 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -135,6 +135,8 @@ commands to write and read data using the ADIOS library. **Authors:** Norbert Podhorszki (ORNL) from the ADIOS developer team. +.. versionadded:: 28Feb2019 + **Install:** This package has :ref:`specific installation instructions ` on the :doc:`Build extras ` page. @@ -199,6 +201,7 @@ particle models including ellipsoids, 2d lines, and 3d triangles. * :doc:`Howto spherical ` * :doc:`pair_style gayberne ` * :doc:`pair_style resquared ` +* :doc:`pair_style ylz ` * `doc/PDF/pair_gayberne_extra.pdf `_ * `doc/PDF/pair_resquared_extra.pdf `_ * examples/ASPHERE @@ -365,6 +368,8 @@ and also support self-propelled particles. **Authors:** Sam Cameron (University of Bristol), Stefan Paquay (while at Brandeis University) (initial version of fix propel/self) +.. versionadded:: 14May2021 + Example inputs are in the examples/PACKAGES/brownian folder. ---------- @@ -593,6 +598,8 @@ To use this package, also the :ref:`KSPACE ` and **Author:** Trung Nguyen and Monica Olvera de la Cruz (Northwestern U) +.. versionadded:: 2Jul2021 + **Supporting info:** * src/DIELECTRIC: filenames -> commands @@ -1072,7 +1079,7 @@ H5MD is a format for molecular simulations, built on top of HDF5. This package implements a :doc:`dump h5md ` command to output LAMMPS snapshots in this format. -.. _HDF5: http://www.hdfgroup.org/HDF5 +.. _HDF5: https://www.hdfgroup.org/solutions/hdf5 To use this package you must have the HDF5 library available on your system. @@ -1513,6 +1520,8 @@ workflows via the `MolSSI Driver Interface **Author:** Taylor Barnes - MolSSI, taylor.a.barnes at gmail.com +.. versionadded:: 14May2021 + **Install:** This package has :ref:`specific installation instructions ` on @@ -1597,6 +1606,8 @@ of Alabama), Leonid V. Zhigilei (University of Virginia) **Author of the *mesocnt* styles:** Philipp Kloza (U Cambridge) +.. versionadded:: 15Jun2020 + **Supporting info:** * src/MESONT: filenames -> commands @@ -1689,6 +1700,8 @@ compiled on your system. **Author:** Andreas Singraber +.. versionadded:: 27May2021 + **Install:** This package has :ref:`specific installation instructions ` on the @@ -1723,6 +1736,8 @@ must be installed. **Author:** Aidan Thompson (Sandia), Nicholas Lubbers (LANL). +.. versionadded:: 30Jun2020 + **Supporting info:** * src/ML-IAP: filenames -> commands @@ -1767,6 +1782,8 @@ Aidan Thompson^3, Gabor Csanyi^2, Christoph Ortner^4, Ralf Drautz^1. ^4: University of British Columbia, Vancouver, BC, Canada +.. versionadded:: 14May2021 + **Install:** This package has :ref:`specific installation instructions ` on the @@ -1868,6 +1885,8 @@ of a neural network. This package was written by Christopher Barrett with contributions by Doyl Dickel, Mississippi State University. +.. versionadded:: 27May2021 + **Supporting info:** * src/ML-RANN: filenames -> commands @@ -1993,7 +2012,7 @@ support for new file formats can be added to LAMMPS (or VMD or other programs that use them) without having to re-compile the application itself. More information about the VMD molfile plugins can be found at -`http://www.ks.uiuc.edu/Research/vmd/plugins/molfile `_. +`https://www.ks.uiuc.edu/Research/vmd/plugins/molfile `_. **Author:** Axel Kohlmeyer (Temple U). @@ -2084,7 +2103,7 @@ NETCDF package Dump styles for writing NetCDF formatted dump files. NetCDF is a portable, binary, self-describing file format developed on top of HDF5. The file contents follow the AMBER NetCDF trajectory conventions -(http://ambermd.org/netcdf/nctraj.xhtml), but include extensions. +(https://ambermd.org/netcdf/nctraj.xhtml), but include extensions. To use this package you must have the NetCDF library available on your system. @@ -2095,7 +2114,7 @@ tools: * `Ovito `_ (Ovito supports the AMBER convention and the extensions mentioned above) * `VMD `_ -.. _ovito: http://www.ovito.org +.. _ovito: https://www.ovito.org .. _vmd-home: https://www.ks.uiuc.edu/Research/vmd/ @@ -2239,6 +2258,7 @@ Foster (UTSA). **Supporting info:** * src/PERI: filenames -> commands +* :doc:`Peridynamics Howto ` * `doc/PDF/PDLammps_overview.pdf `_ * `doc/PDF/PDLammps_EPS.pdf `_ * `doc/PDF/PDLammps_VES.pdf `_ @@ -2303,6 +2323,8 @@ try to load the contained plugins automatically at start-up. **Authors:** Axel Kohlmeyer (Temple U) +.. versionadded:: 8Apr2021 + **Supporting info:** * src/PLUGIN: filenames -> commands @@ -2456,7 +2478,7 @@ A :doc:`fix qmmm ` command which allows LAMMPS to be used as the MM code in a QM/MM simulation. This is currently only available in combination with the `Quantum ESPRESSO `_ package. -.. _espresso: http://www.quantum-espresso.org +.. _espresso: https://www.quantum-espresso.org To use this package you must have Quantum ESPRESSO (QE) available on your system and include its coupling library in the compilation and @@ -2868,7 +2890,7 @@ collection of atoms by wrapping the `Voro++ library `_. This can be used to calculate the local volume or each atoms or its near neighbors. -.. _voro-home: http://math.lbl.gov/voro++ +.. _voro-home: https://math.lbl.gov/voro++ To use this package you must have the Voro++ library available on your system. @@ -2902,9 +2924,9 @@ A :doc:`dump vtk ` command which outputs snapshot info in the `VTK format `_, enabling visualization by `Paraview `_ or other visualization packages. -.. _vtk: http://www.vtk.org +.. _vtk: https://www.vtk.org -.. _paraview: http://www.paraview.org +.. _paraview: https://www.paraview.org To use this package you must have VTK library available on your system. @@ -2941,11 +2963,13 @@ which discuss the `QuickFF `_ methodology. .. _vanduyfhuys2015: https://doi.org/10.1002/jcc.23877 .. _vanduyfhuys2018: https://doi.org/10.1002/jcc.25173 -.. _quickff: http://molmod.github.io/QuickFF +.. _quickff: https://molmod.github.io/QuickFF .. _yaff: https://github.com/molmod/yaff **Author:** Steven Vandenbrande. +.. versionadded:: 1Feb2019 + **Supporting info:** * src/YAFF/README diff --git a/doc/src/Python_examples.rst b/doc/src/Python_examples.rst index fe5fe812c5..f795827230 100644 --- a/doc/src/Python_examples.rst +++ b/doc/src/Python_examples.rst @@ -43,26 +43,18 @@ Note that for AtomEye, you need version 3, and there is a line in the scripts that specifies the path and name of the executable. See the AtomEye web pages for more details: -* `http://li.mit.edu/Archive/Graphics/A/ `_ -* `http://li.mit.edu/Archive/Graphics/A3/A3.html `_ +* `http://li.mit.edu/Archive/Graphics/A/ `_ +* `http://li.mit.edu/Archive/Graphics/A3/A3.html `_ -.. _atomeye: http://li.mit.edu/Archive/Graphics/A/ - -.. _atomeye3: http://li.mit.edu/Archive/Graphics/A3/A3.html - -The latter link is to AtomEye 3 which has the scripting -capability needed by these Python scripts. +The latter link is to AtomEye 3 which has the scripting capability +needed by these Python scripts. Note that for PyMol, you need to have built and installed the open-source version of PyMol in your Python, so that you can import it from a Python script. See the PyMol web pages for more details: - * `https://www.pymol.org `_ - * `https://github.com/schrodinger/pymol-open-source `_ - -.. _pymolhome: https://www.pymol.org - -.. _pymolopen: https://github.com/schrodinger/pymol-open-source + * `https://www.pymol.org `_ + * `https://github.com/schrodinger/pymol-open-source `_ The latter link is to the open-source version. diff --git a/doc/src/Python_head.rst b/doc/src/Python_head.rst index 3e84ed4506..3aab3a0d4b 100644 --- a/doc/src/Python_head.rst +++ b/doc/src/Python_head.rst @@ -18,17 +18,17 @@ together. Python_error Python_trouble -If you are not familiar with `Python `_, it is a +If you are not familiar with `Python `_, it is a powerful scripting and programming language which can do almost everything that compiled languages like C, C++, or Fortran can do in fewer lines of code. It also comes with a large collection of add-on modules for many purposes (either bundled or easily installed from Python code repositories). The major drawback is slower execution speed of the script code compared to compiled programming languages. But when -the script code is interfaced to optimized compiled code, performance can -be on par with a standalone executable, for as long as the scripting is -restricted to high-level operations. Thus Python is also convenient to -use as a "glue" language to "drive" a program through its library +the script code is interfaced to optimized compiled code, performance +can be on par with a standalone executable, for as long as the scripting +is restricted to high-level operations. Thus Python is also convenient +to use as a "glue" language to "drive" a program through its library interface, or to hook multiple pieces of software together, such as a simulation code and a visualization tool, or to run a coupled multi-scale or multi-physics model. diff --git a/doc/src/Python_neighbor.rst b/doc/src/Python_neighbor.rst index 00c4cc8996..755b83da81 100644 --- a/doc/src/Python_neighbor.rst +++ b/doc/src/Python_neighbor.rst @@ -38,6 +38,40 @@ using the NumPy access method. for n in np.nditer(nlist): print(" atom {} with ID {}".format(n,tags[n])) +Another example for extracting a full neighbor list without evaluating a +potential is shown below. + +.. code-block:: python + + from lammps import lammps + import numpy as np + + lmp = lammps() + lmp.commands_string(""" + newton off + region box block -2 2 -2 2 -2 2 + lattice fcc 1.0 + create_box 1 box + create_atoms 1 box + mass 1 1.0 + pair_style zero 1.0 full + pair_coeff * * + run 0 post no""") + + # look up the neighbor list + nlidx = lmp.find_pair_neighlist('zero') + nl = lmp.numpy.get_neighlist(nlidx) + tags = lmp.extract_atom('id') + print("full neighbor list with {} entries".format(nl.size)) + # print neighbor list contents + for i in range(0,nl.size): + idx, nlist = nl.get(i) + print("\natom {} with ID {} has {} neighbors:".format(idx,tags[idx],nlist.size)) + if nlist.size > 0: + for n in np.nditer(nlist): + pass + print(" atom {} with ID {}".format(n,tags[n])) + **Methods:** * :py:meth:`lammps.get_neighlist() `: Get neighbor list for given index diff --git a/doc/src/Run_basics.rst b/doc/src/Run_basics.rst index 5f1211d093..d2810f5986 100644 --- a/doc/src/Run_basics.rst +++ b/doc/src/Run_basics.rst @@ -30,12 +30,13 @@ executable itself can be placed elsewhere. .. note:: - The redirection operator "<" will not always work when running - in parallel with mpirun or mpiexec; for those systems the -in form is required. + The redirection operator "<" will not always work when running in + parallel with ``mpirun`` or ``mpiexec``; for those systems the -in + form is required. As LAMMPS runs it prints info to the screen and a logfile named -*log.lammps*\ . More info about output is given on the -:doc:`screen and logfile output ` page. +*log.lammps*\ . More info about output is given on the :doc:`screen and +logfile output ` page. If LAMMPS encounters errors in the input script or while running a simulation it will print an ERROR message and stop or a WARNING diff --git a/doc/src/Run_options.rst b/doc/src/Run_options.rst index f3c7973197..f7bb652ea9 100644 --- a/doc/src/Run_options.rst +++ b/doc/src/Run_options.rst @@ -93,13 +93,13 @@ switch is not set (the default), LAMMPS will operate as if the KOKKOS package were not installed; i.e. you can run standard LAMMPS or with the GPU or OPENMP packages, for testing or benchmarking purposes. -Additional optional keyword/value pairs can be specified which -determine how Kokkos will use the underlying hardware on your -platform. These settings apply to each MPI task you launch via the -"mpirun" or "mpiexec" command. You may choose to run one or more MPI -tasks per physical node. Note that if you are running on a desktop -machine, you typically have one physical node. On a cluster or -supercomputer there may be dozens or 1000s of physical nodes. +Additional optional keyword/value pairs can be specified which determine +how Kokkos will use the underlying hardware on your platform. These +settings apply to each MPI task you launch via the ``mpirun`` or +``mpiexec`` command. You may choose to run one or more MPI tasks per +physical node. Note that if you are running on a desktop machine, you +typically have one physical node. On a cluster or supercomputer there +may be dozens or 1000s of physical nodes. Either the full word or an abbreviation can be used for the keywords. Note that the keywords do not use a leading minus sign. I.e. the @@ -148,9 +148,9 @@ one of these 4 environment variables MV2_COMM_WORLD_LOCAL_RANK (Mvapich) OMPI_COMM_WORLD_LOCAL_RANK (OpenMPI) -which are initialized by the "srun", "mpirun" or "mpiexec" commands. -The environment variable setting for each MPI rank is used to assign a -unique GPU ID to the MPI task. +which are initialized by the ``srun``, ``mpirun``, or ``mpiexec`` +commands. The environment variable setting for each MPI rank is used to +assign a unique GPU ID to the MPI task. .. parsed-literal:: diff --git a/doc/src/Run_output.rst b/doc/src/Run_output.rst index a988be94ad..28f66d6ae9 100644 --- a/doc/src/Run_output.rst +++ b/doc/src/Run_output.rst @@ -16,46 +16,47 @@ simulation. An example set of statistics is shown here: .. parsed-literal:: - Loop time of 2.81192 on 4 procs for 300 steps with 2004 atoms + Loop time of 0.942801 on 4 procs for 300 steps with 2004 atoms - Performance: 18.436 ns/day 1.302 hours/ns 106.689 timesteps/s - 97.0% CPU use with 4 MPI tasks x no OpenMP threads + Performance: 54.985 ns/day, 0.436 hours/ns, 318.201 timesteps/s, 637.674 katom-step/s + 195.2% CPU use with 2 MPI tasks x 2 OpenMP threads - MPI task timings breakdown: + MPI task timing breakdown: Section \| min time \| avg time \| max time \|%varavg\| %total --------------------------------------------------------------- - Pair \| 1.9808 \| 2.0134 \| 2.0318 \| 1.4 \| 71.60 - Bond \| 0.0021894 \| 0.0060319 \| 0.010058 \| 4.7 \| 0.21 - Kspace \| 0.3207 \| 0.3366 \| 0.36616 \| 3.1 \| 11.97 - Neigh \| 0.28411 \| 0.28464 \| 0.28516 \| 0.1 \| 10.12 - Comm \| 0.075732 \| 0.077018 \| 0.07883 \| 0.4 \| 2.74 - Output \| 0.00030518 \| 0.00042665 \| 0.00078821 \| 1.0 \| 0.02 - Modify \| 0.086606 \| 0.086631 \| 0.086668 \| 0.0 \| 3.08 - Other \| \| 0.007178 \| \| \| 0.26 + Pair \| 0.61419 \| 0.62872 \| 0.64325 \| 1.8 \| 66.69 + Bond \| 0.0028608 \| 0.0028899 \| 0.002919 \| 0.1 \| 0.31 + Kspace \| 0.12652 \| 0.14048 \| 0.15444 \| 3.7 \| 14.90 + Neigh \| 0.10242 \| 0.10242 \| 0.10242 \| 0.0 \| 10.86 + Comm \| 0.026753 \| 0.027593 \| 0.028434 \| 0.5 \| 2.93 + Output \| 0.00018341 \| 0.00030942 \| 0.00043542 \| 0.0 \| 0.03 + Modify \| 0.039117 \| 0.039348 \| 0.039579 \| 0.1 \| 4.17 + Other \| \| 0.001041 \| \| \| 0.11 - Nlocal: 501 ave 508 max 490 min - Histogram: 1 0 0 0 0 0 1 1 0 1 - Nghost: 6586.25 ave 6628 max 6548 min - Histogram: 1 0 1 0 0 0 1 0 0 1 - Neighs: 177007 ave 180562 max 170212 min - Histogram: 1 0 0 0 0 0 0 1 1 1 + Nlocal: 1002 ave 1006 max 998 min + Histogram: 1 0 0 0 0 0 0 0 0 1 + Nghost: 8670.5 ave 8691 max 8650 min + Histogram: 1 0 0 0 0 0 0 0 0 1 + Neighs: 354010 ave 357257 max 350763 min + Histogram: 1 0 0 0 0 0 0 0 0 1 - Total # of neighbors = 708028 - Ave neighs/atom = 353.307 - Ave special neighs/atom = 2.34032 + Total # of neighbors = 708020 + Ave neighs/atom = 353.30339 + Ave special neighs/atom = 2.3403194 Neighbor list builds = 26 Dangerous builds = 0 ---------- -The first section provides a global loop timing summary. The *loop -time* is the total wall-clock time for the simulation to run. The -*Performance* line is provided for convenience to help predict how -long it will take to run a desired physical simulation. The *CPU use* -line provides the CPU utilization per MPI task; it should be close to -100% times the number of OpenMP threads (or 1 of not using OpenMP). -Lower numbers correspond to delays due to file I/O or insufficient -thread utilization. +The first section provides a global loop timing summary. The *loop time* +is the total wall-clock time for the simulation to run. The +*Performance* line is provided for convenience to help predict how long +it will take to run a desired physical simulation and to have numbers +useful for performance comparison between different simulation settings +or system sizes. The *CPU use* line provides the CPU utilization per +MPI task; it should be close to 100% times the number of OpenMP threads +(or 1 of not using OpenMP). Lower numbers correspond to delays due to +file I/O or insufficient thread utilization. ---------- diff --git a/doc/src/Run_windows.rst b/doc/src/Run_windows.rst index f29155a839..d36864b454 100644 --- a/doc/src/Run_windows.rst +++ b/doc/src/Run_windows.rst @@ -25,8 +25,8 @@ in parallel, follow these steps. Download and install a compatible MPI library binary package: -* for 32-bit Windows: `mpich2-1.4.1p1-win-ia32.msi `_ -* for 64-bit Windows: `mpich2-1.4.1p1-win-x86-64.msi `_ +* for 32-bit Windows: `mpich2-1.4.1p1-win-ia32.msi `_ +* for 64-bit Windows: `mpich2-1.4.1p1-win-x86-64.msi `_ The LAMMPS Windows installer packages will automatically adjust your path for the default location of this MPI package. After the diff --git a/doc/src/Speed_gpu.rst b/doc/src/Speed_gpu.rst index 9015bff9ef..e95787ebee 100644 --- a/doc/src/Speed_gpu.rst +++ b/doc/src/Speed_gpu.rst @@ -39,7 +39,7 @@ toolkit software on your system (this is only tested on Linux and unsupported on Windows): * Check if you have an NVIDIA GPU: cat /proc/driver/nvidia/gpus/\*/information -* Go to http://www.nvidia.com/object/cuda_get.html +* Go to https://developer.nvidia.com/cuda-downloads * Install a driver and toolkit appropriate for your system (SDK is not necessary) * Run lammps/lib/gpu/nvc_get_devices (after building the GPU library, see below) to list supported devices and properties @@ -76,10 +76,11 @@ instructions. **Run with the GPU package from the command line:** -The mpirun or mpiexec command sets the total number of MPI tasks used -by LAMMPS (one or multiple per compute node) and the number of MPI -tasks used per node. E.g. the mpirun command in MPICH does this via -its -np and -ppn switches. Ditto for OpenMPI via -np and -npernode. +The ``mpirun`` or ``mpiexec`` command sets the total number of MPI tasks +used by LAMMPS (one or multiple per compute node) and the number of MPI +tasks used per node. E.g. the ``mpirun`` command in MPICH does this via +its ``-np`` and ``-ppn`` switches. Ditto for OpenMPI via ``-np`` and +``-npernode``. When using the GPU package, you cannot assign more than one GPU to a single MPI task. However multiple MPI tasks can share the same GPU, @@ -129,8 +130,8 @@ GPU package pair styles. **Or run with the GPU package by editing an input script:** -The discussion above for the mpirun/mpiexec command, MPI tasks/node, -and use of multiple MPI tasks/GPU is the same. +The discussion above for the ``mpirun`` or ``mpiexec`` command, MPI +tasks/node, and use of multiple MPI tasks/GPU is the same. Use the :doc:`suffix gpu ` command, or you can explicitly add an "gpu" suffix to individual styles in your input script, e.g. diff --git a/doc/src/Speed_intel.rst b/doc/src/Speed_intel.rst index 2b53af8698..e3c3fc01f7 100644 --- a/doc/src/Speed_intel.rst +++ b/doc/src/Speed_intel.rst @@ -537,5 +537,5 @@ References """""""""" * Brown, W.M., Carrillo, J.-M.Y., Mishra, B., Gavhane, N., Thakkar, F.M., De Kraker, A.R., Yamada, M., Ang, J.A., Plimpton, S.J., "Optimizing Classical Molecular Dynamics in LAMMPS", in Intel Xeon Phi Processor High Performance Programming: Knights Landing Edition, J. Jeffers, J. Reinders, A. Sodani, Eds. Morgan Kaufmann. -* Brown, W. M., Semin, A., Hebenstreit, M., Khvostov, S., Raman, K., Plimpton, S.J. `Increasing Molecular Dynamics Simulation Rates with an 8-Fold Increase in Electrical Power Efficiency. `_ 2016 High Performance Computing, Networking, Storage and Analysis, SC16: International Conference (pp. 82-95). +* Brown, W. M., Semin, A., Hebenstreit, M., Khvostov, S., Raman, K., Plimpton, S.J. `Increasing Molecular Dynamics Simulation Rates with an 8-Fold Increase in Electrical Power Efficiency. `_ 2016 High Performance Computing, Networking, Storage and Analysis, SC16: International Conference (pp. 82-95). * Brown, W.M., Carrillo, J.-M.Y., Gavhane, N., Thakkar, F.M., Plimpton, S.J. Optimizing Legacy Molecular Dynamics Software with Directive-Based Offload. Computer Physics Communications. 2015. 195: p. 95-101. diff --git a/doc/src/Speed_kokkos.rst b/doc/src/Speed_kokkos.rst index 8b9b2e99af..73345b7e88 100644 --- a/doc/src/Speed_kokkos.rst +++ b/doc/src/Speed_kokkos.rst @@ -72,12 +72,12 @@ See the :ref:`Build extras ` page for instructions. Running LAMMPS with the KOKKOS package """""""""""""""""""""""""""""""""""""" -All Kokkos operations occur within the context of an individual MPI -task running on a single node of the machine. The total number of MPI -tasks used by LAMMPS (one or multiple per compute node) is set in the -usual manner via the mpirun or mpiexec commands, and is independent of -Kokkos. E.g. the mpirun command in OpenMPI does this via its -np and --npernode switches. Ditto for MPICH via -np and -ppn. +All Kokkos operations occur within the context of an individual MPI task +running on a single node of the machine. The total number of MPI tasks +used by LAMMPS (one or multiple per compute node) is set in the usual +manner via the ``mpirun`` or ``mpiexec`` commands, and is independent of +Kokkos. E.g. the mpirun command in OpenMPI does this via its ``-np`` and +``-npernode`` switches. Ditto for MPICH via ``-np`` and ``-ppn``. Running on a multi-core CPU ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -168,7 +168,7 @@ for your MPI installation), binding can be forced with these flags: .. parsed-literal:: - OpenMPI 1.8: mpirun -np 2 --bind-to socket --map-by socket ./lmp_openmpi ... + OpenMPI 1.8: mpirun -np 2 --bind-to socket --map-by socket ./lmp_openmpi ... Mvapich2 2.0: mpiexec -np 2 --bind-to socket --map-by socket ./lmp_mvapich ... For binding threads with KOKKOS OpenMP, use thread affinity environment @@ -310,7 +310,8 @@ Alternatively the effect of the "-sf" or "-pk" switches can be duplicated by adding the :doc:`package kokkos ` or :doc:`suffix kk ` commands to your input script. The discussion above for building LAMMPS with the KOKKOS package, the -mpirun/mpiexec command, and setting appropriate thread are the same. +``mpirun`` or ``mpiexec`` command, and setting appropriate thread +properties are the same. You must still use the "-k on" :doc:`command-line switch ` to enable the KOKKOS package, and specify its additional arguments for diff --git a/doc/src/Speed_omp.rst b/doc/src/Speed_omp.rst index 3d9cbe19e0..7f8913d20f 100644 --- a/doc/src/Speed_omp.rst +++ b/doc/src/Speed_omp.rst @@ -33,8 +33,8 @@ These examples assume one or more 16-core nodes. mpirun -np 4 lmp_omp -sf omp -pk omp 4 -in in.script # 4 MPI tasks, 4 threads/task mpirun -np 32 -ppn 4 lmp_omp -sf omp -pk omp 4 -in in.script # 8 nodes, 4 MPI tasks/node, 4 threads/task -The mpirun or mpiexec command sets the total number of MPI tasks used -by LAMMPS (one or multiple per compute node) and the number of MPI +The ``mpirun`` or ``mpiexec`` command sets the total number of MPI tasks +used by LAMMPS (one or multiple per compute node) and the number of MPI tasks used per node. E.g. the mpirun command in MPICH does this via its -np and -ppn switches. Ditto for OpenMPI via -np and -npernode. @@ -58,8 +58,8 @@ OMP_NUM_THREADS environment variable. Or run with the OPENMP package by editing an input script """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -The discussion above for the mpirun/mpiexec command, MPI tasks/node, -and threads/MPI task is the same. +The discussion above for the ``mpirun`` or ``mpiexec`` command, MPI +tasks/node, and threads/MPI task is the same. Use the :doc:`suffix omp ` command, or you can explicitly add an "omp" suffix to individual styles in your input script, e.g. @@ -97,7 +97,7 @@ sub-section. A description of the multi-threading strategy used in the OPENMP package and some performance examples are -`presented here `_. +`presented here `_. Guidelines for best performance """"""""""""""""""""""""""""""" diff --git a/doc/src/Speed_packages.rst b/doc/src/Speed_packages.rst index 74d470c9fd..f5ce57b94a 100644 --- a/doc/src/Speed_packages.rst +++ b/doc/src/Speed_packages.rst @@ -117,33 +117,15 @@ script. with all its accelerator packages installed. Note however that the INTEL and KOKKOS packages require you to choose one of their hardware options when building for a specific platform. I.e. CPU or - Phi option for the INTEL package. Or the OpenMP, Cuda, or Phi - option for the KOKKOS package. + Phi option for the INTEL package. Or the OpenMP, CUDA, HIP, SYCL, + or Phi option for the KOKKOS package. Or the OpenCL, HIP, or CUDA + option for the GPU package. These are the exceptions. You cannot build a single executable with: * both the INTEL Phi and KOKKOS Phi options * the INTEL Phi or Kokkos Phi option, and the GPU package -See the examples/accelerate/README and make.list files for sample -Make.py commands that build LAMMPS with any or all of the accelerator -packages. As an example, here is a command that builds with all the -GPU related packages installed (GPU, KOKKOS with Cuda), including -settings to build the needed auxiliary GPU libraries for Kepler GPUs: - -.. code-block:: bash - - Make.py -j 16 -p omp gpu kokkos -cc nvcc wrap=mpi -gpu mode=double arch=35 -kokkos cuda arch=35 lib-all file mpi - -The examples/accelerate directory also has input scripts that can be -used with all of the accelerator packages. See its README file for -details. - -Likewise, the bench directory has FERMI and KEPLER and PHI -sub-directories with Make.py commands and input scripts for using all -the accelerator packages on various machines. See the README files in -those directories. - As mentioned above, the `Benchmark page `_ of the LAMMPS website gives performance results for the various accelerator packages for several of the standard LAMMPS benchmark problems, as a function of problem diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index b57c91ffee..b70c7677e0 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -205,6 +205,7 @@ scripts are available: whitespace.py # detects TAB characters and trailing whitespace homepage.py # detects outdated LAMMPS homepage URLs (pointing to sandia.gov instead of lammps.org) errordocs.py # detects deprecated error docs in header files + versiontags.py # detects .. versionadded:: or .. versionchanged:: with pending version date The tools need to be given the main folder of the LAMMPS distribution or individual file names as argument and will by default check them @@ -397,7 +398,7 @@ ipp tool ------------------ The tools/ipp directory contains a Perl script ipp which can be used -to facilitate the creation of a complicated file (say, a lammps input +to facilitate the creation of a complicated file (say, a LAMMPS input script or tools/createatoms input file) using a template file. ipp was created and is maintained by Reese Jones (Sandia), rjones at @@ -512,8 +513,8 @@ with an ``.inputrc`` file in the home directory. For application specific customization, the LAMMPS shell uses the name "lammps-shell". For more information about using and customizing an application using readline, please see the available documentation at: -`http://www.gnu.org/s/readline/#Documentation -`_ +https://www.gnu.org/software/readline/ + Additional commands ^^^^^^^^^^^^^^^^^^^ @@ -715,7 +716,7 @@ See the README.pdf file for more information. These scripts were written by Arun Subramaniyan at Purdue Univ (asubrama at purdue.edu). -.. _matlabhome: http://www.mathworks.com +.. _matlabhome: https://www.mathworks.com ---------- @@ -1046,7 +1047,7 @@ the binary file. This usually is a so-called little endian hardware SWIG interface -------------- -The `SWIG tool `_ offers a mostly automated way to +The `SWIG tool `_ offers a mostly automated way to incorporate compiled code modules into scripting languages. It processes the function prototypes in C and generates wrappers for a wide variety of scripting languages from it. Thus it can also be applied to @@ -1126,7 +1127,7 @@ data passed or returned as pointers are included in the ``lammps.i`` file. So most of the functionality of the library interface should be accessible. What works and what does not depends a bit on the individual language for which the wrappers are built and how well SWIG -supports those. The `SWIG documentation `_ +supports those. The `SWIG documentation `_ has very detailed instructions and recommendations. Usage examples diff --git a/doc/src/atom_style.rst b/doc/src/atom_style.rst index b753fdbe5f..c3b16c6ad1 100644 --- a/doc/src/atom_style.rst +++ b/doc/src/atom_style.rst @@ -91,7 +91,7 @@ quantities. +--------------+-----------------------------------------------------+--------------------------------------+ | *charge* | charge | atomic system with charges | +--------------+-----------------------------------------------------+--------------------------------------+ -| *dielectric* | dipole, area, curvature | system with surface polarization | +| *dielectric* | normx normy normz area/patch ed em epsilon curv | system with surface polarization | +--------------+-----------------------------------------------------+--------------------------------------+ | *dipole* | charge and dipole moment | system with dipolar particles | +--------------+-----------------------------------------------------+--------------------------------------+ @@ -180,16 +180,21 @@ vector with the 3 diameters of the ellipsoid and a quaternion 4-vector with its orientation. For the *dielectric* style, each particle can be either a physical -particle (e.g. an ion), or an interface particle representing a -boundary element. For physical particles, the per-particle properties -are the same as atom_style full. For interface particles, in addition -to these properties, each particle also has an area, a normal unit -vector, a mean local curvature, the mean and difference of the -dielectric constants of two sides of the interface, and the local -dielectric constant at the boundary element. The distinction between -the physical and interface particles is only meaningful when :doc:`fix -polarize ` commands are applied to the interface -particles. +particle (e.g. an ion), or an interface particle representing a boundary +element between two regions of different dielectric constant. For +interface particles, in addition to the properties associated with +atom_style full, each particle also should be assigned a normal unit +vector (defined by normx, normy, normz), an area (area/patch), the +difference and mean of the dielectric constants of two sides of the +interface along the direction of the normal vector (ed and em), the +local dielectric constant at the boundary element (epsilon), and a mean +local curvature (curv). Physical particles must be assigned these +values, as well, but only their local dielectric constants will be used; +see documentation for associated :doc:`pair styles ` +and :doc:`fixes `. The distinction between the physical +and interface particles is only meaningful when :doc:`fix polarize +` commands are applied to the interface particles. This +style is part of the DIELECTRIC package. For the *dipole* style, a point dipole is defined for each point particle. Note that if you wish the particles to be finite-size diff --git a/doc/src/bond_bpm_rotational.rst b/doc/src/bond_bpm_rotational.rst index ae4fc3da64..5c43071274 100644 --- a/doc/src/bond_bpm_rotational.rst +++ b/doc/src/bond_bpm_rotational.rst @@ -138,15 +138,14 @@ the *overlay/pair* keyword. These settings require specific restrictions. Further details can be found in the `:doc: how to ` page on BPMs. -If the *store/local* keyword is used, this fix will track bonds that +If the *store/local* keyword is used, an internal fix will track bonds that break during the simulation. Whenever a bond breaks, data is processed and transferred to an internal fix labeled *fix_ID*. This allows the -local data to be accessed by other LAMMPS commands. -Following any optional keyword/value arguments, a list of one or more -attributes is specified. These include the IDs of the two atoms in -the bond. The other attributes for the two atoms include the timestep -during which the bond broke and the current/initial center of mass -position of the two atoms. +local data to be accessed by other LAMMPS commands. Following this optional +keyword, a list of one or more attributes is specified. These include the +IDs of the two atoms in the bond. The other attributes for the two atoms +include the timestep during which the bond broke and the current/initial +center of mass position of the two atoms. Data is continuously accumulated over intervals of *N* timesteps. At the end of each interval, all of the saved accumulated @@ -177,29 +176,38 @@ Restart and other info This bond style writes the reference state of each bond to :doc:`binary restart files `. Loading a restart file will -properly resume bonds. +properly resume bonds. However, the reference state is NOT +written to data files. Therefore reading a data file will not +restore bonds and will cause their reference states to be redefined. -The single() function of these pair styles returns 0.0 for the energy -of a pairwise interaction, since energy is not conserved in these -dissipative potentials. It also returns only the normal component of -the pairwise interaction force. - -The accumulated data is not written to restart files and should be -output before a restart file is written to avoid missing data. - -The internal fix calculates a local vector or local array depending on the -number of input values. The length of the vector or number of rows in -the array is the number of recorded, lost interactions. If a single -input is specified, a local vector is produced. If two or more inputs -are specified, a local array is produced where the number of columns = -the number of inputs. The vector or array can be accessed by any -command that uses local values from a compute as input. See the -:doc:`Howto output ` page for an overview of LAMMPS -output options. +If the *store/local* option is used, an internal fix will calculate +a local vector or local array depending on the number of input values. +The length of the vector or number of rows in the array is the number +of recorded, broken bonds. If a single input is specified, a local +vector is produced. If two or more inputs are specified, a local array +is produced where the number of columns = the number of inputs. The +vector or array can be accessed by any command that uses local values +from a compute as input. See the :doc:`Howto output ` page +for an overview of LAMMPS output options. The vector or array will be floating point values that correspond to the specified attribute. +The single() function of this bond style returns 0.0 for the energy +of a bonded interaction, since energy is not conserved in these +dissipative potentials. It also returns only the normal component of +the bonded interaction force. However, the single() function also +calculates 7 extra bond quantities. The first 4 are data from the +reference state of the bond including the initial distance between particles +:math:`r_0` followed by the :math:`x`, :math:`y`, and :math:`z` components +of the initial unit vector pointing to particle I from particle J. The next 3 +quantities (5-7) are the :math:`x`, :math:`y`, and :math:`z` components +of the total force, including normal and tangential contributions, acting +on particle I. + +These extra quantities can be accessed by the :doc:`compute bond/local ` +command, as *b1*, *b2*, ..., *b7*\ . + Restrictions """""""""""" diff --git a/doc/src/bond_bpm_spring.rst b/doc/src/bond_bpm_spring.rst index 1d2f12701d..de31357afe 100644 --- a/doc/src/bond_bpm_spring.rst +++ b/doc/src/bond_bpm_spring.rst @@ -103,15 +103,14 @@ the *overlay/pair* keyword. These settings require specific restrictions. Further details can be found in the `:doc: how to ` page on BPMs. -If the *store/local* keyword is used, this fix will track bonds that +If the *store/local* keyword is used, an internal fix will track bonds that break during the simulation. Whenever a bond breaks, data is processed and transferred to an internal fix labeled *fix_ID*. This allows the -local data to be accessed by other LAMMPS commands. -Following any optional keyword/value arguments, a list of one or more -attributes is specified. These include the IDs of the two atoms in -the bond. The other attributes for the two atoms include the timestep -during which the bond broke and the current/initial center of mass -position of the two atoms. +local data to be accessed by other LAMMPS commands. Following this optional +keyword, a list of one or more attributes is specified. These include the +IDs of the two atoms in the bond. The other attributes for the two atoms +include the timestep during which the bond broke and the current/initial +center of mass position of the two atoms. Data is continuously accumulated over intervals of *N* timesteps. At the end of each interval, all of the saved accumulated @@ -141,28 +140,30 @@ Restart and other info This bond style writes the reference state of each bond to :doc:`binary restart files `. Loading a restart -file will properly resume bonds. +file will properly restore bonds. However, the reference state is NOT +written to data files. Therefore reading a data file will not +restore bonds and will cause their reference states to be redefined. -The single() function of these pair styles returns 0.0 for the energy -of a pairwise interaction, since energy is not conserved in these -dissipative potentials. - -The accumulated data is not written to restart files and should be -output before a restart file is written to avoid missing data. - -The internal fix calculates a local vector or local array depending on the -number of input values. The length of the vector or number of rows in -the array is the number of recorded, lost interactions. If a single -input is specified, a local vector is produced. If two or more inputs -are specified, a local array is produced where the number of columns = -the number of inputs. The vector or array can be accessed by any -command that uses local values from a compute as input. See the -:doc:`Howto output ` page for an overview of LAMMPS -output options. +If the *store/local* option is used, an internal fix will calculate +a local vector or local array depending on the number of input values. +The length of the vector or number of rows in the array is the number +of recorded, broken bonds. If a single input is specified, a local +vector is produced. If two or more inputs are specified, a local array +is produced where the number of columns = the number of inputs. The +vector or array can be accessed by any command that uses local values +from a compute as input. See the :doc:`Howto output ` page +for an overview of LAMMPS output options. The vector or array will be floating point values that correspond to the specified attribute. +The single() function of this bond style returns 0.0 for the energy +of a bonded interaction, since energy is not conserved in these +dissipative potentials. The single() function also calculates an +extra bond quantity, the initial distance :math:`r_0`. This +extra quantity can be accessed by the +:doc:`compute bond/local ` command as *b1*\ . + Restrictions """""""""""" diff --git a/doc/src/bond_coeff.rst b/doc/src/bond_coeff.rst index f5b7f01e38..86e2fa63e1 100644 --- a/doc/src/bond_coeff.rst +++ b/doc/src/bond_coeff.rst @@ -21,7 +21,7 @@ Examples bond_coeff 5 80.0 1.2 bond_coeff * 30.0 1.5 1.0 1.0 bond_coeff 1*4 30.0 1.5 1.0 1.0 - bond_coeff 1 harmonic 200.0 1.0 (for bond_style hybrid) + bond_coeff 1 harmonic 200.0 1.0 # (for bond_style hybrid) labelmap bond 5 carbonyl bond_coeff carbonyl 80.0 1.2 diff --git a/doc/src/bond_mm3.rst b/doc/src/bond_mm3.rst index aa219f0cc7..585794da65 100644 --- a/doc/src/bond_mm3.rst +++ b/doc/src/bond_mm3.rst @@ -26,14 +26,14 @@ as defined in :ref:`(Allinger) ` .. math:: - E = K (r - r_0)^2 \left[ 1 - 2.55(r-r_0) + (7/12) 2.55^2(r-r_0)^2 \right] + E = K (r - r_0)^2 \left[ 1 - 2.55(r-r_0) + \frac{7}{12} 2.55^2(r-r_0)^2 \right] where :math:`r_0` is the equilibrium value of the bond, and :math:`K` is a -prefactor. The anharmonic prefactors have units angstrom\^(-n): --2.55 angstrom\^(-1) and (7/12)2.55\^2 angstrom\^(-2). The code takes +prefactor. The anharmonic prefactors have units :math:`\AA^{-n}`: +:math:`-2.55 \AA^{-1}` and :math:`\frac{7}{12} 2.55^2 \AA^{-2}`. The code takes care of the necessary unit conversion for these factors internally. -Note that the MM3 papers contains an error in Eq (1): -(7/12)2.55 should be replaced with (7/12)2.55\^2 +Note that the MM3 papers contain an error in Eq (1): +:math:`\frac{7}{12} 2.55` should be replaced with :math:`\frac{7}{12} 2.55^2` The following coefficients must be defined for each bond type via the :doc:`bond_coeff ` command as in the example above, or in diff --git a/doc/src/bond_quartic.rst b/doc/src/bond_quartic.rst index 1f9f9bf4e9..cda30cfd95 100644 --- a/doc/src/bond_quartic.rst +++ b/doc/src/bond_quartic.rst @@ -28,11 +28,18 @@ The *quartic* bond style uses the potential .. math:: - E = K (r - R_c)^ 2 (r - R_c - B_1) (r - R_c - B_2) + U_0 + 4 \epsilon \left[ \left(\frac{\sigma}{r}\right)^{12} - \left(\frac{\sigma}{r}\right)^6 \right] + \epsilon + E & = E_q + E_{LJ} \\ + E_q & = K (r - R_c)^ 2 (r - R_c - B_1) (r - R_c - B_2) + U_0 \\ + E_{LJ} & = \left\{ \begin{array} {l@{\quad:\quad}l} + 4 \epsilon \left[ \left(\frac{\sigma}{r}\right)^{12} - \left(\frac{\sigma}{r}\right)^6 \right] + \epsilon & r < 2^{\frac{1}{6}}, \epsilon = 1, \sigma = 1 \\ + 0 & r >= 2^{\frac{1}{6}} + \end{array} \right. to define a bond that can be broken as the simulation proceeds (e.g. -due to a polymer being stretched). The :math:`\sigma` and :math:`\epsilon` used in the -LJ portion of the formula are both set equal to 1.0 by LAMMPS. +due to a polymer being stretched). The :math:`\sigma` and +:math:`\epsilon` used in the LJ portion of the formula are both set +equal to 1.0 by LAMMPS and the LJ portion is cut off at its minimum, +i.e. at :math:`r_c = 2^{\frac{1}{6}}`. The following coefficients must be defined for each bond type via the :doc:`bond_coeff ` command as in the example above, or in @@ -46,9 +53,9 @@ or :doc:`read_restart ` commands: * :math:`U_0` (energy) This potential was constructed to mimic the FENE bond potential for -coarse-grained polymer chains. When monomers with :math:`\sigma = \epsilon = 1.0` -are used, the following choice of parameters gives a quartic potential that -looks nearly like the FENE potential: +coarse-grained polymer chains. When monomers with :math:`\sigma = +\epsilon = 1.0` are used, the following choice of parameters gives a +quartic potential that looks nearly like the FENE potential: .. math:: diff --git a/doc/src/clear.rst b/doc/src/clear.rst index a8d224a5c9..fba3b69f47 100644 --- a/doc/src/clear.rst +++ b/doc/src/clear.rst @@ -23,15 +23,16 @@ Description """"""""""" This command deletes all atoms, restores all settings to their default -values, and frees all memory allocated by LAMMPS. Once a clear -command has been executed, it is almost as if LAMMPS were starting -over, with only the exceptions noted below. This command enables -multiple jobs to be run sequentially from one input script. +values, and frees all memory allocated by LAMMPS. Once a clear command +has been executed, it is almost as if LAMMPS were starting over, with +only the exceptions noted below. This command enables multiple jobs to +be run sequentially from one input script. These settings are not affected by a clear command: the working -directory (:doc:`shell ` command), log file status -(:doc:`log ` command), echo status (:doc:`echo ` command), and -input script variables (:doc:`variable ` command). +directory (:doc:`shell ` command), log file status (:doc:`log +` command), echo status (:doc:`echo ` command), and input +script variables except for *atomfile* style variables (:doc:`variable +` command). Restrictions """""""""""" diff --git a/doc/src/compute_ave_sphere_atom.rst b/doc/src/compute_ave_sphere_atom.rst index e5ed7e1437..ecb67ae7b5 100644 --- a/doc/src/compute_ave_sphere_atom.rst +++ b/doc/src/compute_ave_sphere_atom.rst @@ -35,6 +35,8 @@ Examples Description """"""""""" +.. versionadded:: 7Jan2022 + Define a computation that calculates the local mass density and temperature for each atom based on its neighbors inside a spherical cutoff. If an atom has :math:`M` neighbors, then its local mass density is diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index ed779d986e..f3fb752ebe 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * bond/local = style name of this compute command * one or more values may be appended -* value = *dist* or *dx* or *dy* or *dz* or *engpot* or *force* or *fx* or *fy* or *fz* or *engvib* or *engrot* or *engtrans* or *omega* or *velvib* or *v_name* +* value = *dist* or *dx* or *dy* or *dz* or *engpot* or *force* or *fx* or *fy* or *fz* or *engvib* or *engrot* or *engtrans* or *omega* or *velvib* or *v_name* or *bN* .. parsed-literal:: @@ -29,6 +29,7 @@ Syntax *omega* = magnitude of bond angular velocity *velvib* = vibrational velocity along the bond length *v_name* = equal-style variable with name (see below) + *bN* = bond style specific quantities for allowed N values * zero or more keyword/args pairs may be appended * keyword = *set* @@ -47,7 +48,7 @@ Examples compute 1 all bond/local engpot compute 1 all bond/local dist engpot force - compute 1 all bond/local dist fx fy fz + compute 1 all bond/local dist fx fy fz b1 b2 compute 1 all bond/local dist v_distsq set dist d @@ -147,6 +148,19 @@ those quantities via the :doc:`compute reduce ` command with thermo output, and the :doc:`fix ave/histo ` command will histogram the length\ :math:`^2` values and write them to a file. +A bond style may define additional bond quantities which can be +accessed as *b1* to *bN*, where N is defined by the bond style. Most +bond styles do not define any additional quantities, so N = 0. An +example of ones that do are the :doc:`BPM bond styles ` +which store the reference state between two particles. See +individual bond styles for details. + +When using *bN* with bond style *hybrid*, the output will be the Nth +quantity from the sub-style that computes the bonded interaction +(based on bond type). If that sub-style does not define a *bN*, +the output will be 0.0. The maximum allowed N is the maximum number +of quantities provided by any sub-style. + ---------- The local data stored by this command is generated by looping over all diff --git a/doc/src/compute_chunk_atom.rst b/doc/src/compute_chunk_atom.rst index d151692771..9bca1e26d1 100644 --- a/doc/src/compute_chunk_atom.rst +++ b/doc/src/compute_chunk_atom.rst @@ -602,8 +602,7 @@ be used. For non-orthogonal (triclinic) simulation boxes, only the *reduced* option may be used. A *box* value selects standard distance units as defined by the -:doc:`units ` command (e.g., :math:`\mathrm{\mathring A}` -for units = *real* or *metal*). +:doc:`units ` command (e.g., :math:`\AA` for units = *real* or *metal*). A *lattice* value means the distance units are in lattice spacings. The :doc:`lattice ` command must have been previously used to define the lattice spacing. A *reduced* value means normalized diff --git a/doc/src/compute_damage_atom.rst b/doc/src/compute_damage_atom.rst index b75a3ebc57..d396fe7424 100644 --- a/doc/src/compute_damage_atom.rst +++ b/doc/src/compute_damage_atom.rst @@ -24,16 +24,17 @@ Description """"""""""" Define a computation that calculates the per-atom damage for each atom -in a group. This is a quantity relevant for :doc:`Peridynamics models `. See `this document `_ -for an overview of LAMMPS commands for Peridynamics modeling. +in a group. This is a quantity relevant for :doc:`Peridynamics models +`. See `this document `_ for an +overview of LAMMPS commands for Peridynamics modeling. The "damage" of a Peridynamics particles is based on the bond breakage between the particle and its neighbors. If all the bonds are broken the particle is considered to be fully damaged. -See the `PDLAMMPS user guide `_ for a formal -definition of "damage" and more details about Peridynamics as it is -implemented in LAMMPS. +See the :doc:`Peridynamics Howto ` for a formal definition +of "damage" and more details about Peridynamics as it is implemented in +LAMMPS. This command can be used with all the Peridynamic pair styles. @@ -53,8 +54,9 @@ The per-atom vector values are unitless numbers (damage) :math:`\ge 0.0`. Restrictions """""""""""" -This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +This compute is part of the PERI package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_dilatation_atom.rst b/doc/src/compute_dilatation_atom.rst index 8e3c86a4af..6ccc65dec3 100644 --- a/doc/src/compute_dilatation_atom.rst +++ b/doc/src/compute_dilatation_atom.rst @@ -24,7 +24,8 @@ Description """"""""""" Define a computation that calculates the per-atom dilatation for each -atom in a group. This is a quantity relevant for :doc:`Peridynamics models `. See `this document `_ +atom in a group. This is a quantity relevant for :doc:`Peridynamics +models `. See `this document `_ for an overview of LAMMPS commands for Peridynamics modeling. For small deformation, dilatation of is the measure of the volumetric @@ -32,13 +33,14 @@ strain. The dilatation :math:`\theta` for each peridynamic particle :math:`i` is calculated as a sum over its neighbors with unbroken bonds, where the -contribution of the :math:`ij` pair is a function of the change in bond length -(versus the initial length in the reference state), the volume +contribution of the :math:`ij` pair is a function of the change in bond +length (versus the initial length in the reference state), the volume fraction of the particles and an influence function. See the -`PDLAMMPS user guide `_ for -a formal definition of dilatation. +:doc:`Peridynamics Howto ` for a formal definition of +dilatation. -This command can only be used with a subset of the Peridynamic :doc:`pair styles `: peri/lps, peri/ves and peri/eps. +This command can only be used with a subset of the Peridynamic +:doc:`pair styles `: *peri/lps*, *peri/ves*, and *peri/eps*. The dilatation value will be 0.0 for atoms not in the specified compute group. @@ -56,9 +58,9 @@ The per-atom vector values are unitless numbers :math:`(\theta \ge 0.0)`. Restrictions """""""""""" -This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the -:doc:`Build package ` page for more info. +This compute is part of the PERI package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_displace_atom.rst b/doc/src/compute_displace_atom.rst index fc063cea50..a2b1d946ae 100644 --- a/doc/src/compute_displace_atom.rst +++ b/doc/src/compute_displace_atom.rst @@ -17,7 +17,7 @@ Syntax .. parsed-literal:: - *replace* arg = name of per-atom variable + *refresh* arg = name of per-atom variable Examples """""""" @@ -95,7 +95,7 @@ something like the following commands: refresh c_dsp delay 100 The :doc:`dump_modify thresh ` command will only output -atoms that have displaced more than :math:`0.6~\mathrm{\mathring A}` on each +atoms that have displaced more than :math:`0.6~\AA` on each snapshot (assuming metal units). The dump_modify *refresh* option triggers a call to this compute at the end of every dump. diff --git a/doc/src/compute_entropy_atom.rst b/doc/src/compute_entropy_atom.rst index 78f784ff75..612fc28365 100644 --- a/doc/src/compute_entropy_atom.rst +++ b/doc/src/compute_entropy_atom.rst @@ -97,13 +97,13 @@ by the corresponding volume. This option can be useful when dealing with inhomogeneous systems such as those that have surfaces. Here are typical input parameters for fcc aluminum (lattice -constant :math:`4.05~\mathrm{\mathring A}`), +constant :math:`4.05~\AA`), .. parsed-literal:: compute 1 all entropy/atom 0.25 5.7 avg yes 3.7 -and for bcc sodium (lattice constant 4.23 Angstroms), +and for bcc sodium (lattice constant :math:`4.23~\AA`), .. parsed-literal:: diff --git a/doc/src/compute_fep_ta.rst b/doc/src/compute_fep_ta.rst index 1fe89194ca..5b08d08718 100644 --- a/doc/src/compute_fep_ta.rst +++ b/doc/src/compute_fep_ta.rst @@ -34,6 +34,8 @@ Examples Description """"""""""" +.. versionadded:: 4May2022 + Define a computation that calculates the change in the free energy due to a test-area (TA) perturbation :ref:`(Gloor) `. The test-area approach can be used to determine the interfacial tension of the system diff --git a/doc/src/compute_rigid_local.rst b/doc/src/compute_rigid_local.rst index 456fc57c38..bf0f402f06 100644 --- a/doc/src/compute_rigid_local.rst +++ b/doc/src/compute_rigid_local.rst @@ -6,7 +6,7 @@ compute rigid/local command Syntax """""" -.. parsed-literal:: +.. code-block:: LAMMPS compute ID group-ID rigid/local rigidID input1 input2 ... @@ -25,6 +25,9 @@ Syntax quatw, quati, quatj, quatk, tqx, tqy, tqz, inertiax, inertiay, inertiaz + + .. parsed-literal:: + id = atom ID of atom within body which owns body properties mol = molecule ID used to define body in :doc:`fix rigid/small ` command mass = total mass of body @@ -69,8 +72,8 @@ the atoms owned on a processor. If the atom is not in the specified the atom within a body that is assigned to store the body information it is skipped (only one atom per body is so assigned). If it is the assigned atom, then the info for that body is output. This means that -information for N bodies is generated. N may be less than the # of -bodies defined by the fix rigid command, if the atoms in some bodies +information for :math:`N` bodies is generated. :math:`N` may be less than the +number of bodies defined by the fix rigid command, if the atoms in some bodies are not in the *group-ID*\ . .. note:: @@ -109,8 +112,7 @@ The *mass* attribute is the total mass of the rigid body. There are two options for outputting the coordinates of the center of mass (COM) of the body. The *x*, *y*, *z* attributes write the COM "unscaled", in the appropriate distance :doc:`units ` -(:math:`\mathrm{\mathring A}`, -sigma, etc). Use *xu*, *yu*, *zu* if you want the COM "unwrapped" by +(:math:`\AA`, :math:`\sigma`, etc). Use *xu*, *yu*, *zu* if you want the COM "unwrapped" by the image flags for each body. Unwrapped means that if the body COM has passed through a periodic boundary one or more times, the value is generated what the COM coordinate would be if it had not been @@ -120,7 +122,7 @@ The image flags for the body can be generated directly using the *ix*, *iy*, *iz* attributes. For periodic dimensions, they specify which image of the simulation box the COM is considered to be in. An image of 0 means it is inside the box as defined. A value of 2 means add 2 -box lengths to get the true value. A value of -1 means subtract 1 box +box lengths to get the true value. A value of :math:`-1` means subtract 1 box length to get the true value. LAMMPS updates these flags as the rigid body COMs cross periodic boundaries during the simulation. @@ -142,8 +144,8 @@ The *tqx*, *tqy*, *tqz* attributes are components of the torque acting on the body around its COM. The *inertiax*, *inertiay*, *inertiaz* attributes are components of -diagonalized inertia tensor for the body, i.e the 3 moments of inertia -for the body around its principal axes, as computed internally by +diagonalized inertia tensor for the body (i.e., the three moments of inertia +for the body around its principal axes), as computed internally by LAMMPS. ---------- @@ -170,10 +172,10 @@ corresponding attribute is in: * vx,vy,vz = velocity units * fx,fy,fz = force units * omegax,omegay,omegaz = radians/time units -* angmomx,angmomy,angmomz = mass\*distance\^2/time units +* angmomx,angmomy,angmomz = mass\*distance\ :math:`^2`\ /time units * quatw,quati,quatj,quatk = unitless * tqx,tqy,tqz = torque units -* inertiax,inertiay,inertiaz = mass\*distance\^2 units +* inertiax,inertiay,inertiaz = mass\*distance\ :math:`^2` units Restrictions """""""""""" diff --git a/doc/src/compute_saed.rst b/doc/src/compute_saed.rst index 1a746ab7b9..c2e1f3d1e0 100644 --- a/doc/src/compute_saed.rst +++ b/doc/src/compute_saed.rst @@ -86,7 +86,7 @@ will defined using the *c* values for the spacing along each reciprocal lattice axis. Note that manual mapping of the reciprocal space mesh is good for comparing diffraction results from multiple simulations; however it can reduce the likelihood that Bragg reflections will be satisfied -unless small spacing parameters (:math:`<0.05~\mathrm{\mathring A}^-1`) +unless small spacing parameters (:math:`<0.05~\AA^-1`) are implemented. Meshes with manual spacing do not require a periodic boundary. diff --git a/doc/src/compute_sna_atom.rst b/doc/src/compute_sna_atom.rst index 1b6b200685..ac55aebd08 100644 --- a/doc/src/compute_sna_atom.rst +++ b/doc/src/compute_sna_atom.rst @@ -228,18 +228,20 @@ command: See section below on output for a detailed explanation of the data layout in the global array. +.. versionadded:: 3Aug2022 + The compute *sna/grid* and *sna/grid/local* commands calculate -bispectrum components for a regular grid of points. -These are calculated from the local density of nearby atoms *i'* -around each grid point, as if there was a central atom *i* -at the grid point. This is useful for characterizing fine-scale -structure in a configuration of atoms, and it is used -in the `MALA package `_ -to build machine-learning surrogates for finite-temperature Kohn-Sham -density functional theory (:ref:`Ellis et al. `) -Neighbor atoms not in the group do not contribute to the -bispectrum components of the grid points. The distance cutoff :math:`R_{ii'}` -assumes that *i* has the same type as the neighbor atom *i'*. +bispectrum components for a regular grid of points. These are +calculated from the local density of nearby atoms *i'* around each grid +point, as if there was a central atom *i* at the grid point. This is +useful for characterizing fine-scale structure in a configuration of +atoms, and it is used in the `MALA package +`_ to build machine-learning surrogates +for finite-temperature Kohn-Sham density functional theory (:ref:`Ellis +et al. `) Neighbor atoms not in the group do not contribute +to the bispectrum components of the grid points. The distance cutoff +:math:`R_{ii'}` assumes that *i* has the same type as the neighbor atom +*i'*. Compute *sna/grid* calculates a global array containing bispectrum components for a regular grid of points. diff --git a/doc/src/compute_temp_cs.rst b/doc/src/compute_temp_cs.rst index 45de17be89..a33fbf7ffb 100644 --- a/doc/src/compute_temp_cs.rst +++ b/doc/src/compute_temp_cs.rst @@ -29,7 +29,7 @@ Description Define a computation that calculates the temperature of a system based on the center-of-mass velocity of atom pairs that are bonded to each other. This compute is designed to be used with the adiabatic -core/shell model of :ref:`(Mitchell and Finchham) `. +core/shell model of :ref:`(Mitchell and Fincham) `. See the :doc:`Howto coreshell ` page for an overview of the model as implemented in LAMMPS. Specifically, this compute enables correct temperature calculation and thermostatting of @@ -127,7 +127,7 @@ none ---------- -.. _MitchellFinchham1: +.. _MitchellFincham1: -**(Mitchell and Finchham)** Mitchell, Finchham, J Phys Condensed Matter, +**(Mitchell and Fincham)** Mitchell, Fincham, J Phys Condensed Matter, 5, 1031-1038 (1993). diff --git a/doc/src/compute_temp_ramp.rst b/doc/src/compute_temp_ramp.rst index 5c18243c23..2e170316fb 100644 --- a/doc/src/compute_temp_ramp.rst +++ b/doc/src/compute_temp_ramp.rst @@ -58,7 +58,7 @@ constant, and :math:`T` is the absolute temperature. The *units* keyword determines the meaning of the distance units used for coordinates (*clo*, *chi*) and velocities (*vlo*, *vhi*). A *box* value selects standard distance units as defined by the :doc:`units ` -command (e.g., :math:`\mathrm{\mathring{A}}` for units = real or metal). A +command (e.g., :math:`\AA` for units = real or metal). A *lattice* value means the distance units are in lattice spacings (i.e., velocity in lattice spacings per unit time). The :doc:`lattice ` command must have been previously used to define the lattice spacing. diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 699d3f2aaa..274be1b702 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * voronoi/atom = style name of this compute command * zero or more keyword/value pairs may be appended -* keyword = *only_group* or *surface* or *radius* or *edge_histo* or *edge_threshold* or *face_threshold* or *neighbors* or *peratom* +* keyword = *only_group* or *occupation* or *surface* or *radius* or *edge_histo* or *edge_threshold* or *face_threshold* or *neighbors* or *peratom* .. parsed-literal:: @@ -154,25 +154,25 @@ which must be installed on your system when building LAMMPS for use with this compute. See instructions on obtaining and installing the Voro++ software in the src/VORONOI/README file. -.. _voronoi: http://math.lbl.gov/voro++/ +.. _voronoi: https://math.lbl.gov/voro++/ .. note:: - The calculation of Voronoi volumes is performed by each - processor for the atoms it owns, and includes the effect of ghost - atoms stored by the processor. This assumes that the Voronoi cells of - owned atoms are not affected by atoms beyond the ghost atom cut-off - distance. This is usually a good assumption for liquid and solid - systems, but may lead to underestimation of Voronoi volumes in low - density systems. By default, the set of ghost atoms stored by each - processor is determined by the cutoff used for - :doc:`pair_style ` interactions. The cutoff can be set - explicitly via the :doc:`comm_modify cutoff ` command. The - Voronoi cells for atoms adjacent to empty regions will extend into - those regions up to the communication cutoff in :math:`x`, :math:`y`, or - :math:`z`. In that situation, an exterior face is created at the cutoff - distance normal to the :math:`x`, :math:`y`, or :math:`z` direction. - For triclinic systems, the exterior face is parallel to the corresponding + The calculation of Voronoi volumes is performed by each processor for + the atoms it owns, and includes the effect of ghost atoms stored by + the processor. This assumes that the Voronoi cells of owned atoms + are not affected by atoms beyond the ghost atom cut-off distance. + This is usually a good assumption for liquid and solid systems, but + may lead to underestimation of Voronoi volumes in low density + systems. By default, the set of ghost atoms stored by each processor + is determined by the cutoff used for :doc:`pair_style ` + interactions. The cutoff can be set explicitly via the + :doc:`comm_modify cutoff ` command. The Voronoi cells + for atoms adjacent to empty regions will extend into those regions up + to the communication cutoff in :math:`x`, :math:`y`, or :math:`z`. + In that situation, an exterior face is created at the cutoff distance + normal to the :math:`x`, :math:`y`, or :math:`z` direction. For + triclinic systems, the exterior face is parallel to the corresponding reciprocal lattice vector. .. note:: diff --git a/doc/src/compute_xrd.rst b/doc/src/compute_xrd.rst index 10ee35496d..8673ce9199 100644 --- a/doc/src/compute_xrd.rst +++ b/doc/src/compute_xrd.rst @@ -91,7 +91,7 @@ reciprocal lattice axis. Note that manual mapping of the reciprocal space mesh is good for comparing diffraction results from multiple simulations; however, it can reduce the likelihood that Bragg reflections will be satisfied unless small spacing parameters -(:math:`< 0.05~\mathrm{\mathring{A}}^{-1}`) are implemented. +(:math:`< 0.05~\AA^{-1}`) are implemented. Meshes with manual spacing do not require a periodic boundary. The limits of the reciprocal lattice mesh are determined by range of diff --git a/doc/src/create_atoms.rst b/doc/src/create_atoms.rst index c8f94f7d5e..8a0cc8812f 100644 --- a/doc/src/create_atoms.rst +++ b/doc/src/create_atoms.rst @@ -28,7 +28,7 @@ Syntax region-ID = create atoms within this region, use NULL for entire simulation box * zero or more keyword/value pairs may be appended -* keyword = *mol* or *basis* or *ratio* or *subset* or *remap* or *var* or *set* or *rotate* or *overlap* or *maxtry* or *units* +* keyword = *mol* or *basis* or *ratio* or *subset* or *remap* or *var* or *set* or *radscale* or *meshmode* or *rotate* or *overlap* or *maxtry* or *units* .. parsed-literal:: @@ -189,6 +189,10 @@ to the area of that triangle. beneficial to exclude computing interactions between the created particles using :doc:`neigh_modify exclude `. +.. versionchanged:: 2Jun2022 + +The *porosity* style has been renamed to *random* with added functionality. + For the *random* style, *N* particles are added to the system at randomly generated coordinates, which can be useful for generating an amorphous system. The particles are created one by one using the @@ -460,7 +464,7 @@ The *units* keyword determines the meaning of the distance units used to specify the coordinates of the one particle created by the *single* style, or the overlap distance *Doverlap* by the *overlap* keyword. A *box* value selects standard distance units as defined by the -:doc:`units ` command (e.g., :math:`\mathrm{\mathring{A}}` for +:doc:`units ` command (e.g., :math:`\AA` for units = *real* or *metal*\ . A *lattice* value means the distance units are in lattice spacings. diff --git a/doc/src/delete_atoms.rst b/doc/src/delete_atoms.rst index 749fc298b9..2fdd152196 100644 --- a/doc/src/delete_atoms.rst +++ b/doc/src/delete_atoms.rst @@ -116,6 +116,8 @@ must be in both the specified group and region. If *group-ID* = all, there is effectively no group criterion. If *region-ID* is specified as NULL, no region criterion is imposed. +.. versionadded:: 4May2022 + For style *variable*, all atoms for which the atom-style variable with the given name evaluates to non-zero will be deleted. Additional atoms can be deleted if they are in a molecule for which one or more atoms diff --git a/doc/src/delete_bonds.rst b/doc/src/delete_bonds.rst index ac2ffb3452..0b30ae5588 100644 --- a/doc/src/delete_bonds.rst +++ b/doc/src/delete_bonds.rst @@ -26,6 +26,13 @@ Syntax * zero or more keywords may be appended * keyword = *any* or *undo* or *remove* or *special* + .. parsed-literal:: + + *any* arg = none = turn off interactions if any atoms are in the group (or on if *undo* is also used) + *undo* arg = none = turn specified bonds on instead of off + *remove* arg = permanently remove bonds that have been turned off + *special* arg = recompute pairwise 1-2, 1-3, and 1-4 lists + Examples """""""" @@ -101,13 +108,13 @@ Several keywords can be appended to the argument list to alter the default behaviors. The *any* keyword changes the requirement that all atoms in the bond -(angle, etc) must be in the specified group in order to turn off the +(angle, etc.) must be in the specified group in order to turn off the interaction. Instead, if any of the atoms in the interaction are in the specified group, it will be turned off (or on if the *undo* keyword is used). The *undo* keyword inverts the delete_bonds command so that the -specified bonds, angles, etc are turned on if they are currently +specified bonds, angles, etc. are turned on if they are currently turned off. This means a negative value is toggled to positive. For example, for style *angle*, if *type* is specified as 2, then all angles with current type = :math:`-2` are reset to type = :math:`2`. diff --git a/doc/src/displace_atoms.rst b/doc/src/displace_atoms.rst index d9bf367ec4..0055fd584f 100644 --- a/doc/src/displace_atoms.rst +++ b/doc/src/displace_atoms.rst @@ -104,7 +104,7 @@ atom's rotation. Distance units for displacements and the origin point of the *rotate* style are determined by the setting of *box* or *lattice* for the *units* keyword. *Box* means distance units as defined by the -:doc:`units ` command (e.g., :math:`\mathrm{\mathring A}` for +:doc:`units ` command (e.g., :math:`\AA` for *real* or *metal* units). *Lattice* means distance units are in lattice spacings. The :doc:`lattice ` command must have been previously used to define the lattice spacing. diff --git a/doc/src/dump.rst b/doc/src/dump.rst index 21b82de4f0..839683aafa 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -202,7 +202,7 @@ or multiple smaller files). to a dump file may be slightly outside the simulation box. Re-neighbor timesteps will not typically coincide with the timesteps dump snapshots are written. See the :doc:`dump_modify - pbc ` command if you with to force coordinates to be + pbc ` command if you wish to force coordinates to be strictly inside the simulation box. .. note:: @@ -480,7 +480,7 @@ style. ---------- Note that *atom*, *custom*, *dcd*, *xtc*, and *xyz* style dump files -can be read directly by `VMD `_, a +can be read directly by `VMD `_, a popular molecular viewing program. ---------- @@ -693,7 +693,7 @@ charge. There are several options for outputting atom coordinates. The *x*, *y*, and *z* attributes write atom coordinates "unscaled", in the -appropriate distance :doc:`units ` (:math:`\mathrm{\mathring A}`, +appropriate distance :doc:`units ` (:math:`\AA`, :math:`\sigma`, etc.). Use *xs*, *ys*, and *zs* if you want the coordinates "scaled" to the box size so that each value is 0.0 to 1.0. If the simulation box is triclinic (tilted), then all atom coords will diff --git a/doc/src/dump_h5md.rst b/doc/src/dump_h5md.rst index 37fc7ad600..41d6dc7594 100644 --- a/doc/src/dump_h5md.rst +++ b/doc/src/dump_h5md.rst @@ -64,7 +64,7 @@ stored within the same file by defining several dumps. A dump that refers (via *file_from*) to an already open dump ID and that concerns another particle group must specify *create_group yes*. -.. _h5md: http://nongnu.org/h5md/ +.. _h5md: https://nongnu.org/h5md/ Each data element is written every N\*N_element steps. For *image*, no sub-interval is needed as it must be present at the same interval as @@ -113,7 +113,7 @@ the `HDF5 `_ library installed (C bindings are sufficient) on your system. The library ch5md is compiled with the h5cc wrapper provided by the HDF5 library. -.. _HDF5-ws: http://www.hdfgroup.org/HDF5/ +.. _HDF5-ws: https://www.hdfgroup.org/solutions/hdf5/ ---------- @@ -129,4 +129,4 @@ Related commands **(de Buyl)** de Buyl, Colberg and Hofling, H5MD: A structured, efficient, and portable file format for molecular data, Comp. Phys. Comm. 185(6), 1546-1553 (2014) - -`[arXiv:1308.6382] `_. +`[arXiv:1308.6382] `_. diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index c395f6ef06..bc2373afac 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -212,7 +212,7 @@ is used. Similarly, the format of the resulting movie is chosen with the *movie* dump style. This is handled by the underlying FFmpeg converter and thus details have to be looked up in the `FFmpeg documentation -`_. Typical examples are: .avi, .mpg, +`_. Typical examples are: .avi, .mpg, .m4v, .mp4, .mkv, .flv, .mov, .gif Additional settings of the movie compression like bitrate and framerate can be set using the dump_modify command as described below. @@ -642,7 +642,7 @@ MPEG or other movie file you can use: cat snap.*.ppm | ffmpeg -y -f image2pipe -c:v ppm -i - -b:v 2400k movie.avi Front ends for FFmpeg exist for multiple platforms. For more - information see the `FFmpeg homepage `_ + information see the `FFmpeg homepage `_ ---------- diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 7b16a9ce4d..52a36e1b00 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -17,7 +17,7 @@ Syntax * one or more keyword/value pairs may be appended * these keywords apply to various dump styles -* keyword = *append* or *at* or *balance* or *buffer* or *delay* or *element* or *every* or *every/time* or *fileper* or *first* or *flush* or *format* or *header* or *image* or *label* or *maxfiles* or *nfile* or *pad* or *pbc* or *precision* or *region* or *refresh* or *scale* or *sfactor* or *skip* or *sort* or *tfactor* or *thermo* or *thresh* or *time* or *units* or *unwrap* +* keyword = *append* or *at* or *balance* or *buffer* or *colname* or *delay* or *element* or *every* or *every/time* or *fileper* or *first* or *flush* or *format* or *header* or *image* or *label* or *maxfiles* or *nfile* or *pad* or *pbc* or *precision* or *region* or *refresh* or *scale* or *sfactor* or *skip* or *sort* or *tfactor* or *thermo* or *thresh* or *time* or *units* or *unwrap* .. parsed-literal:: @@ -181,8 +181,8 @@ extra buffering. .. versionadded:: 4May2022 The *colname* keyword can be used to change the default header keyword -for dump styles: *atom*, *custom*, and *cfg* and their compressed, ADIOS, -and MPIIO variants. The setting for *ID string* replaces the default +for dump styles: *atom*, *custom*, *cfg*, and *local* and their compressed, +ADIOS, and MPIIO variants. The setting for *ID string* replaces the default text with the provided string. *ID* can be a positive integer when it represents the column number counting from the left, a negative integer when it represents the column number from the right (i.e. -1 is the last @@ -632,7 +632,7 @@ calculates the displacement of each atom from its reference position. The "4" index is the scalar displacement; 1, 2, and 3 are the :math:`xyz` components of the displacement. The :doc:`dump_modify thresh ` command will cause only atoms that have displaced more than -:math:`0.6~\mathrm{\mathring A}` to be output on a given snapshot (assuming +:math:`0.6~\AA` to be output on a given snapshot (assuming metal units). However, note that when an atom is output, we also need to update the reference position for that atom to its new coordinates. So that it will not be output in every snapshot thereafter. That reference position is @@ -675,7 +675,7 @@ value of *yes* means atom coords are written in normalized units from 0.0 to 1.0 in each box dimension. If the simulation box is triclinic (tilted), then all atom coords will still be between 0.0 and 1.0. A value of *no* means they are written in absolute distance units -(e.g., :math:`\mathrm{\mathring A}` or :math:`\sigma`). +(e.g., :math:`\AA` or :math:`\sigma`). Using this keyword will reset all custom header names set with *dump_modify colname* to their respective default values. @@ -687,7 +687,7 @@ when writing to XTC files. By default, they are initialized for whatever :doc:`units ` style is being used, to write out coordinates in nanometers and time in picoseconds. For example, for *real* units, LAMMPS defines *sfactor* = 0.1 and *tfactor* = 0.001, since the -:math:`\mathrm{\mathring A}` and fs used by *real* units are 0.1 nm and +:math:`\AA` and fs used by *real* units are 0.1 nm and 0.001 ps, respectively. If you are using a units system with distance and time units far from nm and ps, you may wish to write XTC files with different units, since the compression algorithm used in XTC files is @@ -881,7 +881,7 @@ levels that sacrifice compression for performance. 0 is the default, positive levels are 1 to 22, with 22 being the most expensive compression. Zstd promises higher compression/decompression speeds for similar compression ratios. For more details see -`http://facebook.github.io/zstd/`. +`https://facebook.github.io/zstd/`. In addition, Zstd compressed files can include a checksum of the entire contents. The Zstd enabled dump styles enable this feature by diff --git a/doc/src/dump_molfile.rst b/doc/src/dump_molfile.rst index c1f0b48fe6..f8cc06d039 100644 --- a/doc/src/dump_molfile.rst +++ b/doc/src/dump_molfile.rst @@ -34,7 +34,7 @@ Dump a snapshot of atom coordinates and selected additional quantities to one or more files every N timesteps in one of several formats. Only information for atoms in the specified group is dumped. This specific dump style uses molfile plugins that are bundled with the -`VMD `_ molecular visualization and +`VMD `_ molecular visualization and analysis program. Unless the filename contains a \* character, the output will be written diff --git a/doc/src/dump_netcdf.rst b/doc/src/dump_netcdf.rst index 04790f4986..296b725e20 100644 --- a/doc/src/dump_netcdf.rst +++ b/doc/src/dump_netcdf.rst @@ -48,21 +48,17 @@ rank. NetCDF files can be directly visualized via the following tools: -Ovito (http://www.ovito.org/). Ovito supports the AMBER convention and -all extensions of this dump style. - -* VMD (http://www.ks.uiuc.edu/Research/vmd/). -* AtomEye (http://www.libatoms.org/). The libAtoms version of AtomEye - contains a NetCDF reader that is not present in the standard - distribution of AtomEye. +* Ovito (https://www.ovito.org/). Ovito supports the AMBER convention and + all extensions of this dump style. +* VMD (https://www.ks.uiuc.edu/Research/vmd/). In addition to per-atom data, :doc:`thermo ` data can be included in the dump file. The data included in the dump file is identical to the data specified by :doc:`thermo_style `. -.. _netcdf-home: http://www.unidata.ucar.edu/software/netcdf/ +.. _netcdf-home: https://www.unidata.ucar.edu/software/netcdf/ -.. _pnetcdf-home: http://trac.mcs.anl.gov/projects/parallel-netcdf/ +.. _pnetcdf-home: https://trac.mcs.anl.gov/projects/parallel-netcdf/ ---------- diff --git a/doc/src/dump_vtk.rst b/doc/src/dump_vtk.rst index 89437bab76..4ec872cb89 100644 --- a/doc/src/dump_vtk.rst +++ b/doc/src/dump_vtk.rst @@ -29,8 +29,9 @@ Description """"""""""" Dump a snapshot of atom quantities to one or more files every :math:`N` -timesteps in a format readable by the `VTK visualization toolkit `_ or other visualization tools that use it, -such as `ParaView `_. The time steps on which dump +timesteps in a format readable by the `VTK visualization toolkit +`_ or other visualization tools that use it, such +as `ParaView `_. The time steps on which dump output is written can also be controlled by a variable; see the :doc:`dump_modify every ` command for details. @@ -38,8 +39,8 @@ This dump style is similar to :doc:`dump_style custom ` but uses the VTK library to write data to VTK simple legacy or XML format, depending on the filename extension specified for the dump file. This can be either *\*.vtk* for the legacy format or *\*.vtp* and *\*.vtu*, -respectively, for XML format; see the -`VTK homepage `_ for a detailed +respectively, for XML format; see the `VTK homepage +`_ for a detailed description of these formats. Since this naming convention conflicts with the way binary output is usually specified (see below), the :doc:`dump_modify binary ` command allows setting of a @@ -61,14 +62,15 @@ determine the kind of output. .. warning:: - Unless the :doc:`dump_modify sort ` option - is invoked, the lines of atom information written to dump files will - be in an indeterminate order for each snapshot. This is even true - when running on a single processor, if the :doc:`atom_modify sort ` option is on, which it is by default. In this - case atoms are re-ordered periodically during a simulation, due to - spatial sorting. It is also true when running in parallel, because - data for a single snapshot is collected from multiple processors, each - of which owns a subset of the atoms. + Unless the :doc:`dump_modify sort ` option is invoked, + the lines of atom information written to dump files will be in an + indeterminate order for each snapshot. This is even true when + running on a single processor, if the :doc:`atom_modify sort + ` option is on, which it is by default. In this case + atoms are re-ordered periodically during a simulation, due to spatial + sorting. It is also true when running in parallel, because data for + a single snapshot is collected from multiple processors, each of + which owns a subset of the atoms. For the *vtk* style, sorting is off by default. See the :doc:`dump_modify ` page for details. diff --git a/doc/src/fix_acks2_reaxff.rst b/doc/src/fix_acks2_reaxff.rst index 9f7cc5303d..ebb1b48051 100644 --- a/doc/src/fix_acks2_reaxff.rst +++ b/doc/src/fix_acks2_reaxff.rst @@ -71,7 +71,7 @@ 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 :math:`\mathrm{\mathring{A}}`, eV, and +of this fix are hard-coded to be :math:`\AA`, eV, and electronic charge. The optional *maxiter* keyword allows changing the max number @@ -111,7 +111,7 @@ LAMMPS was built with that package. See the :doc:`Build package 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 :math:`10~\mathrm{\mathring{A}}`. +periodic cell dimensions less than :math:`10~\AA`. This fix may be used in combination with :doc:`fix efield ` and will apply the external electric field during charge equilibration, diff --git a/doc/src/fix_adapt.rst b/doc/src/fix_adapt.rst index a0c9c5edea..18caa3d54f 100644 --- a/doc/src/fix_adapt.rst +++ b/doc/src/fix_adapt.rst @@ -319,6 +319,8 @@ with fix_adapt are ---------- +.. versionadded:: 4May2022 + The *angle* keyword uses the specified variable to change the value of an angle coefficient over time, very similar to how the *pair* keyword operates. The only difference is that now an angle coefficient for a diff --git a/doc/src/fix_append_atoms.rst b/doc/src/fix_append_atoms.rst index 7c52d9b431..c31d4ff9da 100644 --- a/doc/src/fix_append_atoms.rst +++ b/doc/src/fix_append_atoms.rst @@ -79,7 +79,7 @@ measured from zhi and is set with the *extent* argument. The *units* keyword determines the meaning of the distance units used to define a wall position, but only when a numeric constant is used. A *box* value selects standard distance units as defined by the -:doc:`units ` command (e.g., :math:`\mathrm{\mathring A}` +:doc:`units ` command (e.g., :math:`\AA` for units = real or metal. A *lattice* value means the distance units are in lattice spacings. The :doc:`lattice ` command must have been previously used to diff --git a/doc/src/fix_ave_chunk.rst b/doc/src/fix_ave_chunk.rst index 354c8d8e8b..4988064766 100644 --- a/doc/src/fix_ave_chunk.rst +++ b/doc/src/fix_ave_chunk.rst @@ -31,7 +31,7 @@ Syntax v_name = per-atom vector calculated by an atom-style variable with name * zero or more keyword/arg pairs may be appended -* keyword = *norm* or *ave* or *bias* or *adof* or *cdof* or *file* or *overwrite* or *title1* or *title2* or *title3* +* keyword = *norm* or *ave* or *bias* or *adof* or *cdof* or *file* or *overwrite* or *format* or *title1* or *title2* or *title3* .. parsed-literal:: diff --git a/doc/src/fix_ave_histo.rst b/doc/src/fix_ave_histo.rst index e915526aa7..8bb66f0615 100644 --- a/doc/src/fix_ave_histo.rst +++ b/doc/src/fix_ave_histo.rst @@ -35,7 +35,7 @@ Syntax v_name[I] = value calculated by a vector-style variable with name, I can include wildcard (see below) * zero or more keyword/arg pairs may be appended -* keyword = *mode* or *file* or *ave* or *start* or *beyond* or *overwrite* or *title1* or *title2* or *title3* +* keyword = *mode* or *kind* or *file* or *ave* or *start* or *beyond* or *overwrite* or *title1* or *title2* or *title3* .. parsed-literal:: diff --git a/doc/src/fix_ave_time.rst b/doc/src/fix_ave_time.rst index 0308ecc92a..aa82e676ea 100644 --- a/doc/src/fix_ave_time.rst +++ b/doc/src/fix_ave_time.rst @@ -28,7 +28,7 @@ Syntax v_name[I] = value calculated by a vector-style variable with name, I can include wildcard (see below) * zero or more keyword/arg pairs may be appended -* keyword = *mode* or *file* or *ave* or *start* or *off* or *overwrite* or *title1* or *title2* or *title3* +* keyword = *mode* or *file* or *ave* or *start* or *off* or *overwrite* or *format* or *title1* or *title2* or *title3* .. parsed-literal:: diff --git a/doc/src/fix_bocs.rst b/doc/src/fix_bocs.rst index 566bf8e68d..bb50cd1761 100644 --- a/doc/src/fix_bocs.rst +++ b/doc/src/fix_bocs.rst @@ -6,17 +6,28 @@ fix bocs command Syntax """""" -.. parsed-literal:: +.. code-block:: LAMMPS - fix ID group-ID bocs keyword values ... + fix ID group-ID bocs keyword values ... + +* ID, group-ID are documented in :doc:`fix ` command +* bocs = style name of this fix command +* two or more keyword/value pairs may be appended +* keyword = *temp* or *cgiso* or *tchain* or *pchain* or *mtk* or *tloop* or *ploop* + + .. parsed-literal:: - keyword = *temp* or *cgiso* or *analytic* or *linear_spline* or *cubic_spline* *temp* values = Tstart Tstop Tdamp - *cgiso* values = Pstart Pstop Pdamp - *basis set* - *analytic* values = V_avg N_particles N_coeff Coeff_1 Coeff_2 ... Coeff_N - *linear_spline* values = input_filename - *cubic_spline* values = input_filename + *cgiso* values = Pstart Pstop Pdamp basis_set args + basis_set = *analytic* or *linear_spline* or *cubic_spline* + *analytic* args = V_avg N_particles N_coeff Coeff_1 Coeff_2 ... Coeff_N + *linear_spline* args = input_filename + *cubic_spline* args = input_filename + *tchain* value = N = length of thermostat chain (1 = single thermostat) + *pchain* value = N = length of thermostat on barostat (0 = no thermostat) + *mtk* value = *yes* or *no* = add MTK adjustment term or not + *tloop* value = M = number of sub-cycles to perform on thermostat + *ploop* value = M = number of sub-cycles to perform on barostat Examples """""""" @@ -24,25 +35,24 @@ Examples .. code-block:: LAMMPS fix 1 all bocs temp 300.0 300.0 100.0 cgiso 0.986 0.986 1000.0 analytic 66476.015 968 2 245030.10 8962.20 - fix 1 all bocs temp 300.0 300.0 100.0 cgiso 0.986 0.986 1000.0 cubic_spline input_Fv.dat - thermo_modify press 1_press Description """"""""""" These commands incorporate a pressure correction as described by -Dunn and Noid in :ref:`(Dunn1) ` to the standard MTTK -barostat by Martyna et. al. in :ref:`(Martyna) ` . -The first half of the command mimics a standard fix npt command: +Dunn and Noid :ref:`(Dunn1) ` to the standard MTK +barostat by Martyna et al. :ref:`(Martyna) `. +The first half of the command mimics a standard :doc:`fix npt ` +command: .. code-block:: LAMMPS fix 1 all bocs temp Tstart Tstop Tcoupl cgiso Pstart Pstop Pdamp The two differences are replacing *npt* with *bocs*, and replacing -*iso*\ /\ *aniso*\ /\ *etc* with *cgiso*\ . +*iso*\ /\ *aniso*\ /\ etc. with *cgiso*\ . The rest of the command details what form you would like to use for the pressure correction equation. The choices are: *analytic*, *linear_spline*, or *cubic_spline*. @@ -58,9 +68,9 @@ as a function of volume. The file must be formatted so each line has: Note both the COMMA and the SPACE separating the volume's value and its corresponding pressure correction. The volumes in the file must be uniformly spaced. Both the volumes and the pressure corrections -should be provided in the proper units, e.g. if you are using *units real*, -the volumes should all be in cubic angstroms, and the pressure corrections -should all be in atmospheres. Furthermore, the table should start/end at a +should be provided in the proper units (e.g., if you are using *units real*, +the volumes should all be in :math:`\mathrm{\mathring{A}}^3` and the pressure +corrections should all be in atm). Furthermore, the table should start/end at a volume considerably smaller/larger than you expect your system to sample during the simulation. If the system ever reaches a volume outside of the range provided, the simulation will stop. @@ -71,9 +81,10 @@ With the *analytic* option, the arguments are as follows: ... analytic V_avg N_particles N_coeff Coeff_1 Coeff_2 ... Coeff_N -Note that *V_avg* and *Coeff_i* should all be in the proper units, e.g. if you -are using *units real*, *V_avg* should be in cubic angstroms, and the -coefficients should all be in atmospheres \* cubic angstroms. +Note that *V_avg* and *Coeff_i* should all be in the proper units (e.g., if you +are using *units real*, *V_avg* should be in :math:`\mathrm{\mathring{A}^3}` +and the coefficients should all be in +:math:`\mathrm{atm}\cdot\mathrm{\mathring{A}^3}`\ ). ---------- @@ -122,7 +133,7 @@ are written to a file every so often. In order to have LAMMPS report the modified pressure, you must include the *thermo_modify* command given in the examples. For the last argument in the command, you should put XXXX_press, where XXXX is the ID given to the fix bocs command (in the -example, the ID of the fix bocs command is 1 ). +example, the ID of the fix bocs command is 1). This fix is part of the BOCS package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. @@ -132,7 +143,7 @@ Further information For more details about the pressure correction and the entire BOCS software package, visit the `BOCS package on GitHub `_ and read the release -paper by Dunn et. al. :ref:`(Dunn2) ` . +paper by Dunn et al. :ref:`(Dunn2) ` . .. _bocsgithub: https://github.com/noid-group/BOCS diff --git a/doc/src/fix_bond_break.rst b/doc/src/fix_bond_break.rst index ba12e154c5..a0f7fad581 100644 --- a/doc/src/fix_bond_break.rst +++ b/doc/src/fix_bond_break.rst @@ -6,7 +6,7 @@ fix bond/break command Syntax """""" -.. parsed-literal:: +.. code-block:: LAMMPS fix ID group-ID bond/break Nevery bondtype Rmax keyword values ... @@ -15,7 +15,7 @@ Syntax * Nevery = attempt bond breaking every this many steps * bondtype = type of bonds to break * Rmax = bond longer than Rmax can break (distance units) -* zero or more keyword/value pairs may be appended to args +* zero or more keyword/value pairs may be appended * keyword = *prob* .. parsed-literal:: @@ -43,42 +43,42 @@ pair of atoms computed by the :doc:`bond_style ` command. Once the bond is broken it will be permanently deleted, as will all angle, dihedral, and improper interactions that bond is part of. -This is different than a :doc:`pairwise ` bond-order +This is different than a :doc:`pair-wise ` bond-order potential such as Tersoff or AIREBO which infers bonds and many-body interactions based on the current geometry of a small cluster of atoms and effectively creates and destroys bonds and higher-order many-body interactions from timestep to timestep as atoms move. A check for possible bond breakage is performed every *Nevery* -timesteps. If two bonded atoms I,J are further than a distance *Rmax* -of each other, if the bond is of type *bondtype*, and if both I and J -are in the specified fix group, then I,J is labeled as a "possible" -bond to break. +timesteps. If two bonded atoms :math:`i` and :math:`j` are farther than the +distance *Rmax* from each other, the bond is of type *bondtype*, and both +:math:`i` and :math:`j` are in the specified fix group, then the bond between +:math:`i` and :math:`j` is labeled as a "possible" bond to break. If several bonds involving an atom are stretched, it may have multiple possible bonds to break. Every atom checks its list of possible bonds to break and labels the longest such bond as its "sole" bond to break. -After this is done, if atom I is bonded to atom J in its sole bond, -and atom J is bonded to atom I in its sole bond, then the I,J bond is -"eligible" to be broken. +After this is done, if atom :math:`i` is bonded to atom :math:`j` in its sole +bond, and atom :math:`j` is bonded to atom :math:`j` in its sole bond, then the +bond between :math:`i` and :math:`j` is "eligible" to be broken. Note that these rules mean an atom will only be part of at most one -broken bond on a given timestep. It also means that if atom I chooses -atom J as its sole partner, but atom J chooses atom K is its sole -partner (due to Rjk > Rij), then this means atom I will not be part of -a broken bond on this timestep, even if it has other possible bond -partners. +broken bond on a given time step. It also means that if atom :math:`i` chooses +atom :math:`j` as its sole partner, but atom :math:`j` chooses atom :math:`k` +as its sole partner (because :math:`R_{jk} > R_{ij}`), then this means atom +:math:`i` will not be part of a broken bond on this time step, even if it has +other possible bond partners. The *prob* keyword can effect whether an eligible bond is actually broken. The *fraction* setting must be a value between 0.0 and 1.0. A uniform random number between 0.0 and 1.0 is generated and the -eligible bond is only broken if the random number < fraction. +eligible bond is only broken if the random number is less than *fraction*. When a bond is broken, data structures within LAMMPS that store bond -topology are updated to reflect the breakage. Likewise, if the bond +topologies are updated to reflect the breakage. Likewise, if the bond is part of a 3-body (angle) or 4-body (dihedral, improper) interaction, that interaction is removed as well. These changes -typically affect pairwise interactions between atoms that used to be +typically affect pair-wise interactions between atoms that used to be part of bonds, angles, etc. .. note:: @@ -88,17 +88,17 @@ part of bonds, angles, etc. becomes two molecules due to the broken bond, all atoms in both new molecules retain their original molecule IDs. -Computationally, each timestep this fix operates, it loops over all +Computationally, each time step this fix is invoked, it loops over all the bonds in the system and computes distances between pairs of bonded atoms. It also communicates between neighboring processors to coordinate which bonds are broken. Moreover, if any bonds are broken, -neighbor lists must be immediately updated on the same timestep. This -is to insure that any pairwise interactions that should be turned "on" +neighbor lists must be immediately updated on the same time step. This +is to ensure that any pair-wise interactions that should be turned "on" due to a bond breaking, because they are no longer excluded by the presence of the bond and the settings of the :doc:`special_bonds ` command, will be immediately -recognized. All of these operations increase the cost of a timestep. -Thus you should be cautious about invoking this fix too frequently. +recognized. All of these operations increase the cost of a time step. +Thus, you should be cautious about invoking this fix too frequently. You can dump out snapshots of the current bond topology via the :doc:`dump local ` command. @@ -107,11 +107,11 @@ You can dump out snapshots of the current bond topology via the :doc:`dump local Breaking a bond typically alters the energy of a system. You should be careful not to choose bond breaking criteria that induce a dramatic change in energy. For example, if you define a very stiff - harmonic bond and break it when 2 atoms are separated by a distance - far from the equilibrium bond length, then the 2 atoms will be + harmonic bond and break it when two atoms are separated by a distance + far from the equilibrium bond length, then the two atoms will be dramatically released when the bond is broken. More generally, you may need to thermostat your system to compensate for energy changes - resulting from broken bonds (and angles, dihedrals, impropers). + resulting from broken bonds (as well as angles, dihedrals, and impropers). See the :doc:`Howto ` page on broken bonds for more information on related features in LAMMPS. @@ -124,14 +124,14 @@ Restart, fix_modify, output, run start/stop, minimize info No information about this fix is written to :doc:`binary restart files `. None of the :doc:`fix_modify ` options are relevant to this fix. -This fix computes two statistics which it stores in a global vector of -length 2, which can be accessed by various :doc:`output commands `. The vector values calculated by this fix -are "intensive". +This fix computes two statistics, which it stores in a global vector of +length 2. This vector can be accessed by various :doc:`output commands +`. The vector values calculated by this fix are "intensive". -These are the 2 quantities: +The two quantities in the global vector are -* (1) # of bonds broken on the most recent breakage timestep -* (2) cumulative # of bonds broken + (1) number of bonds broken on the most recent breakage time step + (2) cumulative number of bonds broken 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 `. diff --git a/doc/src/fix_bond_create.rst b/doc/src/fix_bond_create.rst index c286482f81..bc5e1b83f8 100644 --- a/doc/src/fix_bond_create.rst +++ b/doc/src/fix_bond_create.rst @@ -10,7 +10,7 @@ fix bond/create/angle command Syntax """""" -.. parsed-literal:: +.. code-block:: LAMMPS fix ID group-ID bond/create Nevery itype jtype Rmin bondtype keyword values ... @@ -58,83 +58,84 @@ Description """"""""""" Create bonds between pairs of atoms as a simulation runs according to -specified criteria. This can be used to model cross-linking of +specified criteria. This can be used to model the cross-linking of polymers, the formation of a percolation network, etc. In this context, a bond means an interaction between a pair of atoms computed by the :doc:`bond_style ` command. Once the bond is created it will be permanently in place. Optionally, the creation of a bond -can also create angle, dihedral, and improper interactions that bond +can also create angle, dihedral, and improper interactions that the bond is part of. See the discussion of the *atype*, *dtype*, and *itype* keywords below. -This is different than a :doc:`pairwise ` bond-order -potential such as Tersoff or AIREBO which infers bonds and many-body +This process is different than a :doc:`pair-wise ` bond-order +potential such as Tersoff or AIREBO, which infer bonds and many-body interactions based on the current geometry of a small cluster of atoms -and effectively creates and destroys bonds and higher-order many-body -interactions from timestep to timestep as atoms move. +and effectively create and destroy bonds and higher-order many-body +interactions from time step to time step as the atoms move. -A check for possible new bonds is performed every *Nevery* timesteps. -If two atoms I,J are within a distance *Rmin* of each other, if I is -of atom type *itype*, if J is of atom type *jtype*, if both I and J -are in the specified fix group, if a bond does not already exist -between I and J, and if both I and J meet their respective *maxbond* -requirement (explained below), then I,J is labeled as a "possible" -bond pair. +A check for possible new bonds is performed every *Nevery* time steps. +If two atoms :math:`i` and :math:`j` are within a distance *Rmin* of each +other, atom :math:`i` is of type *itype*, atom :math:`j` is of type *jtype*, +and both :math:`i` and :math:`j` are in the specified fix group, then if a bond +does not already exist between atoms :math:`i` and :math:`j`, and if both +:math:`i` and :math:`j` meet their respective *maxbond* requirements (explained +below), then :math:`i` and :math:`j` are labeled as a "possible" bond pair. If several atoms are close to an atom, it may have multiple possible bond partners. Every atom checks its list of possible bond partners and labels the closest such partner as its "sole" bond partner. After -this is done, if atom I has atom J as its sole partner, and atom J has -atom I as its sole partner, then the I,J bond is "eligible" to be -formed. +this is done, if atom :math:`i` has atom :math:`j` as its sole partner and +atom :math:`j` has atom :math:`i` as its sole partner, then the +:math:`i,j` bond is "eligible" to be formed. -Note that these rules mean an atom will only be part of at most one -created bond on a given timestep. It also means that if atom I -chooses atom J as its sole partner, but atom J chooses atom K is its -sole partner (due to Rjk < Rij), then this means atom I will not form -a bond on this timestep, even if it has other possible bond partners. +Note that these rules mean that an atom will only be part of at most one +created bond on a given time step. It also means that if atom :math:`i` +chooses atom :math:`j` as its sole partner, but atom :math:`j` chooses atom +:math:`k` as its sole partner (because :math:`R_{jk} < R_{ij}`), then atom +:math:`i` will not form a bond on this time step, even if it has other possible +bond partners. -It is permissible to have *itype* = *jtype*\ . *Rmin* must be <= the -pairwise cutoff distance between *itype* and *jtype* atoms, as defined +It is permissible to have *itype* = *jtype*\ . *Rmin* must be :math:`\leq` the +pair-wise cutoff distance between *itype* and *jtype* atoms, as defined by the :doc:`pair_style ` command. The *iparam* and *jparam* keywords can be used to limit the bonding functionality of the participating atoms. Each atom keeps track of -how many bonds of *bondtype* it already has. If atom I of -itype already has *maxbond* bonds (as set by the *iparam* -keyword), then it will not form any more. Likewise for atom J. If -*maxbond* is set to 0, then there is no limit on the number of bonds +how many bonds of *bondtype* it already has. If atom :math:`i` of type +*itype* already has *maxbond* bonds (as set by the *iparam* +keyword), then it will not form any more, and likewise for atom :math:`j`. +If *maxbond* is set to 0, then there is no limit on the number of bonds that can be formed with that atom. The *newtype* value for *iparam* and *jparam* can be used to change -the atom type of atom I or J when it reaches *maxbond* number of bonds -of type *bondtype*\ . This means it can now interact in a pairwise +the atom type of atom :math:`i` or :math:`j` when it reaches *maxbond* number +of bonds of type *bondtype*\ . This means it can now interact in a pair-wise fashion with other atoms in a different way by specifying different :doc:`pair_coeff ` coefficients. If you do not wish the atom type to change, simply specify *newtype* as *itype* or *jtype*\ . -The *prob* keyword can also effect whether an eligible bond is +The *prob* keyword can also affect whether an eligible bond is actually created. The *fraction* setting must be a value between 0.0 and 1.0. A uniform random number between 0.0 and 1.0 is generated and -the eligible bond is only created if the random number < fraction. +the eligible bond is only created if the random number is less than *fraction*. The *aconstrain* keyword is only available with the fix -bond/create/angle command. It allows to specify a minimal and maximal -angle *amin* and *amax* between the two prospective bonding partners and -a third particle that is already bonded to one of the two partners. -Such a criterion can be important when new angles are defined together -with the formation of a new bond. Without a restriction on the +bond/create/angle command. It allows one to specify minimum and maximum +angles *amin* and *amax*, respectively, between the two prospective bonding +partners and a third particle that is already bonded to one of the two +partners. Such a criterion can be important when new angles are defined +together with the formation of a new bond. Without a restriction on the permissible angle, and for stiffer angle potentials, very large energies -can arise and lead to uncontrolled behavior. +can arise and lead to unphysical behavior. Any bond that is created is assigned a bond type of *bondtype*. When a bond is created, data structures within LAMMPS that store bond -topology are updated to reflect the creation. If the bond is part of +topologies are updated to reflect the creation. If the bond is part of new 3-body (angle) or 4-body (dihedral, improper) interactions, you -can choose to create new angles, dihedrals, impropers as well, using +can choose to create new angles, dihedrals, and impropers as well using the *atype*, *dtype*, and *itype* keywords. All of these changes -typically affect pairwise interactions between atoms that are now part +typically affect pair-wise interactions between atoms that are now part of new bonds, angles, etc. .. note:: @@ -165,19 +166,19 @@ of type *angletype*, with parameters assigned by the corresponding when bonds are created. See the :doc:`read_data ` or :doc:`create_box ` command for more details. Note that a data file with no atoms can be used if you wish to add non-bonded - atoms via the :doc:`create atoms ` command, e.g. for a - percolation simulation. + atoms via the :doc:`create atoms ` command (e.g., for a + percolation simulation). .. note:: LAMMPS stores and maintains a data structure with a list of the first, second, and third neighbors of each atom (within the bond topology of - the system) for use in weighting pairwise interactions for bonded + the system) for use in weighting pair-wise interactions for bonded atoms. Note that adding a single bond always adds a new first neighbor - but may also induce \*many\* new second and third neighbors, depending on the + but may also induce **many** new second and third neighbors, depending on the molecular topology of your system. The "extra special per atom" parameter must typically be set to allow for the new maximum total - size (first + second + third neighbors) of this per-atom list. There are 2 + size (first + second + third neighbors) of this per-atom list. There are two ways to do this. See the :doc:`read_data ` or :doc:`create_box ` commands for details. @@ -186,15 +187,16 @@ of type *angletype*, with parameters assigned by the corresponding Even if you do not use the *atype*, *dtype*, or *itype* keywords, the list of topological neighbors is updated for atoms affected by the new bond. This in turn affects which neighbors are - considered for pairwise interactions, using the weighting rules set by + considered for pair-wise interactions, using the weighting rules set by the :doc:`special_bonds ` command. Consider a new bond - created between atoms I,J. If J has a bonded neighbor K, then K - becomes a second neighbor of I. Even if the *atype* keyword is not used - to create angle I-J-K, the pairwise interaction between I and K will - be potentially turned off or weighted by the 1-3 weighting specified + created between atoms :math:`i` and :math:`j`. If :math:`j` has a bonded + neighbor :math:`k`, then :math:`k` becomes a second neighbor of :math:`i`. + Even if the *atype* keyword is not used to create angle :math:`\angle ijk`, + the pair-wise interaction between :math:`i` and :math:`k` could potentially + be turned off or weighted by the 1--3 weighting specified by the :doc:`special_bonds ` command. This is the case even if the "angle yes" option was used with that command. The same - is true for third neighbors (1-4 interactions), the *dtype* keyword, and + is true for third neighbors (1--4 interactions), the *dtype* keyword, and the "dihedral yes" option used with the :doc:`special_bonds ` command. @@ -203,20 +205,20 @@ define a :doc:`bond_style ` and use the :doc:`bond_coeff ` command to specify coefficients for the *bondtype*\ . Similarly, if new atom types are specified by the *iparam* or *jparam* keywords, they must be within the range of atom -types allowed by the simulation and pairwise coefficients must be +types allowed by the simulation and pair-wise coefficients must be specified for the new types. -Computationally, each timestep this fix operates, it loops over +Computationally, each time step this fix is invoked, it loops over neighbor lists and computes distances between pairs of atoms in the list. It also communicates between neighboring processors to coordinate which bonds are created. Moreover, if any bonds are created, neighbor lists must be immediately updated on the same -timestep. This is to insure that any pairwise interactions that +time step. This is to ensure that any pair-wise interactions that should be turned "off" due to a bond creation, because they are now excluded by the presence of the bond and the settings of the :doc:`special_bonds ` command, will be immediately -recognized. All of these operations increase the cost of a timestep. -Thus you should be cautious about invoking this fix too frequently. +recognized. All of these operations increase the cost of a time step. +Thus, you should be cautious about invoking this fix too frequently. You can dump out snapshots of the current bond topology via the :doc:`dump local ` command. @@ -225,8 +227,8 @@ You can dump out snapshots of the current bond topology via the :doc:`dump local Creating a bond typically alters the energy of a system. You should be careful not to choose bond creation criteria that induce a dramatic change in energy. For example, if you define a very stiff - harmonic bond and create it when 2 atoms are separated by a distance - far from the equilibrium bond length, then the 2 atoms will oscillate + harmonic bond and create it when two atoms are separated by a distance + far from the equilibrium bond length, then the two atoms will oscillate dramatically when the bond is formed. More generally, you may need to thermostat your system to compensate for energy changes resulting from created bonds (and angles, dihedrals, impropers). @@ -245,10 +247,10 @@ length 2, which can be accessed by various :doc:`output commands `. The vector values calculated by this fix are "intensive". -These are the 2 quantities: +The two quantities in the global vector are -* (1) # of bonds created on the most recent creation timestep -* (2) cumulative # of bonds created + (1) number of bonds created on the most recent creation time step + (2) cumulative number of bonds created 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 `. diff --git a/doc/src/fix_bond_react.rst b/doc/src/fix_bond_react.rst index a48675dcf2..c557d2617d 100644 --- a/doc/src/fix_bond_react.rst +++ b/doc/src/fix_bond_react.rst @@ -6,12 +6,12 @@ fix bond/react command Syntax """""" -.. parsed-literal:: +.. code-block:: LAMMPS - fix ID group-ID bond/react common_keyword values ... - react react-ID react-group-ID Nevery Rmin Rmax template-ID(pre-reacted) template-ID(post-reacted) map_file individual_keyword values ... - react react-ID react-group-ID Nevery Rmin Rmax template-ID(pre-reacted) template-ID(post-reacted) map_file individual_keyword values ... - react react-ID react-group-ID Nevery Rmin Rmax template-ID(pre-reacted) template-ID(post-reacted) map_file individual_keyword values ... + fix ID group-ID bond/react common_keyword values & + react react-ID react-group-ID Nevery Rmin Rmax template-ID(pre-reacted) template-ID(post-reacted) map_file individual_keyword values & + react react-ID react-group-ID Nevery Rmin Rmax template-ID(pre-reacted) template-ID(post-reacted) map_file individual_keyword values & + react react-ID react-group-ID Nevery Rmin Rmax template-ID(pre-reacted) template-ID(post-reacted) map_file individual_keyword values & ... * ID, group-ID are documented in :doc:`fix ` command. @@ -22,11 +22,12 @@ Syntax .. parsed-literal:: - *stabilization* values = *no* or *yes* *group-ID* *xmax* - *no* = no reaction site stabilization (default) - *yes* = perform reaction site stabilization - *group-ID* = user-assigned prefix for the dynamic group of atoms not currently involved in a reaction - *xmax* = xmax value that is used by an internally-created :doc:`nve/limit ` integrator + *stabilization* values = stabilize group_prefix xmax + stabilize = *yes* or *no* + *yes* = perform reaction site stabilization + *no* = no reaction site stabilization (default) + group_prefix = user-assigned prefix for the dynamic group of atoms not currently involved in a reaction + xmax = value that is used by an internally-created :doc:`nve/limit ` integrator *reset_mol_ids* values = *yes* or *no* *yes* = update molecule IDs based on new global topology (default) *no* = do not update molecule IDs @@ -51,18 +52,18 @@ Syntax *max_rxn* value = N N = maximum number of reactions allowed to occur *stabilize_steps* value = timesteps - timesteps = number of timesteps to apply the internally-created :doc:`nve/limit ` fix to reacting atoms - *custom_charges* value = *no* or *fragmentID* - no = update all atomic charges (default) - fragmentID = ID of molecule fragment whose charges are updated + timesteps = number of time steps to apply the internally-created :doc:`nve/limit ` fix to reacting atoms + *custom_charges* value = *no* or fragment-ID + *no* = update all atomic charges (default) + fragment-ID = ID of molecule fragment whose charges are updated *molecule* value = *off* or *inter* or *intra* - off = allow both inter- and intramolecular reactions (default) - inter = search for reactions between molecules with different IDs - intra = search for reactions within the same molecule - *modify_create* keyword values - *fit* value = *all* or *fragmentID* - all = use all eligible atoms for create-atoms fit (default) - fragmentID = ID of molecule fragment used for create-atoms fit + *off* = allow both inter- and intramolecular reactions (default) + *inter* = search for reactions between molecules with different IDs + *intra* = search for reactions within the same molecule + *modify_create* values = keyword arg + *fit* arg = *all* or fragment-ID + *all* = use all eligible atoms for create-atoms fit (default) + fragment-ID = ID of molecule fragment used for create-atoms fit *overlap* value = R R = only insert atom/molecule if further than R from existing particles (distance units) @@ -99,31 +100,32 @@ other molecules can be identified and deleted. Finally, atoms can be created and inserted at specific positions relative to the reaction site. -Fix bond/react does not use quantum mechanical (eg. fix qmmm) or -pairwise bond-order potential (eg. Tersoff or AIREBO) methods to +Fix bond/react does not use quantum mechanical (e.g., :doc:`fix qmmm `) or +pairwise bond-order potential (e.g., :doc:`Tersoff ` or +:doc:`AIREBO `) methods to determine bonding changes a priori. Rather, it uses a distance-based probabilistic criteria to effect predetermined topology changes in simulations using standard force fields. This fix was created to facilitate the dynamic creation of polymeric, amorphous or highly cross-linked systems. A suggested workflow for -using this fix is: 1) identify a reaction to be simulated 2) build a -molecule template of the reaction site before the reaction has -occurred 3) build a molecule template of the reaction site after the -reaction has occurred 4) create a map that relates the -template-atom-IDs of each atom between pre- and post-reaction molecule -templates 5) fill a simulation box with molecules and run a simulation -with fix bond/react. +using this fix is + + (1) identify a reaction to be simulated + (2) build a molecule template of the reaction site before the reaction has occurred + (3) build a molecule template of the reaction site after the reaction has occurred + (4) create a map that relates the template-atom-IDs of each atom between pre- and post-reaction molecule templates + (5) fill a simulation box with molecules and run a simulation with fix bond/react. Only one 'fix bond/react' command can be used at a time. Multiple reactions can be simultaneously applied by specifying multiple *react* arguments to a single 'fix bond/react' command. This syntax is -necessary because the 'common keywords' are applied to all reactions. +necessary because the "common" keywords are applied to all reactions. The *stabilization* keyword enables reaction site stabilization. Reaction site stabilization is performed by including reacting atoms in an internally-created fix :doc:`nve/limit ` time -integrator for a set number of timesteps given by the +integrator for a set number of time steps given by the *stabilize_steps* keyword. While reacting atoms are being time integrated by the internal nve/limit, they are prevented from being involved in any new reactions. The *xmax* value keyword should @@ -133,53 +135,54 @@ during the simulation. Fix bond/react creates and maintains two important dynamic groups of atoms when using the *stabilization* keyword. The first group contains all atoms currently involved in a reaction; this group is -automatically thermostatted by an internally-created +automatically time-integrated by an internally-created :doc:`nve/limit ` integrator. The second group contains all atoms currently not involved in a reaction. This group should be -used by a thermostat in order to time integrate the system. The name +controlled by a thermostat in order to time integrate the system. The name of this group of non-reacting atoms is created by appending '_REACT' to the group-ID argument of the *stabilization* keyword, as shown in the second example above. .. note:: - When using reaction stabilization, you should generally not have - a separate thermostat which acts on the 'all' group. + When using reaction stabilization, you should generally **not** have + a separate thermostat that acts on the "all" group. The group-ID set using the *stabilization* keyword can be an existing static group or a previously-unused group-ID. It cannot be specified -as 'all'. If the group-ID is previously unused, the fix bond/react +as "all". If the group-ID is previously unused, the fix bond/react command creates a :doc:`dynamic group ` that is initialized to include all atoms. If the group-ID is that of an existing static group, the group is used as the parent group of new, internally-created dynamic group. In both cases, this new dynamic -group is named by appending '_REACT' to the group-ID, e.g. -nvt_grp_REACT. By specifying an existing group, you may thermostat +group is named by appending '_REACT' to the group-ID (e.g., +nvt_grp_REACT). By specifying an existing group, you may thermostat constant-topology parts of your system separately. The dynamic group -contains only atoms not involved in a reaction at a given timestep, +contains only atoms not involved in a reaction at a given time step, and therefore should be used by a subsequent system-wide time -integrator such as nvt, npt, or nve, as shown in the second example -above (full examples can be found at examples/PACKAGES/reaction). The time +integrator such as :doc:`fix nvt `, :doc:`fix npt `, or +:doc:`fix nve `, as shown in the second example +above (full examples can be found in examples/PACKAGES/reaction). The time integration command should be placed after the fix bond/react command due to the internal dynamic grouping performed by fix bond/react. .. note:: If the group-ID is an existing static group, react-group-IDs - should also be specified as this static group, or a subset. + should also be specified as this static group or a subset. The *reset_mol_ids* keyword invokes the :doc:`reset_mol_ids ` command after a reaction occurs, to ensure that molecule IDs are consistent with the new bond topology. The group-ID used for :doc:`reset_mol_ids ` is the group-ID for this fix. -Resetting molecule IDs is necessarily a global operation, and so can +Resetting molecule IDs is necessarily a global operation, so it can be slow for very large systems. The following comments pertain to each *react* argument (in other -words, can be customized for each reaction, or reaction step): +words, they can be customized for each reaction, or reaction step): A check for possible new reaction sites is performed every *Nevery* -timesteps. *Nevery* can be specified with an equal-style +time steps. *Nevery* can be specified with an equal-style :doc:`variable `, whose value is rounded up to the nearest integer. @@ -194,11 +197,11 @@ reaction site is eligible to be modified to match the post-reaction template. An initiator atom pair will be identified if several conditions are -met. First, a pair of atoms I,J within the specified react-group-ID of -type itype and jtype must be separated by a distance between *Rmin* -and *Rmax*\ . *Rmin* and *Rmax* can be specified with equal-style -:doc:`variables `. For example, these reaction cutoffs can -be a function of the reaction conversion using the following commands: +met. First, a pair of atoms :math:`i` and :math:`j` within the specified +react-group-ID of type *itype* and *jtype* must be separated by a distance +between *Rmin* and *Rmax*\ . *Rmin* and *Rmax* can be specified with +equal-style :doc:`variables `. For example, these reaction cutoffs +can be functions of the reaction conversion using the following commands: .. code-block:: LAMMPS @@ -207,23 +210,28 @@ be a function of the reaction conversion using the following commands: variable rmax equal 3+f_myrxn[1]/100 # arbitrary function of reaction count The following criteria are used if multiple candidate initiator atom -pairs are identified within the cutoff distance: 1) If the initiator -atoms in the pre-reaction template are not 1-2 neighbors (i.e. not -directly bonded) the closest potential partner is chosen. 2) -Otherwise, if the initiator atoms in the pre-reaction template are 1-2 -neighbors (i.e. directly bonded) the farthest potential partner is -chosen. 3) Then, if both an atom I and atom J have each other as their -initiator partners, these two atoms are identified as the initiator -atom pair of the reaction site. Note that it can be helpful to select +pairs are identified within the cutoff distance: + + (1) If the initiator atoms in the pre-reaction template are not 1--2 + neighbors (i.e., not directly bonded) the closest potential partner is + chosen. + (2) Otherwise, if the initiator atoms in the pre-reaction template are 1--2 + neighbors (i.e. directly bonded) the farthest potential partner is + chosen. + (3) Then, if both an atom :math:`i` and atom :math:`j` have each other as + initiator partners, these two atoms are identified as the initiator atom + pair of the reaction site. + +Note that it can be helpful to select unique atom types for the initiator atoms: if an initiator atom pair -is identified, as described in the previous steps, but does not +is identified, as described in the previous steps, but it does not correspond to the same pair specified in the pre-reaction template, an otherwise eligible reaction could be prevented from occurring. Once this unique initiator atom pair is identified for each reaction, there could be two or more reactions that involve the same atom on the same -timestep. If this is the case, only one such reaction is permitted to +time step. If this is the case, only one such reaction is permitted to occur. This reaction is chosen randomly from all potential reactions -involving the overlapping atom. This capability allows e.g. for +involving the overlapping atom. This capability allows, for example, different reaction pathways to proceed from identical reaction sites with user-specified probabilities. @@ -247,19 +255,19 @@ pre-reaction template atoms should be linked to an initiator atom, via at least one path that does not involve edge atoms. When the pre-reaction template contains edge atoms, not all atoms, bonds, charges, etc. specified in the reaction templates will be updated. -Specifically, topology that involves only atoms that are 'too near' to -template edges will not be updated. The definition of 'too near the -edge' depends on which interactions are defined in the simulation. If +Specifically, topology that involves only atoms that are "too near" to +template edges will not be updated. The definition of "too near the +edge" depends on which interactions are defined in the simulation. If the simulation has defined dihedrals, atoms within two bonds of edge -atoms are considered 'too near the edge.' If the simulation defines +atoms are considered "too near the edge." If the simulation defines angles, but not dihedrals, atoms within one bond of edge atoms are -considered 'too near the edge.' If just bonds are defined, only edge -atoms are considered 'too near the edge.' +considered "too near the edge." If just bonds are defined, only edge +atoms are considered "too near the edge." .. note:: - Small molecules, i.e. ones that have all their atoms contained - within the reaction templates, never have edge atoms. + Small molecules (i.e., ones that have all their atoms contained + within the reaction templates) never have edge atoms. Note that some care must be taken when a building a molecule template for a given simulation. All atom types in the pre-reacted template @@ -282,7 +290,7 @@ provided on the :doc:`molecule ` command page. .. note:: When a reaction occurs, it is possible that the resulting - topology/atom (e.g. special bonds, dihedrals, etc.) exceeds that of + topology/atom (e.g., special bonds, dihedrals) exceeds that of the existing system and reaction templates. As when inserting molecules, enough space for this increased topology/atom must be reserved by using the relevant "extra" keywords to the @@ -292,14 +300,14 @@ The map file is a text document with the following format: A map file has a header and a body. The header of map file the contains one mandatory keyword and five optional keywords. The -mandatory keyword is 'equivalences': +mandatory keyword is *equivalences*\ : .. parsed-literal:: N *equivalences* = # of atoms N in the reaction molecule templates -The optional keywords are 'edgeIDs', 'deleteIDs', 'chiralIDs' and -'constraints': +The optional keywords are *edgeIDs*\ , *deleteIDs*\ , *chiralIDs*\ , and +*constraints*\ : .. parsed-literal:: @@ -311,25 +319,25 @@ The optional keywords are 'edgeIDs', 'deleteIDs', 'chiralIDs' and The body of the map file contains two mandatory sections and five optional sections. The first mandatory section begins with the keyword -'InitiatorIDs' and lists the two atom IDs of the initiator atom pair +"InitiatorIDs" and lists the two atom IDs of the initiator atom pair in the pre-reacted molecule template. The second mandatory section -begins with the keyword 'Equivalences' and lists a one-to-one +begins with the keyword "Equivalences" and lists a one-to-one correspondence between atom IDs of the pre- and post-reacted templates. The first column is an atom ID of the pre-reacted molecule template, and the second column is the corresponding atom ID of the post-reacted molecule template. The first optional section begins with -the keyword 'EdgeIDs' and lists the atom IDs of edge atoms in the +the keyword "EdgeIDs" and lists the atom IDs of edge atoms in the pre-reacted molecule template. The second optional section begins with -the keyword 'DeleteIDs' and lists the atom IDs of pre-reaction +the keyword "DeleteIDs" and lists the atom IDs of pre-reaction template atoms to delete. The third optional section begins with the -keyword 'CreateIDs' and lists the atom IDs of the post-reaction +keyword "CreateIDs" and lists the atom IDs of the post-reaction template atoms to create. The fourth optional section begins with the -keyword 'ChiralIDs' lists the atom IDs of chiral atoms whose +keyword "ChiralIDs" lists the atom IDs of chiral atoms whose handedness should be enforced. The fifth optional section begins with -the keyword 'Constraints' and lists additional criteria that must be +the keyword "Constraints" and lists additional criteria that must be satisfied in order for the reaction to occur. Currently, there are -six types of constraints available, as discussed below: 'distance', -'angle', 'dihedral', 'arrhenius', 'rmsd', and 'custom'. +six types of constraints available, as discussed below: "distance", +"angle", "dihedral", "arrhenius", "rmsd", and "custom". A sample map file is given below: @@ -384,18 +392,24 @@ two sub-keywords, *fit* and *overlap*. One or more of the sub-keywords may be used after the *modify_create* keyword. The *fit* sub-keyword can be used to specify which post-reaction atoms are used for the optimal translation and rotation of the post-reaction template. The -*fragmentID* value of the *fit* sub-keyword must be the name of a +fragment-ID value of the *fit* sub-keyword must be the name of a molecule fragment defined in the post-reaction :doc:`molecule ` template, and only atoms in this fragment are used for the fit. Atoms are created only if no current atom in the simulation is -within a distance R of any created atom, including the effect of -periodic boundary conditions if applicable. R is defined by the -*overlap* sub-keyword. Note that the default value for R is 0.0, which +within a distance :math:`R` of any created atom, including the effect of +periodic boundary conditions if applicable. :math:`R` is defined by the +*overlap* sub-keyword. Note that the default value for :math:`R` is 0.0, which will allow atoms to strongly overlap if you are inserting where other atoms are present. The velocity of each created atom is initialized in a random direction with a magnitude calculated from the instantaneous temperature of the reaction site. +.. note:: + + The 'Coords' section must be included in the post-reaction template + when creating atoms because these coordinates are used to determine + where new atoms are inserted. + The handedness of atoms that are chiral centers can be enforced by listing their IDs in the ChiralIDs section. A chiral atom must be bonded to four atoms with mutually different atom types. This feature @@ -406,40 +420,40 @@ and the relative position of the fourth bonded atom determines the chiral center's handedness. Any number of additional constraints may be specified in the -Constraints section of the map file. The constraint of type 'distance' +Constraints section of the map file. The constraint of type "distance" has syntax as follows: .. parsed-literal:: distance *ID1* *ID2* *rmin* *rmax* -where 'distance' is the required keyword, *ID1* and *ID2* are +where "distance" is the required keyword, *ID1* and *ID2* are pre-reaction atom IDs (or molecule-fragment IDs, see below), and these two atoms must be separated by a distance between *rmin* and *rmax* for the reaction to occur. -The constraint of type 'angle' has the following syntax: +The constraint of type "angle" has the following syntax: .. parsed-literal:: angle *ID1* *ID2* *ID3* *amin* *amax* -where 'angle' is the required keyword, *ID1*, *ID2* and *ID3* are +where "angle" is the required keyword, *ID1*, *ID2* and *ID3* are pre-reaction atom IDs (or molecule-fragment IDs, see below), and these three atoms must form an angle between *amin* and *amax* for the reaction to occur (where *ID2* is the central atom). Angles must be specified in degrees. This constraint can be used to enforce a certain orientation between reacting molecules. -The constraint of type 'dihedral' has the following syntax: +The constraint of type "dihedral" has the following syntax: .. parsed-literal:: dihedral *ID1* *ID2* *ID3* *ID4* *amin* *amax* *amin2* *amax2* -where 'dihedral' is the required keyword, and *ID1*, *ID2*, *ID3* +where "dihedral" is the required keyword, and *ID1*, *ID2*, *ID3* and *ID4* are pre-reaction atom IDs (or molecule-fragment IDs, see -below). Dihedral angles are calculated in the interval (-180,180]. +below). Dihedral angles are calculated in the interval :math:`(-180^\circ,180^\circ]`. Refer to the :doc:`dihedral style ` documentation for further details on convention. If *amin* is less than *amax*, these four atoms must form a dihedral angle greater than *amin* **and** less @@ -447,7 +461,7 @@ than *amax* for the reaction to occur. If *amin* is greater than *amax*, these four atoms must form a dihedral angle greater than *amin* **or** less than *amax* for the reaction to occur. Angles must be specified in degrees. Optionally, a second range of permissible -angles *amin2*-*amax2* can be specified. +angles *amin2* to *amax2* can be specified. For the 'distance', 'angle', and 'dihedral' constraints (explained above), atom IDs can be replaced by pre-reaction molecule-fragment @@ -457,11 +471,11 @@ fragment. The molecule fragment must have been defined in the :doc:`molecule ` command for the pre-reaction template. The constraint of type 'arrhenius' imposes an additional reaction -probability according to the temperature-dependent Arrhenius equation: +probability according to the modified Arrhenius equation, .. math:: - k = AT^{n}e^{\frac{-E_{a}}{k_{B}T}} + k = AT^{n}e^{-E_{a}/k_{B}T}. The Arrhenius constraint has the following syntax: @@ -469,11 +483,11 @@ The Arrhenius constraint has the following syntax: arrhenius *A* *n* *E_a* *seed* -where 'arrhenius' is the required keyword, *A* is the pre-exponential +where "arrhenius" is the required keyword, *A* is the pre-exponential factor, *n* is the exponent of the temperature dependence, :math:`E_a` is the activation energy (:doc:`units ` of energy), and *seed* is a random number seed. The temperature is defined as the instantaneous -temperature averaged over all atoms in the reaction site, and is +temperature averaged over all atoms in the reaction site and is calculated in the same manner as for example :doc:`compute temp/chunk `. Currently, there are no options for additional temperature averaging or velocity-biased @@ -487,7 +501,7 @@ The constraint of type 'rmsd' has the following syntax: rmsd *RMSDmax* *molfragment* -where 'rmsd' is the required keyword, and *RMSDmax* is the maximum +where "rmsd" is the required keyword, and *RMSDmax* is the maximum root-mean-square deviation between atom positions of the pre-reaction template and the local reaction site (distance units), after optimal translation and rotation of the pre-reaction template. Optionally, the @@ -500,26 +514,26 @@ example, the molecule fragment could consist of only the backbone atoms of a polymer chain. This constraint can be used to enforce a specific relative position and orientation between reacting molecules. -The constraint of type 'custom' has the following syntax: +The constraint of type "custom" has the following syntax: .. parsed-literal:: custom *varstring* -where 'custom' is the required keyword, and *varstring* is a +where "custom" is the required keyword, and *varstring* is a variable expression. The expression must be a valid equal-style variable formula that can be read by the :doc:`variable ` command, after any special reaction functions are evaluated. If the resulting expression is zero, the reaction is prevented from occurring; otherwise, it is permitted to occur. There are two special reaction -functions available, 'rxnsum' and 'rxnave'. These functions operate +functions available, "rxnsum" and "rxnave". These functions operate over the atoms in a given reaction site, and have one mandatory argument and one optional argument. The mandatory argument is the identifier for an atom-style variable. The second, optional argument is the name of a molecule fragment in the pre-reaction template, and can be used to operate over a subset of atoms in the reaction site. -The 'rxnsum' function sums the atom-style variable over the reaction -site, while the 'rxnave' returns the average value. For example, a +The "rxnsum" function sums the atom-style variable over the reaction +site, while the "rxnave" returns the average value. For example, a constraint on the total potential energy of atoms involved in the reaction can be imposed as follows: @@ -535,8 +549,8 @@ reaction can be imposed as follows: The above example prevents the reaction from occurring unless the total potential energy of the reaction site is above 100. The variable expression can be interpreted as the probability of the reaction -occurring by using an inequality and the 'random(x,y,z)' function -available as an equal-style variable input, similar to the 'arrhenius' +occurring by using an inequality and the :doc:`random(x,y,z) ` +function available for equal-style variables, similar to the 'arrhenius' constraint above. By default, all constraints must be satisfied for the reaction to @@ -561,40 +575,42 @@ within LAMMPS that store bond topology are updated to reflect the post-reacted molecule template. All force fields with fixed bonds, angles, dihedrals or impropers are supported. -A few capabilities to note: 1) You may specify as many *react* -arguments as desired. For example, you could break down a complicated -reaction mechanism into several reaction steps, each defined by its -own *react* argument. 2) While typically a bond is formed or removed -between the initiator atoms specified in the pre-reacted molecule -template, this is not required. 3) By reversing the order of the pre- -and post- reacted molecule templates in another *react* argument, you -can allow for the possibility of one or more reverse reactions. +A few capabilities to note: + + (1) You may specify as many *react* arguments as desired. For example, you + could break down a complicated reaction mechanism into several reaction + steps, each defined by its own *react* argument. + (2) While typically a bond is formed or removed between the initiator atoms + specified in the pre-reacted molecule template, this is not required. + (3) By reversing the order of the pre- and post-reacted molecule templates in + another *react* argument, you can allow for the possibility of one or + more reverse reactions. The optional keywords deal with the probability of a given reaction occurring as well as the stable equilibration of each reaction site as -it occurs: +it occurs. The *prob* keyword can affect whether or not an eligible reaction actually occurs. The fraction setting must be a value between 0.0 and 1.0, and can be specified with an equal-style :doc:`variable `. A uniform random number between 0.0 and 1.0 is generated and the eligible reaction only occurs if the random number is less than the -fraction. Up to N reactions are permitted to occur, as optionally +fraction. Up to :math:`N` reactions are permitted to occur, as optionally specified by the *max_rxn* keyword. The *stabilize_steps* keyword allows for the specification of how many -timesteps a reaction site is stabilized before being returned to the +time steps a reaction site is stabilized before being returned to the overall system thermostat. In order to produce the most physical -behavior, this 'reaction site equilibration time' should be tuned to +behavior, this "reaction site equilibration time" should be tuned to be as small as possible while retaining stability for a given system or reaction step. After a limited number of case studies, this number -has been set to a default of 60 timesteps. Ideally, it should be +has been set to a default of 60 time steps. Ideally, it should be individually tuned for each fix reaction step. Note that in some situations, decreasing rather than increasing this parameter will result in an increase in stability. The *custom_charges* keyword can be used to specify which atoms' -atomic charges are updated. When the value is set to 'no', all atomic +atomic charges are updated. When the value is set to *no*\ , all atomic charges are updated to those specified by the post-reaction template (default). Otherwise, the value should be the name of a molecule fragment defined in the pre-reaction molecule template. In this case, @@ -602,10 +618,10 @@ only the atomic charges of atoms in the molecule fragment are updated. The *molecule* keyword can be used to force the reaction to be intermolecular, intramolecular or either. When the value is set to -'off', molecule IDs are not considered when searching for reactions -(default). When the value is set to 'inter', the initiator atoms must +*off*\ , molecule IDs are not considered when searching for reactions +(default). When the value is set to *inter*\ , the initiator atoms must have different molecule IDs in order to be considered for the -reaction. When the value is set to 'intra', only initiator atoms with +reaction. When the value is set to *intra*\ , only initiator atoms with the same molecule ID are considered for the reaction. A few other considerations: @@ -627,15 +643,15 @@ all currently-reacting atoms: This command must be added after the fix bond/react command, and will apply to all reactions. -Computationally, each timestep this fix operates, it loops over +Computationally, each time step this fix is invoked, it loops over neighbor lists (for bond-forming reactions) and computes distances between pairs of atoms in the list. It also communicates between neighboring processors to coordinate which bonds are created and/or -removed. All of these operations increase the cost of a timestep. Thus +removed. All of these operations increase the cost of a time step. Thus, you should be cautious about invoking this fix too frequently. -You can dump out snapshots of the current bond topology via the dump -local command. +You can dump out snapshots of the current bond topology via the +:doc:`dump local ` command. ---------- @@ -649,20 +665,20 @@ allow for smooth restarts. None of the :doc:`fix_modify ` options are relevant to this fix. This fix computes one statistic for each *react* argument that it -stores in a global vector, of length 'number of react arguments', that +stores in a global vector, of length (number of react arguments), that can be accessed by various :doc:`output commands `. The vector values calculated by this fix are "intensive". -These is 1 quantity for each react argument: +There is one quantity in the global vector for each *react* argument: -* (1) cumulative # of reactions occurred + (1) cumulative number of reactions that occurred 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 `. -When fix bond/react is 'unfixed', all internally-created groups are -deleted. Therefore, fix bond/react can only be unfixed after unfixing -all other fixes that use any group created by fix bond/react. +When fix bond/react is ":doc:`unfixed `", all internally-created +groups are deleted. Therefore, fix bond/react can only be unfixed after +unfixing all other fixes that use any group created by fix bond/react. Restrictions """""""""""" @@ -683,7 +699,7 @@ Default """"""" The option defaults are stabilization = no, prob = 1.0, stabilize_steps = 60, -reset_mol_ids = yes, custom_charges = no, molecule = off, modify_create = no +reset_mol_ids = yes, custom_charges = no, molecule = off, modify_create = *fit all* ---------- diff --git a/doc/src/fix_brownian.rst b/doc/src/fix_brownian.rst index fe57ecc8e0..cf3f773550 100644 --- a/doc/src/fix_brownian.rst +++ b/doc/src/fix_brownian.rst @@ -14,7 +14,7 @@ fix brownian/asphere command Syntax """""" -.. parsed-literal:: +.. code-block:: LAMMPS fix ID group-ID style_name temp seed keyword args @@ -27,23 +27,23 @@ Syntax .. parsed-literal:: - *rng* value = *uniform* or *gaussian* or *none* - *uniform* = use uniform random number generator - *gaussian* = use gaussian random number generator - *none* = turn off noise - *dipole* value = *mux* and *muy* and *muz* for *brownian/asphere* - *mux*, *muy*, and *muz* = update orientation of dipole having direction (*mux*,*muy*,*muz*) in body frame of rigid body - *gamma_r_eigen* values = *gr1* and *gr2* and *gr3* for *brownian/asphere* - *gr1*, *gr2*, and *gr3* = diagonal entries of body frame rotational friction tensor - *gamma_r* values = *gr* for *brownian/sphere* - *gr* = magnitude of the (isotropic) rotational friction tensor - *gamma_t_eigen* values = *gt1* and *gt2* and *gt3* for *brownian/asphere* - *gt1*, *gt2*, and *gt3* = diagonal entries of body frame translational friction tensor - *gamma_t* values = *gt* for *brownian* and *brownian/sphere* + *rng* value = *uniform* or *gaussian* or *none* + *uniform* = use uniform random number generator + *gaussian* = use gaussian random number generator + *none* = turn off noise + *dipole* value = *mux* and *muy* and *muz* for *brownian/asphere* + *mux*, *muy*, and *muz* = update orientation of dipole having direction (*mux*,*muy*,*muz*) in body frame of rigid body + *gamma_r_eigen* values = *gr1* and *gr2* and *gr3* for *brownian/asphere* + *gr1*, *gr2*, and *gr3* = diagonal entries of body frame rotational friction tensor + *gamma_r* values = *gr* for *brownian/sphere* + *gr* = magnitude of the (isotropic) rotational friction tensor + *gamma_t_eigen* values = *gt1* and *gt2* and *gt3* for *brownian/asphere* + *gt1*, *gt2*, and *gt3* = diagonal entries of body frame translational friction tensor + *gamma_t* values = *gt* for *brownian* and *brownian/sphere* *gt* = magnitude of the (isotropic) translational friction tensor - *rotation_temp* values = *T* for *brownian/sphere* and *brownian/asphere* + *rotation_temp* values = *T* for *brownian/sphere* and *brownian/asphere* *T* = rotation temperature, which can be different then *temp* when out of equilibrium - *planar_rotation* values = None (constrains rotational diffusion to be in xy plane if in 3D) + *planar_rotation* values = none (constrains rotational diffusion to be in xy plane if in 3D) Examples """""""" @@ -71,9 +71,10 @@ positions is .. math:: - d\mathbf{r} = \mathbf{\gamma}_t^{-1}\mathbf{F}dt+\sqrt{2k_BT}\mathbf{\gamma}_t^{-1/2}d\mathbf{W}_t, + d\mathbf{r} = \boldsymbol{\gamma}_t^{-1}\mathbf{F}dt + + \sqrt{2k_B T}\boldsymbol{\gamma}_t^{-1/2}d\mathbf{W}_t, -in the lab-frame (i.e. :math:`\mathbf{\gamma}_t` is not diagonal, but +in the lab-frame (i.e., :math:`\boldsymbol{\gamma}_t` is not diagonal, but only depends on orientation and so the noise is still additive). The rotational motion for the spherical and ellipsoidal particles is not @@ -92,15 +93,15 @@ updated. This style therefore requires the hybrid atom style .. math:: - \mathbf{\mu}(t+dt) = \frac{\mathbf{\mu}(t) + \mathbf{\omega} \times \mathbf{\mu}dt - }{|\mathbf{\mu}(t) + \mathbf{\omega} \times \mathbf{\mu}|} + \boldsymbol{\mu}(t+dt) = \frac{\boldsymbol{\mu}(t) + \boldsymbol{\omega} \times \boldsymbol{\mu}dt + }{|\boldsymbol{\mu}(t) + \boldsymbol{\omega} \times \boldsymbol{\mu}|} which correctly reproduces a Boltzmann distribution of orientations and rotational diffusion moments (see :ref:`(Ilie) `) when .. math:: - \mathbf{\omega} = \frac{\mathbf{T}}{\gamma_r} + \sqrt{\frac{2 k_B T_{rot}}{\gamma_r}\frac{d\mathbf{W}}{dt}}, + \boldsymbol{\omega} = \frac{\mathbf{T}}{\gamma_r} + \sqrt{\frac{2 k_B T_{rot}}{\gamma_r}\frac{d\mathbf{W}}{dt}}, with :math:`d\mathbf{W}` being a random number with zero mean and variance :math:`dt` and :math:`T_{rot}` is *rotation_temp*. @@ -114,19 +115,20 @@ the quaternion .. math:: - \mathbf{q}(t+dt) = \frac{\mathbf{q}(t) + d\mathbf{q}}{|\mathbf{q}(t) + d\mathbf{q}|} + \mathbf{q}(t+dt) = \frac{\mathbf{q}(t) + d\mathbf{q}}{\lVert\mathbf{q}(t) + d\mathbf{q}\rVert} which correctly reproduces a Boltzmann distribution of orientations and rotational -diffusion moments (see :ref:`(Ilie) `) when the quaternion step given by +diffusion moments [see :ref:`(Ilie) `] when the quaternion step is given by .. math:: - d\mathbf{q} = \mathbf{\Psi}\mathbf{\omega}dt + d\mathbf{q} = \boldsymbol{\Psi}\boldsymbol{\omega}dt -where :math:`\mathbf{Psi}` has rows :math:`(-q_1,-q_2,-q_3)`, :math:`(q_0,-q_3,q_2)`, -:math:`(q_3,q_0,-q_1)`, and :math:`(-q_2,q_1,q_0)`. :math:`\mathbf{\omega}` is -evaluated in the body frame of reference where the friction tensor is diagonal. -See :ref:`(Delong) ` for more details of a similar algorithm. +where :math:`\boldsymbol{\Psi}` has rows :math:`(-q_1,-q_2,-q_3)`, +:math:`(q_0,-q_3,q_2)`, :math:`(q_3,q_0,-q_1)`, and :math:`(-q_2,q_1,q_0)`. +:math:`\boldsymbol{\omega}` is evaluated in the body frame of reference where the +friction tensor is diagonal. See :ref:`(Delong) ` for more details of +a similar algorithm. --------- @@ -136,11 +138,11 @@ See :ref:`(Delong) ` for more details of a similar algorithm. This integrator does not by default assume a relationship between the rotational and translational friction tensors, though such a relationship should exist in the case of no-slip boundary conditions - between the particles and the surrounding (implicit) solvent. E.g. in - the case of spherical particles, the condition + between the particles and the surrounding (implicit) solvent. For example, + in the case of spherical particles, the condition :math:`\gamma_t=3\gamma_r/\sigma^2` must be explicitly accounted for by setting *gamma_t* to 3x and *gamma_r* to x (where :math:`\sigma` - is the spherical diameter). A similar (though more complex) + is the sphere's diameter). A similar (though more complex) relationship holds for ellipsoids and rod-like particles. The translational diffusion and rotational diffusion are given by *temp/gamma_t* and *rotation_temp/gamma_r*. @@ -150,7 +152,7 @@ See :ref:`(Delong) ` for more details of a similar algorithm. .. note:: Temperature computation using the :doc:`compute temp ` - will not correctly compute temperature of these overdamped dynamics + will not correctly compute the temperature of these overdamped dynamics since we are explicitly neglecting inertial effects. Furthermore, this time integrator does not add the stochastic terms or viscous terms to the force and/or torques. Rather, they are just added in to @@ -165,7 +167,7 @@ is generated from a uniform distribution (see of noise generation as used in :doc:`fix_langevin `. If the *rng* keyword is used with the *gaussian* value, then the noise -is generated from a gaussian distribution. Typically this added +is generated from a Gaussian distribution. Typically this added complexity is unnecessary, and one should be fine using the *uniform* value for reasons argued in :ref:`(Dunweg) `. @@ -184,8 +186,8 @@ The *gamma_r_eigen*, and *gamma_t_eigen* keywords are the eigenvalues of the rotational and viscous damping tensors (having the same units as their isotropic counterparts). Required for (and only compatible with) *brownian/asphere*. For a 2D system, the first two values of -*gamma_r_eigen* must be inf (only rotation in xy plane), and the third -value of *gamma_t_eigen* must be inf (only diffusion in xy plane). +*gamma_r_eigen* must be *inf* (only rotation in *x*\ --\ *y* plane), and the third +value of *gamma_t_eigen* must be *inf* (only diffusion in the *x*\ --\ *y* plane). If the *dipole* keyword is used, then the dipole moments of the particles are updated as described above. Only compatible with *brownian/asphere* @@ -196,13 +198,13 @@ will be occur at this prescribed temperature instead of *temp*. Only compatible with *brownian/sphere* and *brownian/asphere*. If the *planar_rotation* keyword is used, then rotation is constrained -to the xy plane in a 3D simulation. Only compatible with +to the *x*\ -- *y* plane in a 3D simulation. Only compatible with *brownian/sphere* and *brownian/asphere* in 3D. ---------- .. note:: - For style *brownian/asphere*, the components *gamma_t_eigen* =(x,x,x) and + For style *brownian/asphere*, the components *gamma_t_eigen* = (x,x,x) and *gamma_r_eigen* = (y,y,y), the dynamics will replicate those of the *brownian/sphere* style with *gamma_t* = x and *gamma_r* = y. @@ -215,7 +217,6 @@ No information about this fix is written to :doc:`binary restart files `. No global 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 not invoked during :doc:`energy minimization `. diff --git a/doc/src/fix_colvars.rst b/doc/src/fix_colvars.rst index 21b235cb6b..ec7b33ce51 100644 --- a/doc/src/fix_colvars.rst +++ b/doc/src/fix_colvars.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`fix ` command * colvars = style name of this fix command * configfile = the configuration file for the colvars module -* keyword = *input* or *output* or *seed* or *tstat* +* keyword = *input* or *output* or *seed* or *unwrap* or *tstat* .. parsed-literal:: diff --git a/doc/src/fix_deposit.rst b/doc/src/fix_deposit.rst index ad3c37b24c..cf28509f5e 100644 --- a/doc/src/fix_deposit.rst +++ b/doc/src/fix_deposit.rst @@ -17,7 +17,7 @@ Syntax * M = insert a single atom or molecule every M steps * seed = random # seed (positive integer) * one or more keyword/value pairs may be appended to args -* keyword = *region* or *id* or *global* or *local* or *near* or *gaussian* or *attempt* or *rate* or *vx* or *vy* or *vz* or *mol* or *rigid* or *shake* or *units* +* keyword = *region* or *id* or *global* or *local* or *near* or *gaussian* or *attempt* or *rate* or *vx* or *vy* or *vz* or *target* or *mol* or *molfrac* or *rigid* or *shake* or *orient* or *units* .. parsed-literal:: diff --git a/doc/src/fix_external.rst b/doc/src/fix_external.rst index d251eb65e9..3b46e81c2c 100644 --- a/doc/src/fix_external.rst +++ b/doc/src/fix_external.rst @@ -78,7 +78,7 @@ example of how this is done. This sample application performs classical MD using quantum forces computed by a density functional code `Quest `_. -.. _quest: http://dft.sandia.gov/Quest +.. _quest: https://dft.sandia.gov/Quest ---------- diff --git a/doc/src/fix_gle.rst b/doc/src/fix_gle.rst index a42fddf7f5..03add9d354 100644 --- a/doc/src/fix_gle.rst +++ b/doc/src/fix_gle.rst @@ -159,7 +159,7 @@ Related commands .. _GLE4MD: -**(GLE4MD)** `http://gle4md.org/ `_ +**(GLE4MD)** `https://gle4md.org/ `_ .. _Ceriotti2: diff --git a/doc/src/fix_imd.rst b/doc/src/fix_imd.rst index 004bc0b614..cb1831d174 100644 --- a/doc/src/fix_imd.rst +++ b/doc/src/fix_imd.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`fix ` command * imd = style name of this fix command * port = port number on which the fix listens for an IMD client -* keyword = *unwrap* or *fscale* or *trate* +* keyword = *unwrap* or *fscale* or *trate* or *nowait* .. parsed-literal:: @@ -51,16 +51,11 @@ from the main execution thread and potentially lower the inferred latencies for slow communication links. This feature has only been tested under linux. -There are example scripts for using this package with LAMMPS in -examples/PACKAGES/imd. Additional examples and a driver for use with the -Novint Falcon game controller as haptic device can be found at: -http://sites.google.com/site/akohlmey/software/vrpn-icms. - -The source code for this fix includes code developed by the -Theoretical and Computational Biophysics Group in the Beckman -Institute for Advanced Science and Technology at the University of -Illinois at Urbana-Champaign. We thank them for providing a software -interface that allows codes like LAMMPS to hook to `VMD `_. +The source code for this fix includes code developed by the Theoretical +and Computational Biophysics Group in the Beckman Institute for Advanced +Science and Technology at the University of Illinois at +Urbana-Champaign. We thank them for providing a software interface that +allows codes like LAMMPS to hook to `VMD `_. Upon initialization of the fix, it will open a communication port on the node with MPI task 0 and wait for an incoming connection. As soon @@ -93,8 +88,8 @@ to send "unwrapped" coordinates to the IMD client that undo the wrapping back of coordinates into the principle unit cell, as done by default in LAMMPS. The *fscale* keyword allows to apply a scaling factor to forces transmitted by the IMD client. The IMD protocols -stipulates that forces are transferred in kcal/mol/angstrom under the -assumption that coordinates are given in angstrom. For LAMMPS runs +stipulates that forces are transferred in kcal/mol/Angstrom under the +assumption that coordinates are given in Angstrom. For LAMMPS runs with different units or as a measure to tweak the forces generated by the manipulation of the IMD client, this option allows to make adjustments. @@ -117,40 +112,40 @@ VMD are the following: In the Mouse menu of the VMD Main window, select "Mouse -> Force -> Atom". You may alternately select "Residue", or "Fragment" to apply forces to whole residues or fragments. Your mouse can now be used to -apply forces to your simulation. Click on an atom, residue, or -fragment and drag to apply a force. Click quickly without moving the -mouse to turn the force off. You can also use a variety of 3D position -trackers to apply forces to your simulation. Game controllers or haptic -devices with force-feedback such as the Novint Falcon or Sensable -PHANTOM allow you to feel the resistance due to inertia or interactions -with neighbors that the atoms experience you are trying to move, as if -they were real objects. See the `VMD IMD Homepage `_ and the -`VRPN-ICMS Homepage `_ for more details. +apply forces to your simulation. Click on an atom, residue, or fragment +and drag to apply a force. Click quickly without moving the mouse to +turn the force off. You can also use a variety of 3D position trackers +to apply forces to your simulation. Game controllers or haptic devices +with force-feedback such as the Novint Falcon or Sensable PHANTOM allow +you to feel the resistance due to inertia or interactions with neighbors +that the atoms experience you are trying to move, as if they were real +objects. See the `VMD IMD Homepage `_ for more details. If IMD control messages are received, a line of text describing the message and its effect will be printed to the LAMMPS output screen, if screen output is active. -.. _VMD: http://www.ks.uiuc.edu/Research/vmd +.. _VMD: https://www.ks.uiuc.edu/Research/vmd -.. _imdvmd: http://www.ks.uiuc.edu/Research/vmd/imd/ - -.. _vrpnicms: http://sites.google.com/site/akohlmey/software/vrpn-icms +.. _imdvmd: https://www.ks.uiuc.edu/Research/vmd/imd/ Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -No information about this fix is written to :doc:`binary restart files `. None of the :doc:`fix_modify ` options -are relevant to this fix. 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 not invoked during :doc:`energy minimization `. +No information about this fix is written to :doc:`binary restart files +`. None of the :doc:`fix_modify ` options are +relevant to this fix. 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 not +invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +This fix is part of the MISC package. It is only enabled if LAMMPS was +built with that package. See the :doc:`Build package ` +page for more info. When used in combination with VMD, a topology or coordinate file has to be loaded, which matches (in number and ordering of atoms) the diff --git a/doc/src/fix_ipi.rst b/doc/src/fix_ipi.rst index 6ddd6976a2..6a6ff9aa87 100644 --- a/doc/src/fix_ipi.rst +++ b/doc/src/fix_ipi.rst @@ -111,4 +111,4 @@ Related commands .. _ipihome: **(IPI)** -`http://epfl-cosmo.github.io/gle4md/index.html?page=ipi `_ +`https://ipi-code.org `_ diff --git a/doc/src/fix_langevin.rst b/doc/src/fix_langevin.rst index 50c1489d7c..396df2b926 100644 --- a/doc/src/fix_langevin.rst +++ b/doc/src/fix_langevin.rst @@ -20,7 +20,7 @@ Syntax * damp = damping parameter (time units) * seed = random number seed to use for white noise (positive integer) * zero or more keyword/value pairs may be appended -* keyword = *angmom* or *omega* or *scale* or *tally* or *zero* +* keyword = *angmom* or *gjf* or *omega* or *scale* or *tally* or *zero* .. parsed-literal:: diff --git a/doc/src/fix_langevin_spin.rst b/doc/src/fix_langevin_spin.rst index 0926881eef..0ca291a732 100644 --- a/doc/src/fix_langevin_spin.rst +++ b/doc/src/fix_langevin_spin.rst @@ -40,7 +40,7 @@ the following stochastic differential equation: \times\left( \vec{\omega}_{i} \times\vec{s}_{i} \right) \right) with :math:`\lambda` the transverse damping, and :math:`\eta` a random vector. -This equation is referred to as the stochastic Landau-Lifshitz-Gilbert (sLLG) +This equation is referred to as the stochastic Landau-Lifshitz (sLL) equation. The components of :math:`\eta` are drawn from a Gaussian probability @@ -49,7 +49,7 @@ the external thermostat T (in K in metal units). More details about this implementation are reported in :ref:`(Tranchida) `. -Note: due to the form of the sLLG equation, this fix has to be defined just +Note: due to the form of the sLL equation, this fix has to be defined just before the nve/spin fix (and after all other magnetic fixes). As an example: diff --git a/doc/src/fix_latte.rst b/doc/src/fix_latte.rst index 202f8cf374..de3ac5adde 100644 --- a/doc/src/fix_latte.rst +++ b/doc/src/fix_latte.rst @@ -81,6 +81,8 @@ The *coulomb* argument is not yet supported by fix latte (as of Sept Coulomb potential as an alternative to LATTE performing the calculation. +.. versionadded:: 15Sep2022 + The *exclude* argument allows this fix to work in tandem with another fix which may decide to delete one or more atoms of molecules. The specified fixID is the ID of the other fix. diff --git a/doc/src/fix_lb_fluid.rst b/doc/src/fix_lb_fluid.rst index 0191f14b1c..5f20bb10b1 100644 --- a/doc/src/fix_lb_fluid.rst +++ b/doc/src/fix_lb_fluid.rst @@ -16,7 +16,7 @@ Syntax * viscosity = the fluid viscosity (units of mass/(time\*length)). * density = the fluid density. * zero or more keyword/value pairs may be appended -* keyword = *dx* or *dm* or *noise* or *stencil* or *read_restart* or *write_restart* or *zwall_velocity* or *pressurebcx* or *bodyforce* or *D3Q19* or *dumpxdmf* or *dof* or *scaleGamma* or *a0* or *npits* or *wp* or *sw* +* keyword = *dx* or *dm* or *noise* or *stencil* or *read_restart* or *write_restart* or *zwall_velocity* or *pressurebcx* or *bodyforce* or *D3Q19* or *dumpxdmf* or *linearInit* or *dof* or *scaleGamma* or *a0* or *npits* or *wp* or *sw* .. parsed-literal:: @@ -36,6 +36,7 @@ Syntax N = output the force and torque every N timesteps file = output file name timeI = 1 (use simulation time to index xdmf file), 0 (use output frame number to index xdmf file) + *linearInit* values = none = initialize density and velocity using linear interpolation (default is uniform density, no velocities) *dof* values = dof = specify the number of degrees of freedom for temperature calculation *scaleGamma* values = type gammaFactor type = atom type (1-N) diff --git a/doc/src/fix_mdi_qm.rst b/doc/src/fix_mdi_qm.rst index fd0c6f13af..667dea710a 100644 --- a/doc/src/fix_mdi_qm.rst +++ b/doc/src/fix_mdi_qm.rst @@ -43,6 +43,8 @@ Examples Description """"""""""" +.. versionadded:: 3Aug2022 + This command enables LAMMPS to act as a client with another server code that will compute the total energy, per-atom forces, and total virial for atom conformations and simulation box size/shapes that diff --git a/doc/src/fix_modify.rst b/doc/src/fix_modify.rst index e0cf3a34c7..f4c5be6b12 100644 --- a/doc/src/fix_modify.rst +++ b/doc/src/fix_modify.rst @@ -12,7 +12,7 @@ Syntax * fix-ID = ID of the fix to modify * one or more keyword/value pairs may be appended -* keyword = *bodyforces* or *colname* or *dynamic/dof* or *energy* or *press* or *respa* or *temp* or *virial* +* keyword = *bodyforces* or *colname* or *dynamic/dof* or *energy* or *press* or *respa* or *temp* or *virial* .. parsed-literal:: diff --git a/doc/src/fix_nh_uef.rst b/doc/src/fix_nh_uef.rst index 64d406ee64..83cf88b11f 100644 --- a/doc/src/fix_nh_uef.rst +++ b/doc/src/fix_nh_uef.rst @@ -210,7 +210,8 @@ use :doc:`change_box ` before invoking the fix. .. note:: - When resuming from restart files, you may need to use :doc:`box tilt large ` since lammps has internal criteria from lattice + When resuming from restart files, you may need to use :doc:`box tilt + large ` since LAMMPS has internal criteria from lattice reduction that are not the same as the criteria in the numerical lattice reduction algorithm. diff --git a/doc/src/fix_npt_cauchy.rst b/doc/src/fix_npt_cauchy.rst index 6ff3dffba3..6bff29f9dd 100644 --- a/doc/src/fix_npt_cauchy.rst +++ b/doc/src/fix_npt_cauchy.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`fix ` command * style_name = *npt/cauchy* * one or more keyword/value pairs may be appended -* keyword = *temp* or *iso* or *aniso* or *tri* or *x* or *y* or *z* or *xy* or *yz* or *xz* or *couple* or *tchain* or *pchain* or *mtk* or *tloop* or *ploop* or *nreset* or *drag* or *dilate* or *scalexy* or *scaleyz* or *scalexz* or *flip* or *fixedpoint* +* keyword = *temp* or *iso* or *aniso* or *tri* or *x* or *y* or *z* or *xy* or *yz* or *xz* or *couple* or *tchain* or *pchain* or *mtk* or *tloop* or *ploop* or *nreset* or *drag* or *dilate* or *scalexy* or *scaleyz* or *scalexz* or *flip* or *alpha* or *continue* or *fixedpoint* .. parsed-literal:: diff --git a/doc/src/fix_numdiff_virial.rst b/doc/src/fix_numdiff_virial.rst index 647a0e592a..f909d41111 100644 --- a/doc/src/fix_numdiff_virial.rst +++ b/doc/src/fix_numdiff_virial.rst @@ -25,6 +25,8 @@ Examples Description """"""""""" +.. versionadded:: 17Feb2022 + Calculate the virial stress tensor through a finite difference calculation of energy versus strain. These values can be compared to the analytic virial tensor computed by pair styles, bond styles, etc. This can be useful for diff --git a/doc/src/fix_nve_manifold_rattle.rst b/doc/src/fix_nve_manifold_rattle.rst index a9bf07de60..63632ebac0 100644 --- a/doc/src/fix_nve_manifold_rattle.rst +++ b/doc/src/fix_nve_manifold_rattle.rst @@ -108,4 +108,4 @@ every = 0, tchain = 3 .. _Paquay2: **(Paquay)** Paquay and Kusters, Biophys. J., 110, 6, (2016). -preprint available at `arXiv:1411.3019 `_. +preprint available at `arXiv:1411.3019 `_. diff --git a/doc/src/fix_nvt_manifold_rattle.rst b/doc/src/fix_nvt_manifold_rattle.rst index fe889bda79..91a5f28649 100644 --- a/doc/src/fix_nvt_manifold_rattle.rst +++ b/doc/src/fix_nvt_manifold_rattle.rst @@ -82,4 +82,4 @@ Related commands .. _Paquay3: **(Paquay)** Paquay and Kusters, Biophys. J., 110, 6, (2016). -preprint available at `arXiv:1411.3019 `_. +preprint available at `arXiv:1411.3019 `_. diff --git a/doc/src/fix_phonon.rst b/doc/src/fix_phonon.rst index d1b19173ce..527498bb21 100644 --- a/doc/src/fix_phonon.rst +++ b/doc/src/fix_phonon.rst @@ -134,7 +134,7 @@ for other systems, *nasr* = 10 is typically sufficient. The *map_file* contains the mapping information between the lattice indices and the atom IDs, which tells the code which atom sits at which lattice point; the lattice indices start from 0. An auxiliary -code, `latgen `_, can be employed to +code, `latgen `_, can be employed to generate the compatible map file for various crystals. In case one simulates a non-periodic system, where the whole simulation @@ -143,7 +143,7 @@ that the mapping info will be generated internally and a file is not needed. In this case, the dynamical matrix at only the gamma-point will/can be evaluated. Please keep in mind that fix-phonon is designed for cyrstals, it will be inefficient and even degrade the performance -of lammps in case the unit cell is too large. +of LAMMPS in case the unit cell is too large. The calculated dynamical matrix elements are written out in :doc:`energy/distance\^2/mass ` units. The coordinates for *q* diff --git a/doc/src/fix_polarize.rst b/doc/src/fix_polarize.rst index 6ed3b36c55..6a997aa7ea 100644 --- a/doc/src/fix_polarize.rst +++ b/doc/src/fix_polarize.rst @@ -16,11 +16,11 @@ Syntax .. parsed-literal:: - fix ID group-ID style nevery tolerance ... + fix ID group-ID style nevery tolerance * ID, group-ID are documented in :doc:`fix ` command * style = *polarize/bem/gmres* or *polarize/bem/icc* or *polarize/functional* -* Nevery = this fixed is invoked every this many timesteps +* nevery = this fixed is invoked every this many timesteps * tolerance = the relative tolerance for the iterative solver to stop @@ -46,44 +46,53 @@ Description These fixes compute induced charges at the interface between two impermeable media with different dielectric constants. The interfaces -need to be discretized into vertices, each representing a boundary element. -The vertices are treated as if they were regular atoms or particles. -:doc:`atom_style dielectric ` should be used since it defines -the additional properties of each interface particle such as -interface normal vectors, element areas, and local dielectric mismatch. -These fixes also require the use of :doc:`pair_style ` and -:doc:`kspace_style ` with the *dielectric* suffix. -At every time step, given a configuration of the physical charges in the system -(such as atoms and charged particles) these fixes compute and update -the charge of the interface particles. The interfaces are allowed to move -during the simulation with appropriate time integrators (for example, -with :doc:`fix_rigid `). +need to be discretized into vertices, each representing a boundary +element. The vertices are treated as if they were regular atoms or +particles. :doc:`atom_style dielectric ` should be used +since it defines the additional properties of each interface particle +such as interface normal vectors, element areas, and local dielectric +mismatch. These fixes also require the use of :doc:`pair_style +` and :doc:`kspace_style ` with the +*dielectric* suffix. At every time step, given a configuration of the +physical charges in the system (such as atoms and charged particles) +these fixes compute and update the charge of the interface +particles. The interfaces are allowed to move during the simulation if +the appropriate time integrators are also set (for example, with +:doc:`fix_rigid `). -Consider an interface between two media: one with dielectric constant -of 78 (water), the other of 4 (silica). The interface is discretized -into 2000 boundary elements, each represented by an interface particle. Suppose that -each interface particle has a normal unit vector pointing from the silica medium to water. -The dielectric difference along the normal vector is then 78 - 4 = 74, -the mean dielectric value is (78 + 4) / 2 = 41. Each boundary element -also has its area and the local mean curvature (which is used by these fixes -for computing a correction term in the local electric field). -To model charged interfaces, the interface particle will have a non-zero charge value, +Consider an interface between two media: one with dielectric constant of +78 (water), the other of 4 (silica). The interface is discretized into +2000 boundary elements, each represented by an interface +particle. Suppose that each interface particle has a normal unit vector +pointing from the silica medium to water. The dielectric difference +along the normal vector is then 78 - 4 = 74, the mean dielectric value +is (78 + 4) / 2 = 41. Each boundary element also has its area and the +local mean curvature, which is used by these fixes for computing a +correction term in the local electric field. To model charged +interfaces, the interface particle will have a non-zero charge value, coming from its area and surface charge density. -For non-interface particles such as atoms and charged particles, -the interface normal vectors, element area, and dielectric mismatch are -irrelevant. Their local dielectric value is used to rescale their actual charge -when computing the Coulombic interactions. For instance, for a cation carrying -a charge of +2 (in charge unit) in an implicit solvent with dielectric constant of 40 -would have actual charge of +2, and a local dielectric constant value of 40. -It is assumed that the particles cannot pass through the interface during the simulation -so that its local dielectric constant value does not change. +For non-interface particles such as atoms and charged particles, the +interface normal vectors, element area, and dielectric mismatch are +irrelevant and unused. Their local dielectric value is used internally +to rescale their given charge when computing the Coulombic +interactions. For instance, to simulate a cation carrying a charge of +2 +(in simulation charge units) in an implicit solvent with a dielectric +constant of 40, the cation's charge should be set to +2 and its local +dielectric constant property (defined in the :doc:`atom_style dielectric +`) should be set to 40; there is no need to manually rescale +charge. This will produce the proper force for any :doc:`pair_style +` with the dielectric suffix. It is assumed that the +particles cannot pass through the interface during the simulation +because the value of the local dielectric constant property does not +change. -There are some example scripts for using these fixes -with LAMMPS in the ``examples/PACKAGES/dielectric`` directory. The README file -therein contains specific details on the system setup. Note that the example data files -show the additional fields (columns) needed for :doc:`atom_style dielectric ` -beyond the conventional fields *id*, *mol*, *type*, *q*, *x*, *y*, and *z*. +There are some example scripts for using these fixes with LAMMPS in the +``examples/PACKAGES/dielectric`` directory. The README file therein +contains specific details on the system setup. Note that the example +data files show the additional fields (columns) needed for +:doc:`atom_style dielectric ` beyond the conventional fields +*id*, *mol*, *type*, *q*, *x*, *y*, and *z*. ---------- @@ -104,22 +113,24 @@ the interface, are computed using the equation: * :math:`\mathbf{E}(\mathbf{s})` is the electrical field at the vertex * :math:`\mathbf{n}(\mathbf{s})` is the unit normal vector at the vertex pointing from medium with :math:`\epsilon_2` to that with :math:`\epsilon_1` -Fix *polarize/bem/gmres* employs the Generalized Minimum Residual (GMRES) -as described in :ref:`(Barros) ` to solve :math:`\sigma_b`. +Fix *polarize/bem/gmres* employs the Generalized Minimum Residual +(GMRES) as described in :ref:`(Barros) ` to solve +:math:`\sigma_b`. Fix *polarize/bem/icc* employs the successive over-relaxation algorithm as described in :ref:`(Tyagi) ` to solve :math:`\sigma_b`. -The iterative solvers would terminate either when the maximum relative change -in the induced charges in consecutive iterations is below the set tolerance, -or when the number of iterations reaches *iter_max* (see below). +The iterative solvers would terminate either when the maximum relative +change in the induced charges in consecutive iterations is below the set +tolerance, or when the number of iterations reaches *iter_max* (see +below). -Fix *polarize/functional* employs the energy functional variation approach -as described in :ref:`(Jadhao) ` to solve :math:`\sigma_b`. +Fix *polarize/functional* employs the energy functional variation +approach as described in :ref:`(Jadhao) ` to solve +:math:`\sigma_b`. - -More details on the implementation of these fixes and their recommended use -are described in :ref:`(NguyenTD) `. +More details on the implementation of these fixes and their recommended +use are described in :ref:`(NguyenTD) `. Restart, fix_modify, output, run start/stop, minimize info @@ -127,35 +138,78 @@ Restart, fix_modify, output, run start/stop, minimize info No information about this fix is written to :doc:`binary restart files `. -The :doc:`fix_modify ` command provides certain options to -control the induced charge solver and the initial values of the interface elements: +The :doc:`fix_modify ` command provides the ability to modify certain +settings: .. parsed-literal:: *itr_max* arg arg = maximum number of iterations for convergence *dielectrics* ediff emean epsilon area charge - ediff = dielectric difference - emean = dielectric mean - epsilon = local dielectric value - aree = element area - charge = real interface charge + ediff = dielectric difference or NULL + emean = dielectric mean or NULL + epsilon = local dielectric value or NULL + area = element area or NULL + charge = real interface charge or NULL + *kspace* arg = yes or no + *rand* max seed + max = range of random induced charges to be generated + seed = random number seed to use when generating random charge + *mr* arg + arg = maximum number of q-vectors to use when solving (GMRES only) + *omega* arg + arg = relaxation parameter to use when iterating (ICC only) -*polarize/bem/gmres* or *polarize/bem/icc* compute a global 2-element vector -which can be accessed by various :doc:`output commands `. -The first element is the number of iterations when the solver terminates -(of which the upper bound is set by *iter_max*). The second element is the RMS error. +The *itr_max* keyword sets the max number of iterations to be used for +solving each step. + +The *dielectrics* keyword allows properties of the atoms in group +*group-ID* to be modified. Values passed to any of the arguments +(*ediff*, *emean*, *epsilon*, *area*, *charge*) will override existing +values for all atoms in the group *group-ID*. Passing NULL to any of +these arguments will preserve the existing value. Note that setting the +properties of the interface this way will change the properties of all +atoms associated with the fix (all atoms in *group-ID*), so multiple fix +and fix_modify commands would be needed to change the properties of two +different interfaces to different values (one fix and fix_modify for +each interface group). + +The *kspace* keyword turns on long range interactions. + +If the arguments of the *rand* keyword are set, then the atoms subject +to this fix will be assigned a random initial charge in a uniform +distribution from -*max*/2 to *max*/2, using random number seed *seed*. + +The *mr* keyword only applies to *style* = *polarize/bem/gmres*. It is +the maximum number of q-vectors to use when solving for the surface +charge. + +The *omega* keyword only applies when using *style* = +*polarize/bem/icc*. It is a relaxation parameter defined in +:ref:`(Tyagi) ` that should generally be set between 0 and 2. + +Note that the local dielectric constant (epsilon) can also be set +independently using the :doc:`set ` command. + +---------- + +*polarize/bem/gmres* or *polarize/bem/icc* compute a global 2-element +vector which can be accessed by various :doc:`output commands +`. The first element is the number of iterations when the +solver terminates (of which the upper bound is set by *iter_max*). The +second element is the RMS error. Restrictions """""""""""" -These fixes are part of the DIELECTRIC package. It is only enabled +These fixes are part of the DIELECTRIC package. They are only enabled if LAMMPS was built with that package, which requires that also the KSPACE package is installed. See the :doc:`Build package ` page for more info. -Note that the *polarize/bem/gmres* and *polarize/bem/icc* fixes only support -:doc:`units ` *lj*, *real*, *metal*, *si* and *nano* at the moment. +Note that the *polarize/bem/gmres* and *polarize/bem/icc* fixes only +support :doc:`units ` *lj*, *real*, *metal*, *si* and *nano* at +the moment. Related commands @@ -171,6 +225,15 @@ Default *iter_max* = 20 +*kspace* = yes + +*omega* = 0.7 (ICC only) + +*mr* = \# atoms in group *group-ID* minus 1 (GMRES only) + +No random charge initialization happens by default. + + ---------- .. _Barros: diff --git a/doc/src/fix_pour.rst b/doc/src/fix_pour.rst index 742648ac76..6ef18ea800 100644 --- a/doc/src/fix_pour.rst +++ b/doc/src/fix_pour.rst @@ -16,7 +16,7 @@ Syntax * type = atom type to assign to inserted particles (offset for molecule insertion) * seed = random # seed (positive integer) * one or more keyword/value pairs may be appended to args -* keyword = *region* or *diam* or *vol* or *rate* or *dens* or *vel* or *mol* or *rigid* or *shake* or *ignore* +* keyword = *region* or *diam* or *id* or *vol* or *rate* or *dens* or *vel* or *mol* or *molfrac* or *rigid* or *shake* or *ignore* .. parsed-literal:: diff --git a/doc/src/fix_qeq_reaxff.rst b/doc/src/fix_qeq_reaxff.rst index 906847f90a..db9015f187 100644 --- a/doc/src/fix_qeq_reaxff.rst +++ b/doc/src/fix_qeq_reaxff.rst @@ -124,7 +124,7 @@ LAMMPS was built with that package. See the :doc:`Build package 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. +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, diff --git a/doc/src/fix_qmmm.rst b/doc/src/fix_qmmm.rst index a62bd5ab1e..546635520c 100644 --- a/doc/src/fix_qmmm.rst +++ b/doc/src/fix_qmmm.rst @@ -31,7 +31,7 @@ wave DFT package. Electrostatic coupling is in preparation and the interface has been written in a manner that coupling to other QM codes should be possible without changes to LAMMPS itself. -.. _espresso: http://www.quantum-espresso.org +.. _espresso: https://www.quantum-espresso.org The interface code for this is in the lib/qmmm directory of the LAMMPS distribution and is being made available at this early stage of diff --git a/doc/src/fix_rigid.rst b/doc/src/fix_rigid.rst index 445b86466c..9a3b6e4da3 100644 --- a/doc/src/fix_rigid.rst +++ b/doc/src/fix_rigid.rst @@ -80,7 +80,7 @@ Syntax groupID1, groupID2, ... = list of N group IDs * zero or more keyword/value pairs may be appended -* keyword = *langevin* or *reinit* or *temp* or *iso* or *aniso* or *x* or *y* or *z* or *couple* or *tparam* or *pchain* or *dilate* or *force* or *torque* or *infile* +* keyword = *langevin* or *reinit* or *temp* or *iso* or *aniso* or *x* or *y* or *z* or *couple* or *tparam* or *pchain* or *dilate* or *force* or *torque* or *infile* or *gravity* .. parsed-literal:: @@ -115,6 +115,11 @@ Syntax xflag,yflag,zflag = off/on if component of center-of-mass torque is active *infile* filename filename = file with per-body values of mass, center-of-mass, moments of inertia + *gravity* values = gravity-ID + gravity-ID = ID of fix gravity command to add gravitational forces + +.. + FIXME These don't seem to be included in the source code *mol* value = template-ID template-ID = ID of molecule template specified in a separate :doc:`molecule ` command diff --git a/doc/src/fix_shake.rst b/doc/src/fix_shake.rst index f5742b8f9f..e6fbad7fdc 100644 --- a/doc/src/fix_shake.rst +++ b/doc/src/fix_shake.rst @@ -58,10 +58,13 @@ Description Apply bond and angle constraints to specified bonds and angles in the simulation by either the SHAKE or RATTLE algorithms. This typically -enables a longer timestep. The SHAKE or RATTLE algorithms, however, can -*only* be applied during molecular dynamics runs. When this fix is used -during a minimization, the constraints are *approximated* by strong -harmonic restraints. +enables a longer timestep. The SHAKE or RATTLE constraint algorithms, +however, can *only* be applied during molecular dynamics runs. + +.. versionchanged:: 15Sep2022 + +These fixes may still be used during minimization. In that case the +constraints are *approximated* by strong harmonic restraints. **SHAKE vs RATTLE:** diff --git a/doc/src/fix_viscosity.rst b/doc/src/fix_viscosity.rst index 204e435d6e..c99196e09b 100644 --- a/doc/src/fix_viscosity.rst +++ b/doc/src/fix_viscosity.rst @@ -17,7 +17,7 @@ Syntax * pdim = *x* or *y* or *z* = direction of momentum transfer * Nbin = # of layers in pdim direction (must be even number) * zero or more keyword/value pairs may be appended -* keyword = *swap* or *target* +* keyword = *swap* or *vtarget* .. parsed-literal:: diff --git a/doc/src/fix_wall.rst b/doc/src/fix_wall.rst index 3028588505..014c89cfd5 100644 --- a/doc/src/fix_wall.rst +++ b/doc/src/fix_wall.rst @@ -70,7 +70,7 @@ Syntax cutoff = distance from wall at which wall-particle interaction is cut off (distance units) * zero or more keyword/value pairs may be appended -* keyword = *units* or *fld* +* keyword = *units* or *fld* or *pbc* .. parsed-literal:: diff --git a/doc/src/fix_wall_piston.rst b/doc/src/fix_wall_piston.rst index af3dece2f5..1237d1ac7c 100644 --- a/doc/src/fix_wall_piston.rst +++ b/doc/src/fix_wall_piston.rst @@ -14,7 +14,7 @@ Syntax * wall/piston = style name of this fix command * face = *zlo* * zero or more keyword/value pairs may be appended -* keyword = *pos* or *vel* or *ramp* or *units* +* keyword = *pos* or *vel* or *ramp* or *temp* or *units* .. parsed-literal:: @@ -32,6 +32,10 @@ Syntax *lattice* = the wall position is defined in lattice units *box* = the wall position is defined in simulation box units +.. + FIXME: There are several "undocumented" key words for this fix: *rough*, + *rampNL1*, *rampNL2*, *rampNL3*, *rampNL4*, and *rampNL5*. + Examples """""""" diff --git a/doc/src/kspace_modify.rst b/doc/src/kspace_modify.rst index b1d6efa86c..3c6fccc285 100644 --- a/doc/src/kspace_modify.rst +++ b/doc/src/kspace_modify.rst @@ -11,7 +11,7 @@ Syntax kspace_modify keyword value ... * one or more keyword/value pairs may be listed -* keyword = *collective* or *compute* or *cutoff/adjust* or *diff* or *disp/auto* or *fftbench* or *force/disp/kspace* or *force/disp/real* or *force* or *gewald/disp* or *gewald* or *kmax/ewald* or *mesh* or *minorder* or *mix/disp* or *order/disp* or *order* or *overlap* or *scafacos* or *slab* or *splittol* +* keyword = *collective* or *compute* or *cutoff/adjust* or *diff* or *disp/auto* or *fftbench* or *force/disp/kspace* or *force/disp/real* or *force* or *gewald/disp* or *gewald* or *kmax/ewald* or *mesh* or *minorder* or *mix/disp* or *order/disp* or *order* or *overlap* or *scafacos* or *slab* or *splittol* or *wire* .. parsed-literal:: diff --git a/doc/src/kspace_style.rst b/doc/src/kspace_style.rst index 30f3e550c5..cbaa82d547 100644 --- a/doc/src/kspace_style.rst +++ b/doc/src/kspace_style.rst @@ -301,7 +301,7 @@ and for mixed periodic and non-periodic boundaries. MSM is most competitive versus Ewald and PPPM when only relatively low accuracy forces, about 1e-4 relative error or less accurate, are needed. Note that use of a larger Coulombic cutoff (i.e. 15 -angstroms instead of 10 angstroms) provides better MSM accuracy for +Angstroms instead of 10 Angstroms) provides better MSM accuracy for both the real space and grid computed forces. Currently calculation of the full pressure tensor in MSM is expensive. @@ -314,9 +314,10 @@ pressure simulation with MSM will cause the code to run slower. ---------- -The *scafacos* style is a wrapper on the `ScaFaCoS Coulomb solver library `_ which provides a variety of solver -methods which can be used with LAMMPS. The paper by :ref:`(Sutman) ` -gives an overview of ScaFaCoS. +The *scafacos* style is a wrapper on the `ScaFaCoS Coulomb solver +library `_ which provides a variety of solver +methods which can be used with LAMMPS. The paper by :ref:`(Sutman) +` gives an overview of ScaFaCoS. ScaFaCoS was developed by a consortium of German research facilities with a BMBF (German Ministry of Science and Education) funded project diff --git a/doc/src/mdi.rst b/doc/src/mdi.rst index d2b8ff185d..2f7fc65852 100644 --- a/doc/src/mdi.rst +++ b/doc/src/mdi.rst @@ -6,7 +6,7 @@ mdi command Syntax """""" -.. parsed-literal:: +.. code-block:: LAMMPS mdi option args @@ -19,7 +19,7 @@ Syntax *elements* args = N_1 N_2 ... N_ntypes N_1,N_2,...N_ntypes = atomic number for each of ntypes LAMMPS atom types *plugin* args = name keyword value keyword value ... - name = name of plugin library, e.g. lammps means a liblammps.so library will be loaded + name = name of plugin library (e.g., *lammps* means a liblammps.so library will be loaded) keyword/value pairs in any order, some are required, some are optional keywords = *mdi* or *infile* or *extra* or *command* *mdi* value = args passed to MDI for driver to operate with plugins (required) @@ -173,8 +173,8 @@ commands, which are described further below. atom type values are consistent in both codes, then the >TYPES command can be used. If not, the optional *elements* keyword can be used to specify what element each LAMMPS atom type corresponds - to. This is specified by the atomic number of the element, e.g. 13 - for Al. An atomic number must be specified for each of the ntypes + to. This is specified by the atomic number of the element (e.g., 13 + for Al). An atomic number must be specified for each of the ntypes LAMMPS atom types. Ntypes is typically specified via the create_box command or in the data file read by the read_data command. In this has been done, the MDI driver can send an @@ -325,15 +325,15 @@ able to initiate and terminate the connection to the engine code. The only current MDI driver command in LAMMPS is the :doc:`fix mdi/qm ` command. If it is only used once in an input script -then it can initiate and terminate the connection. But if it is being -issued multiple times, e.g. in a loop that issues a :doc:`clear -` command, then it cannot initiate or terminate the connection +then it can initiate and terminate the connection, but if it is being +issued multiple times (e.g., in a loop that issues a :doc:`clear +` command), then it cannot initiate or terminate the connection multiple times. Instead, the *mdi connect* and *mdi exit* commands should be used outside the loop to initiate or terminate the connection. See the examples/mdi/in.series.driver script for an example of how this is done. The LOOP in that script is reading a series of data -file configurations and passing them to an MDI engine (e.g. quantum +file configurations and passing them to an MDI engine (e.g., quantum code) for energy and force evaluation. A *clear* command inside the loop wipes out the current system so a new one can be defined. This operation also destroys all fixes. So the :doc:`fix mdi/qm @@ -356,7 +356,7 @@ LAMMPS and MDI units, which the other codes will also perform in their preferred units. LAMMPS can also be used as an MDI engine in other unit choices it -supports, e.g. *lj*, but then no unit conversion is performed. +supports (e.g., *lj*), but then no unit conversion is performed. Related commands """""""""""""""" diff --git a/doc/src/min_modify.rst b/doc/src/min_modify.rst index 6b416a9b6a..1b57a39064 100644 --- a/doc/src/min_modify.rst +++ b/doc/src/min_modify.rst @@ -24,7 +24,7 @@ Syntax inf = max force component across all 3-vectors max = max force norm across all 3-vectors *alpha_damp* value = damping - damping = fictitious Gilbert damping for spin minimization (adim) + damping = fictitious magnetic damping for spin minimization (adim) *discrete_factor* value = factor factor = discretization factor for adaptive spin timestep (adim) *integrator* value = *eulerimplicit* or *verlet* @@ -109,9 +109,9 @@ norm is replaced by the spin-torque norm. Keywords *alpha_damp* and *discrete_factor* only make sense when a :doc:`min_spin ` command is declared. -Keyword *alpha_damp* defines an analog of a magnetic Gilbert -damping. It defines a relaxation rate toward an equilibrium for -a given magnetic system. +Keyword *alpha_damp* defines an analog of a magnetic damping. +It defines a relaxation rate toward an equilibrium for a given +magnetic system. Keyword *discrete_factor* defines a discretization factor for the adaptive timestep used in the *spin* minimization. See :doc:`min_spin ` for more information about those diff --git a/doc/src/min_spin.rst b/doc/src/min_spin.rst index d9572f4463..9b6841ae8c 100644 --- a/doc/src/min_spin.rst +++ b/doc/src/min_spin.rst @@ -39,7 +39,7 @@ timestep, according to: \frac{d \vec{s}_{i}}{dt} = \lambda\, \vec{s}_{i} \times\left( \vec{\omega}_{i} \times\vec{s}_{i} \right) -with :math:`\lambda` a damping coefficient (similar to a Gilbert +with :math:`\lambda` a damping coefficient (similar to a magnetic damping). :math:`\lambda` can be defined by setting the *alpha_damp* keyword with the :doc:`min_modify ` command. diff --git a/doc/src/neigh_modify.rst b/doc/src/neigh_modify.rst index d99a3187aa..8e5c517b94 100644 --- a/doc/src/neigh_modify.rst +++ b/doc/src/neigh_modify.rst @@ -16,12 +16,12 @@ Syntax keyword = *delay* or *every* or *check* or *once* or *cluster* or *include* or *exclude* or *page* or *one* or *binsize* or *collection/type* or *collection/interval* *delay* value = N - N = delay building until this many steps since last build + N = delay building neighbor lists until this many steps since last build *every* value = M - M = build neighbor list every this many steps + M = consider building neighbor lists every this many steps *check* value = *yes* or *no* - *yes* = only build if some atom has moved half the skin distance or more - *no* = always build on 1st step that *every* and *delay* are satisfied + *yes* = only build if at least one atom has moved half the skin distance or more + *no* = always build on 1st step where *every* and *delay* are conditions are satisfied *once* value = *yes* or *no* *yes* = only build neighbor list once at start of run and never rebuild *no* = rebuild neighbor list according to other settings @@ -71,30 +71,53 @@ Description """"""""""" This command sets parameters that affect the building and use of -pairwise neighbor lists. Depending on what pair interactions and -other commands are defined, a simulation may require one or more -neighbor lists. +pairwise neighbor lists. Depending on what pair interactions and other +commands are defined, a simulation may require one or more neighbor +lists. -The *every*, *delay*, *check*, and *once* options affect how often -lists are built as a simulation runs. The *delay* setting means never -build new lists until at least N steps after the previous build. The -*every* setting means build lists every M steps (after the delay has +The *every*, *delay*, *check*, and *once* options affect how often lists +are built as a simulation runs. The *delay* setting means never build +new lists until at least N steps after the previous build. The *every* +setting means attempt to build lists every M steps (after the delay has passed). If the *check* setting is *no*, the lists are built on the first step that satisfies the *delay* and *every* settings. If the *check* setting is *yes*, then the *every* and *delay* settings determine when a build may possibly be performed, but an actual build -only occurs if some atom has moved more than half the skin distance -(specified in the :doc:`neighbor ` command) since the last -build. +only occurs if at least one atom has moved more than half the neighbor +skin distance (specified in the :doc:`neighbor ` command) +since the last neighbor list build. -If the *once* setting is yes, then the neighbor list is only built -once at the beginning of each run, and never rebuilt, except on steps -when a restart file is written, or steps when a fix forces a rebuild -to occur (e.g. fixes that create or delete atoms, such as :doc:`fix deposit ` or :doc:`fix evaporate `). -This setting should only be made if you are certain atoms will not -move far enough that the neighbor list should be rebuilt, e.g. running -a simulation of a cold crystal. Note that it is not that expensive to -check if neighbor lists should be rebuilt. +.. admonition:: Impact of neighbor list settings + :class: note + + The choice of neighbor list settings can have a significant impact on + the (parallel) performance of LAMMPS and the correctness of the + simulation results. Since building the neighbor lists is time + consuming, doing it less frequently can speed up a calculation. If + the lists are rebuilt too infrequently, however, interacting pairs + may be missing and thus the resulting pairwise interactions + incorrect. The optimal settings depend on many factors like the + properties of the simulated system (density, geometry, topology, + temperature, pressure), the force field parameters and settings, the + size of the timestep, neighbor list skin distance and more. The + default settings are chosen to be very conservative to guarantee + correctness of the simulation. They depend on the *check* flag + heuristics to reduce the number of neighbor list rebuilds at a minor + expense for executing the check. Determining the correctness of a + specific choice of neighbor list settings is complicated by the fact + that a neighbor list rebuild changes the order in which pairwise + interactions are computed and thus + - due to the limitations of floating-point math - the trajectory. + +If the *once* setting is yes, then the neighbor list is only built once +at the beginning of each run, and never rebuilt, except on steps when a +restart file is written, or steps when a fix forces a rebuild to occur +(e.g. fixes that create or delete atoms, such as :doc:`fix deposit +` or :doc:`fix evaporate `). This setting +should only be made if you are certain atoms will not move far enough +that the neighbor list should be rebuilt, e.g. running a simulation of a +cold crystal. Note that it is not that expensive to check if neighbor +lists should be rebuilt. When the rRESPA integrator is used (see the :doc:`run_style ` command), the *every* and *delay* parameters refer to the longest @@ -234,11 +257,11 @@ depend on their atom type. Restrictions """""""""""" -If the "delay" setting is non-zero, then it must be a multiple of the -"every" setting. +If the *delay* setting is non-zero, then it must be a multiple of the +*every* setting. -The molecule/intra and molecule/inter exclude options can only be used -with atom styles that define molecule IDs. +The *molecule/intra* and *molecule/inter* exclusion options can only +be used with atom styles that define molecule IDs. The value of the *page* setting must be at least 10x larger than the *one* setting. This insures neighbor pages are not mostly empty @@ -252,6 +275,6 @@ Related commands Default """"""" -The option defaults are delay = 10, every = 1, check = yes, once = no, +The option defaults are delay = 0, every = 1, check = yes, once = no, cluster = no, include = all (same as no include option defined), exclude = none, page = 100000, one = 2000, and binsize = 0.0. diff --git a/doc/src/pair_adp.rst b/doc/src/pair_adp.rst index 63045a4792..9a3ce240cd 100644 --- a/doc/src/pair_adp.rst +++ b/doc/src/pair_adp.rst @@ -54,7 +54,7 @@ command to specify them. **ADP potentials are available from:** -* The NIST WWW site at http://www.ctcms.nist.gov/potentials. +* The NIST WWW site at https://www.ctcms.nist.gov/potentials. Note that ADP potentials obtained from NIST must be converted into the extended DYNAMO *setfl* format discussed below. * The OpenKIM Project at diff --git a/doc/src/pair_airebo.rst b/doc/src/pair_airebo.rst index b250064476..9a1e4e5518 100644 --- a/doc/src/pair_airebo.rst +++ b/doc/src/pair_airebo.rst @@ -102,7 +102,7 @@ a few fitted spline values are slightly different. For most cases the statistical averages as the original REBO potential from which it was derived. The :math:`E^{\text{REBO}}` term in the AIREBO potential gives the model its reactive capabilities and only describes short-ranged C-C, C-H and H-H -interactions (:math:`r < 2` Angstroms). These interactions have strong +interactions (:math:`r < 2 \AA`). These interactions have strong coordination-dependence through a bond order parameter, which adjusts the attraction between the I,J atoms based on the position of other nearby atoms and thus has 3- and 4-body dependence. @@ -116,9 +116,9 @@ interactions is determined by the *cutoff* argument to the pair_style command which is a scale factor. For each type pair (C-C, C-H, H-H) the cutoff is obtained by multiplying the scale factor by the sigma value defined in the potential file for that type pair. In the -standard AIREBO potential, :math:`\sigma_{CC} = 3.4` Angstroms, so with a scale +standard AIREBO potential, :math:`\sigma_{CC} = 3.4 \AA`, so with a scale factor of 3.0 (the argument in pair_style), the resulting :math:`E^{\text{LJ}}` cutoff -would be 10.2 Angstroms. +would be :math:`10.2 \AA`. By default, the longer-ranged interaction is smoothly switched off between 2.16 and 3.0 :math:`\sigma`. By specifying *cutoff_min* in addition diff --git a/doc/src/pair_amoeba.rst b/doc/src/pair_amoeba.rst index 44a14f0f45..f5c0ea14df 100644 --- a/doc/src/pair_amoeba.rst +++ b/doc/src/pair_amoeba.rst @@ -156,7 +156,7 @@ settings. ---------- -.. versionadded:: TBD +.. versionadded:: 3Nov2022 The *amoeba* and *hippo* pair styles support extraction of two per-atom quantities by the :doc:`fix pair ` command. This allows the diff --git a/doc/src/pair_bpm_spring.rst b/doc/src/pair_bpm_spring.rst index 8235b1c624..72e0083bd8 100644 --- a/doc/src/pair_bpm_spring.rst +++ b/doc/src/pair_bpm_spring.rst @@ -59,7 +59,7 @@ include this pair interaction and overlay the pair force over the bond force or to exclude this pair interaction such that the two particles only interact via the bond force. See discussion of the *overlay/pair* option for BPM bond styles and the :doc:`special_bonds ` -command in the `:doc: how to ` page on BPMs for more details. +command in the :doc:`how to ` page on BPMs for more details. The following coefficients must be defined for each pair of atom types via the :doc:`pair_coeff ` command as in the examples diff --git a/doc/src/pair_charmm.rst b/doc/src/pair_charmm.rst index e1469ae323..8ff6508dea 100644 --- a/doc/src/pair_charmm.rst +++ b/doc/src/pair_charmm.rst @@ -110,7 +110,7 @@ These pair styles compute Lennard Jones (LJ) and Coulombic interactions with additional switching or shifting functions that ramp the energy and/or force smoothly to zero between an inner and outer cutoff. They are implementations of the widely used CHARMM force -field used in the `CHARMM `_ MD code (and +field used in the `CHARMM `_ MD code (and others). See :ref:`(MacKerell) ` for a description of the CHARMM force field. @@ -144,7 +144,7 @@ artifacts. conversion factor used internally in the code, from the LAMMPS value to the CHARMM value, as if it were effectively a parameter of the force field. This is because the CHARMM code uses a slightly - different value for the this conversion factor in :doc:`real units ` (Kcal/mole), namely CHARMM = 332.0716, LAMMPS = + different value for the this conversion factor in :doc:`real units ` (kcal/mol), namely CHARMM = 332.0716, LAMMPS = 332.06371. This is to enable more precise agreement by LAMMPS with the CHARMM force field energies and forces, when using one of these two CHARMM pair styles. diff --git a/doc/src/pair_cs.rst b/doc/src/pair_cs.rst index ef40eb310f..745b14867b 100644 --- a/doc/src/pair_cs.rst +++ b/doc/src/pair_cs.rst @@ -114,7 +114,7 @@ Description """"""""""" These pair styles are designed to be used with the adiabatic -core/shell model of :ref:`(Mitchell and Finchham) `. See +core/shell model of :ref:`(Mitchell and Fincham) `. See the :doc:`Howto coreshell ` page for an overview of the model as implemented in LAMMPS. @@ -196,7 +196,7 @@ none ---------- -.. _MitchellFinchham2: +.. _MitchellFincham3: -**(Mitchell and Finchham)** Mitchell, Finchham, J Phys Condensed Matter, +**(Mitchell and Fincham)** Mitchell, Fincham, J Phys Condensed Matter, 5, 1031-1038 (1993). diff --git a/doc/src/pair_dielectric.rst b/doc/src/pair_dielectric.rst index dbdd163a76..0b60d202ea 100644 --- a/doc/src/pair_dielectric.rst +++ b/doc/src/pair_dielectric.rst @@ -76,16 +76,19 @@ Description """"""""""" All these pair styles are derived from the corresponding pair styles -without the *dielectric*\ suffix. In addition to computing atom forces -and energies, these pair styles compute the electrical field vector -at each atom, which are to be used in the :doc:`fix polarize ` commands. +without the *dielectric* suffix. In addition to computing atom forces +and energies, these pair styles compute the electric field vector at +each atom, which are intended to be used by the :doc:`fix polarize +` commands to compute induced charges at interfaces +between two regions of different dielectric constant. -These pair styles should be used with :doc:`atom_style dielectric `, -which uses atom charges rescaled by their local dielectric constant. +These pair styles should be used with :doc:`atom_style dielectric +`. The styles lj/cut/coul/long/dielectric, lj/cut/coul/msm/dielectric, and -lj/long/coul/long/dielectric should be used with their kspace style counterparts, -namely, pppm/dielectric, pppm/disp/dielectric, and msm/dielectric, respectively. +lj/long/coul/long/dielectric should be used with their kspace style +counterparts, namely, pppm/dielectric, pppm/disp/dielectric, and +msm/dielectric, respectively. ---------- @@ -97,24 +100,27 @@ Mixing, shift, table, tail correction, restart, rRESPA info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" For atom type pairs I,J and I != J, the epsilon and sigma coefficients -and cutoff distances for this pair style can be mixed. The default -mix value is *geometric*\ . See the "pair_modify" command for details. +and cutoff distances for this pair style can be mixed. The default mix +algorithm is *geometric*\ . See the :doc:`pair_modify `" +command for details. The :doc:`pair_modify ` table option is not relevant for this pair style. -This pair style writes its information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need -to be specified in an input script that reads a restart file. +These pair styles write its information to :doc:`binary restart files +`, so pair_style and pair_coeff commands do not need to be +specified in an input script that reads a restart file. -This pair style can only be used via the *pair* keyword of the +These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*, *middle*, *outer* keywords. Restrictions """""""""""" -These styles are part of the DIELECTRIC package. They are only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +These styles are part of the DIELECTRIC package. They are only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_dipole.rst b/doc/src/pair_dipole.rst index 50e1a1b023..eb6b2c4859 100644 --- a/doc/src/pair_dipole.rst +++ b/doc/src/pair_dipole.rst @@ -58,22 +58,26 @@ Examples .. code-block:: LAMMPS - pair_style lj/cut/dipole/cut 10.0 + pair_style lj/cut/dipole/cut 2.5 5.0 pair_coeff * * 1.0 1.0 - pair_coeff 2 3 1.0 1.0 2.5 4.0 + pair_coeff 2 3 0.8 1.0 2.5 4.0 pair_style lj/sf/dipole/sf 9.0 pair_coeff * * 1.0 1.0 pair_coeff 2 3 1.0 1.0 2.5 4.0 scale 0.5 - pair_coeff 2 3 1.0 1.0 2.5 4.0 + pair_coeff 2 3 0.8 1.0 2.5 4.0 - pair_style lj/cut/dipole/long 10.0 + pair_style lj/cut/dipole/long 2.5 3.5 pair_coeff * * 1.0 1.0 - pair_coeff 2 3 1.0 1.0 2.5 4.0 + pair_coeff 2 3 0.8 1.0 3.0 - pair_style lj/long/dipole/long long long 3.5 10.0 + pair_style lj/long/dipole/long long long 3.5 pair_coeff * * 1.0 1.0 - pair_coeff 2 3 1.0 1.0 2.5 4.0 + pair_coeff 2 3 0.8 1.0 + + pair_style lj/long/dipole/long cut long 2.5 3.5 + pair_coeff * * 1.0 1.0 + pair_coeff 2 3 0.8 1.0 3.0 Description """"""""""" @@ -254,23 +258,28 @@ long-range LJ interactions, the :doc:`kspace_style ewald/disp ---------- -The following coefficients must be defined for each pair of atoms -types via the :doc:`pair_coeff ` command as in the examples -above, or in the data file or restart files read by the -:doc:`read_data ` or :doc:`read_restart ` -commands, or by mixing as described below: +The following coefficients must be defined for each pair of atoms types +via the :doc:`pair_coeff ` command as in the examples above, +or in the data file or restart files read by the :doc:`read_data +` or :doc:`read_restart ` commands, or by +mixing as described below: * :math:`\epsilon` (energy units) * :math:`\sigma` (distance units) * cutoff1 (distance units) * cutoff2 (distance units) -The latter 2 coefficients are optional. If not specified, the global -LJ and Coulombic cutoffs specified in the pair_style command are used. -If only one cutoff is specified, it is used as the cutoff for both LJ -and Coulombic interactions for this type pair. If both coefficients -are specified, they are used as the LJ and Coulombic cutoffs for this -type pair. +The latter 2 coefficients are optional. If not specified, the global LJ +and Coulombic cutoffs specified in the pair_style command are used. If +only one cutoff is specified, it is used as the cutoff for both LJ and +Coulombic interactions for this type pair. If both coefficients are +specified, they are used as the LJ and Coulombic cutoffs for this type +pair. When using a long-rang Coulomb solver, only a global Coulomb +cutoff may be used and only the LJ cutoff may be changed with the +:doc:`pair_coeff ` command. When using the +*lj/long/dipole/long* pair style with *long* *long* setting, only a +single global cutoff may be provided and no cutoff for the +:doc:`pair_coeff ` command. ---------- diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index af936a6bc9..27347b77f0 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -122,15 +122,11 @@ are parameterized in terms of LAMMPS :doc:`metal units `. EAM potential files list atomic masses; thus you do not need to use the :doc:`mass ` command to specify them. -There are several WWW sites that distribute and document EAM -potentials stored in DYNAMO or other formats: +There are web sites that distribute and document EAM potentials stored +in DYNAMO or other formats: -.. parsed-literal:: - - http://www.ctcms.nist.gov/potentials - http://cst-www.nrl.navy.mil/ccm6/ap - http://enpub.fulton.asu.edu/cms/potentials/main/main.htm - https://openkim.org +* https://www.ctcms.nist.gov/potentials +* https://openkim.org These potentials should be usable with LAMMPS, though the alternate formats would need to be converted to the DYNAMO format used by LAMMPS @@ -444,7 +440,7 @@ identical to the FS EAM files (see above). ---------- -.. versionadded:: TBD +.. versionadded:: 3Nov2022 The *eam*, *eam/alloy*, *eam/fs*, and *eam/he* pair styles support extraction of two per-atom quantities by the :doc:`fix pair ` diff --git a/doc/src/pair_gayberne.rst b/doc/src/pair_gayberne.rst index 09bc3706c2..553cbdd8d3 100644 --- a/doc/src/pair_gayberne.rst +++ b/doc/src/pair_gayberne.rst @@ -44,14 +44,15 @@ ellipsoidal and spherical particle via the formulas U_r = & 4 \epsilon ( \varrho^{12} - \varrho^6) \\ \varrho = & \frac{\sigma}{ h_{12} + \gamma \sigma} -where A1 and A2 are the transformation matrices from the simulation box -frame to the body frame and :math:`r_{12}` is the center to center -vector between the particles. :math:`U_r` controls the shifted distance -dependent interaction based on the distance of closest approach of the -two particles (:math:`h_{12}`) and the user-specified shift parameter -gamma. When both particles are spherical, the formula reduces to the -usual Lennard-Jones interaction (see details below for when Gay-Berne -treats a particle as "spherical"). +where :math:`\mathbf{A}_1` and :math:`\mathbf{A}_2` are the +transformation matrices from the simulation box frame to the body frame +and :math:`r_{12}` is the center to center vector between the particles. +:math:`U_r` controls the shifted distance dependent interaction based on +the distance of closest approach of the two particles (:math:`h_{12}`) +and the user-specified shift parameter :math:`\gamma`. When both +particles are spherical, the formula reduces to the usual Lennard-Jones +interaction (see details below for when Gay-Berne treats a particle as +"spherical"). For large uniform molecules it has been shown that the energy parameters are approximately representable in terms of local contact @@ -74,8 +75,9 @@ listed below and in `this supplementary document `_ Use of this pair style requires the NVE, NVT, or NPT fixes with the *asphere* extension (e.g. :doc:`fix nve/asphere `) in -order to integrate particle rotation. Additionally, :doc:`atom_style ellipsoid ` should be used since it defines the -rotational state and the size and shape of each ellipsoidal particle. +order to integrate particle rotation. Additionally, :doc:`atom_style +ellipsoid ` should be used since it defines the rotational +state and the size and shape of each ellipsoidal particle. The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples @@ -129,7 +131,7 @@ that type. e.g. in a "pair_coeff I J" command. .. note:: - If the :math:`\epsilon` a = b = c for an atom type, and if the shape + If the :math:`\epsilon_{a}` = :math:`\epsilon_{b}` = :math:`\epsilon_{c}` for an atom type, and if the shape of the particle itself is spherical, meaning its 3 shape parameters are all the same, then the particle is treated as an LJ sphere by the Gay-Berne potential. This is significant because if two LJ spheres @@ -137,7 +139,7 @@ that type. e.g. in a "pair_coeff I J" command. their interaction energy/force using the specified epsilon and sigma as the standard LJ parameters. This is much cheaper to compute than the full Gay-Berne formula. To treat the particle as a LJ sphere - with sigma = D, you should normally set :math:`\epsilon` a = b = c = + with sigma = D, you should normally set :math:`\epsilon_{a}` = :math:`\epsilon_{b}` = :math:`\epsilon_{c}` = 1.0, set the pair_coeff :math:`\sigma = D`, and also set the 3 shape parameters for the particle to D. The one exception is that if the 3 shape parameters are set to 0.0, which is a valid way in LAMMPS to diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 6f84b0d9c7..0b8f3e11ae 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -97,7 +97,7 @@ on particle *i* due to contact with particle *j* is given by: Where :math:`\delta_{ij} = R_i + R_j - \|\mathbf{r}_{ij}\|` is the particle overlap, :math:`R_i, R_j` are the particle radii, :math:`\mathbf{r}_{ij} = \mathbf{r}_i - \mathbf{r}_j` is the vector separating the two -particle centers (note the i-j ordering so that :math:`F_{ne}` is +particle centers (note the i-j ordering so that :math:`\mathbf{F}_{ne}` is positive for repulsion), and :math:`\mathbf{n} = \frac{\mathbf{r}_{ij}}{\|\mathbf{r}_{ij}\|}`. Therefore, for *hooke*, the units of the spring constant :math:`k_n` are *force*\ /\ *distance*, or equivalently *mass*\ /*time\^2*. diff --git a/doc/src/pair_gromacs.rst b/doc/src/pair_gromacs.rst index ed24b481f9..cb5f223b23 100644 --- a/doc/src/pair_gromacs.rst +++ b/doc/src/pair_gromacs.rst @@ -53,7 +53,7 @@ Description The *lj/gromacs* styles compute shifted LJ and Coulombic interactions with an additional switching function S(r) that ramps the energy and force smoothly to zero between an inner and outer cutoff. It is a commonly -used potential in the `GROMACS `_ MD code and for +used potential in the `GROMACS `_ MD code and for the coarse-grained models of :ref:`(Marrink) `. .. math:: diff --git a/doc/src/pair_harmonic_cut.rst b/doc/src/pair_harmonic_cut.rst index 6b28db5fda..d91c3cf550 100644 --- a/doc/src/pair_harmonic_cut.rst +++ b/doc/src/pair_harmonic_cut.rst @@ -27,6 +27,8 @@ Examples Description """"""""""" +.. versionadded:: 17Feb2022 + Style *harmonic/cut* computes pairwise repulsive-only harmonic interactions with the formula .. math:: diff --git a/doc/src/pair_ilp_tmd.rst b/doc/src/pair_ilp_tmd.rst index a509b10cc3..77fa8bbfd5 100644 --- a/doc/src/pair_ilp_tmd.rst +++ b/doc/src/pair_ilp_tmd.rst @@ -32,6 +32,8 @@ Examples Description """"""""""" +.. versionadded:: 17Feb2022 + The *ilp/tmd* style computes the registry-dependent interlayer potential (ILP) potential for transition metal dichalcogenides (TMD) as described in :ref:`(Ouyang7) `. diff --git a/doc/src/pair_list.rst b/doc/src/pair_list.rst index 321bf61be9..fd08f9d6f0 100644 --- a/doc/src/pair_list.rst +++ b/doc/src/pair_list.rst @@ -30,15 +30,17 @@ Description """"""""""" Style *list* computes interactions between explicitly listed pairs of -atoms with the option to select functional form and parameters for -each individual pair. Because the parameters are set in the list -file, the pair_coeff command has no parameters (but still needs to be -provided). The *check* and *nocheck* keywords enable/disable a test -that checks whether all listed bonds were present and computed. +atoms with the option to select functional form and parameters for each +individual pair. Because the parameters are set in the list file, the +pair_coeff command has no parameters (but still needs to be provided). +The *check* and *nocheck* keywords enable/disable tests that checks +whether all listed pairs of atom IDs were present and the interactions +computed. If *nocheck* is set and either atom ID is not present, the +interaction is skipped. This pair style can be thought of as a hybrid between bonded, -non-bonded, and restraint interactions. It will typically be used as -an additional interaction within the *hybrid/overlay* pair style. It +non-bonded, and restraint interactions. It will typically be used as an +additional interaction within the *hybrid/overlay* pair style. It currently supports three interaction styles: a 12-6 Lennard-Jones, a Morse and a harmonic potential. @@ -57,8 +59,8 @@ The format of the list file is as follows: coeffs = list of coeffs cutoff = cutoff for interaction (optional) -The cutoff parameter is optional. If not specified, the global cutoff -is used. +The cutoff parameter is optional for all but the *quartic* interactions. +If it is not specified, the global cutoff is used. Here is an example file: @@ -69,6 +71,7 @@ Here is an example file: 15 259 lj126 1.0 1.0 50.0 15 603 morse 10.0 1.2 2.0 10.0 # and another comment 18 470 harmonic 50.0 1.2 5.0 + 19 332 quartic 10.0 5.0 -1.2 1.2 The style *lj126* computes pairwise interactions with the formula @@ -85,7 +88,7 @@ The style *morse* computes pairwise interactions with the formula .. math:: - E = D_0 \left[ e^{- 2 \alpha (r - r_0)} - 2 e^{- \alpha (r - r_0)} \right] \qquad r < r_c + E = D_0 \left[ 1 - e^{-\alpha (r - r_0)} \right]^2 \qquad r < r_c and the coefficients: @@ -97,7 +100,7 @@ The style *harmonic* computes pairwise interactions with the formula .. math:: - E = K (r - r_0)^2 + E = K (r - r_0)^2 \qquad r < r_c and the coefficients: @@ -106,6 +109,19 @@ and the coefficients: Note that the usual 1/2 factor is included in :math:`K`. +The style *quartic* computes pairwise interactions with the formula + +.. math:: + + E = K (r - r_0)^2 (r - r_0 -b_1) (r - r_0 - b_2) \qquad r < r_c + +and the coefficients: + +* :math:`K` (energy units) +* :math:`r_0` (distance units) +* :math:`b_1` (distance units) +* :math:`b_2` (distance units) + ---------- Mixing, shift, table, tail correction, restart, rRESPA info @@ -120,8 +136,9 @@ pair style. The :doc:`pair_modify ` table and tail options are not relevant for this pair style. -This pair style does not write its information to :doc:`binary restart files `, so pair_style and pair_coeff commands need -to be specified in an input script that reads a restart file. +This pair style does not write its information to :doc:`binary restart +files `, so pair_style and pair_coeff commands need to be +specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the @@ -133,17 +150,18 @@ Restrictions """""""""""" This pair style does not use a neighbor list and instead identifies -atoms by their IDs. This has two consequences: 1) The cutoff has to be -chosen sufficiently large, so that the second atom of a pair has to be -a ghost atom on the same node on which the first atom is local; -otherwise the interaction will be skipped. You can use the *check* -option to detect, if interactions are missing. 2) Unlike other pair -styles in LAMMPS, an atom I will not interact with multiple images of -atom J (assuming the images are within the cutoff distance), but only -with the nearest image. +atoms by their IDs. This has two consequences: 1) The cutoff has to be +chosen sufficiently large, so that the second atom of a pair has to be a +ghost atom on the same node on which the first atom is local; otherwise +the interaction will be skipped. You can use the *check* option to +detect, if interactions are missing. 2) Unlike other pair styles in +LAMMPS, an atom I will not interact with multiple images of atom J +(assuming the images are within the cutoff distance), but only with the +closest image. -This style is part of the MISC package. It is only enabled if -LAMMPS is build with that package. See the :doc:`Build package ` page on for more info. +This style is part of the MISC package. It is only enabled if LAMMPS is +build with that package. See the :doc:`Build package ` +page on for more info. Related commands """""""""""""""" @@ -151,8 +169,9 @@ Related commands :doc:`pair_coeff `, :doc:`pair_style hybrid/overlay `, :doc:`pair_style lj/cut `, -:doc:`pair_style morse `, +:doc:`bond_style morse `, :doc:`bond_style harmonic ` +:doc:`bond_style quartic ` Default """"""" diff --git a/doc/src/pair_meam.rst b/doc/src/pair_meam.rst index 987ff3a671..ae8b96a47d 100644 --- a/doc/src/pair_meam.rst +++ b/doc/src/pair_meam.rst @@ -311,9 +311,9 @@ formulation of the partial electron density function. In recent literature, an extra term is included in the expression for the third-order density in order to make the densities orthogonal (see for example :ref:`(Wang) `, equation 3d); this term is included in the -MEAM implementation in lammps. However, in earlier published work +MEAM implementation in LAMMPS. However, in earlier published work this term was not included when deriving parameters, including most of -those provided in the ``library.meam`` file included with lammps, and to +those provided in the ``library.meam`` file included with LAMMPS, and to account for this difference the parameter *t1* must be augmented by 3/5\**t3*. If *augt1* = 1, the default, this augmentation is done automatically. When parameter values are fit using the modified @@ -321,16 +321,16 @@ density function, as in more recent literature, augt1 should be set to 0. The *mixture_ref_t* parameter is available to match results with those -of previous versions of lammps (before January 2011). Newer versions -of lammps, by default, use the single-element values of the *t* +of previous versions of LAMMPS (before January 2011). Newer versions +of LAMMPS, by default, use the single-element values of the *t* parameters to compute the background reference density. This is the -proper way to compute these parameters. Earlier versions of lammps +proper way to compute these parameters. Earlier versions of LAMMPS used an alloy mixture averaged value of *t* to compute the background reference density. Setting *mixture_ref_t* = 1 gives the old behavior. WARNING: using *mixture_ref_t* = 1 will give results that are demonstrably incorrect for second-neighbor MEAM, and non-standard for first-neighbor MEAM; this option is included only for matching with -previous versions of lammps and should be avoided if possible. +previous versions of LAMMPS and should be avoided if possible. The parameters *attrac* and *repuls*, along with the integer selection parameter *erose_form*, can be used to modify the Rose energy function @@ -361,7 +361,7 @@ recent published MEAM parameter sets, such as :ref:`(Valone) ` The default form of the *erose* expression in LAMMPS was corrected in March 2009. The current version is correct, but may show different - behavior compared with earlier versions of lammps with the attrac + behavior compared with earlier versions of LAMMPS with the attrac and/or repuls parameters are non-zero. To obtain the previous default form, use *erose_form* = 1 (this form does not seem to appear in the literature). An alternative form (see e.g. :ref:`(Lee2) `) is @@ -423,10 +423,8 @@ none .. _Gullet: -**(Gullet)** Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). -This report may be accessed on-line via `this link `_. - -.. _sandreport: http://infoserve.sandia.gov/sand_doc/2003/038782.pdf +**(Gullet)** Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). DOI:10.2172/918395 +This report may be accessed on-line via `this link `_. .. _Lee: diff --git a/doc/src/pair_mliap.rst b/doc/src/pair_mliap.rst index 900a2c2e6a..fcb9c7881e 100644 --- a/doc/src/pair_mliap.rst +++ b/doc/src/pair_mliap.rst @@ -1,8 +1,11 @@ .. index:: pair_style mliap +.. index:: pair_style mliap/kk pair_style mliap command ======================== +Accelerator Variants: *mliap/kk* + Syntax """""" @@ -10,8 +13,8 @@ Syntax pair_style mliap ... keyword values ... -* two keyword/value pairs must be appended -* keyword = *model* or *descriptor* +* one or two keyword/value pairs must be appended +* keyword = *model* or *descriptor* or *unified* .. parsed-literal:: @@ -21,6 +24,9 @@ Syntax *descriptor* values = style filename style = *sna* or *so3* filename = name of file containing descriptor definitions + *unified* values = filename ghostneigh_flag + filename = name of file containing serialized unified Python object + ghostneigh_flag = 0/1 to turn off/on inclusion of ghost neighbors in neighbors list Examples """""""" @@ -30,20 +36,24 @@ Examples pair_style mliap model linear InP.mliap.model descriptor sna InP.mliap.descriptor pair_style mliap model quadratic W.mliap.model descriptor sna W.mliap.descriptor pair_style mliap model nn Si.nn.mliap.model descriptor so3 Si.nn.mliap.descriptor + pair_style mliap unified mliap_unified_lj_Ar.pkl 0 pair_coeff * * In P Description """"""""""" Pair style *mliap* provides a general interface to families of -machine-learning interatomic potentials. It allows separate definitions +machine-learning interatomic potentials. It allows separate definitions of the interatomic potential functional form (*model*) and the geometric -quantities that characterize the atomic positions (*descriptor*). By -defining *model* and *descriptor* separately, it is possible to use many -different models with a given descriptor, or many different descriptors -with a given model. The pair style currently supports only *sna* and *so3* -descriptor styles, but it is is straightforward to add new descriptor -styles. +quantities that characterize the atomic positions (*descriptor*). + +By defining *model* and *descriptor* separately, it is possible to use +many different models with a given descriptor, or many different +descriptors with a given model. The pair style currently supports only +*sna* and *so3* descriptor styles, but it is straightforward to add new +descriptor styles. By using the *unified* keyword, it is possible to +define a Python model that combines functionalities of both *model* and +*descriptor*. The SNAP descriptor style *sna* is the same as that used by :doc:`pair_style snap `, including the linear, quadratic, and @@ -55,17 +65,19 @@ useful to know the gradient or derivative of energy, force, and stress w.r.t. model parameters. This information can be accessed using the related :doc:`compute mliap ` command. +.. versionadded:: 2Jun2022 + The descriptor style *so3* is a descriptor that is derived from the the smooth SO(3) power spectrum with the explicit inclusion of a radial basis :ref:`(Bartok) ` and :ref:`(Zagaceta) `. The available models are *linear* and *nn*. The pair_style *mliap* command must be followed by two keywords *model* -and *descriptor* in either order. A single *pair_coeff* command is also -required. The first 2 arguments must be \* \* so as to span all LAMMPS -atom types. This is followed by a list of N arguments that specify the -mapping of MLIAP element names to LAMMPS atom types, where N is the -number of LAMMPS atom types. +and *descriptor* in either order, or the one keyword *unified*. A +single *pair_coeff* command is also required. The first 2 arguments +must be \* \* so as to span all LAMMPS atom types. This is followed by +a list of N arguments that specify the mapping of MLIAP element names to +LAMMPS atom types, where N is the number of LAMMPS atom types. The *model* keyword is followed by the model style. This is followed by a single argument specifying the model filename containing the @@ -113,14 +125,15 @@ The detail of *nn* module implementation can be found at :ref:`(Yanxon) ` +cutoff manually, such as in the following example. + + +.. code-block:: LAMMPS + + variable ninteractions equal 2 + variable cutdist equal 7.5 + variable skin equal 1.0 + variable commcut equal (${ninteractions}*${cutdist})+${skin} + neighbor ${skin} bin + comm_modify cutoff ${commcut} + + +.. note:: + + To load a model from memory + (i.e. an existing python object), call `lammps.mliap.load_unified(unified)` + from python, and then specify the filename as "EXISTS". When using LAMMPS via + the library mode, you will need to call `lammps.mliappy.activate_mliappy(lmp)` + on the active LAMMPS object before the pair style is defined. This call locates + and loads the mliap-specific python module that is built into LAMMPS. + +---------- + +.. include:: accel_styles.rst + +---------- + Mixing, shift, table, tail correction, restart, rRESPA info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" diff --git a/doc/src/pair_modify.rst b/doc/src/pair_modify.rst index 6d4171fbc9..f08fb7a82f 100644 --- a/doc/src/pair_modify.rst +++ b/doc/src/pair_modify.rst @@ -284,6 +284,8 @@ the *pair* keyword. Use *no* to disable, or *yes* to enable. The "pair_modify pair compute/tally" command must be issued **before** the corresponding compute style is defined. +.. versionadded:: 3Aug2022 + The *neigh/trim* keyword controls whether an explicit cutoff is set for each neighbor list request issued by individual pair sub-styles when using :doc:`pair hybrid/overlay `. When this keyword is diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index c9857c5caa..697a9965b6 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -1,11 +1,15 @@ .. index:: pair_style pace .. index:: pair_style pace/kk +.. index:: pair_style pace/extrapolation pair_style pace command ======================= Accelerator Variants: *pace/kk* +pair_style pace/extrapolation command +===================================== + Syntax """""" @@ -22,6 +26,10 @@ Syntax *recursive* = use recursive algorithm for basis functions *chunksize* value = number of atoms in each pass +.. code-block:: LAMMPS + + pair_style pace/extrapolation + Examples """""""" @@ -31,50 +39,95 @@ Examples pair_style pace product chunksize 2048 pair_coeff * * Cu-PBE-core-rep.ace Cu + pair_style pace/extrapolation + pair_coeff * * Cu.yaml Cu.asi Cu + Description """"""""""" Pair style *pace* computes interactions using the Atomic Cluster Expansion (ACE), which is a general expansion of the atomic energy in -multi-body basis functions. :ref:`(Drautz) `. -The *pace* pair style -provides an efficient implementation that -is described in this paper :ref:`(Lysogorskiy) `. +multi-body basis functions. :ref:`(Drautz) `. The *pace* +pair style provides an efficient implementation that is described in +this paper :ref:`(Lysogorskiy) `. -In ACE, the total energy is decomposed into a sum over -atomic energies. The energy of atom *i* is expressed as a -linear or non-linear function of one or more density functions. -By projecting the -density onto a local atomic base, the lowest order contributions -to the energy can be expressed as a set of scalar polynomials in -basis function contributions summed over neighbor atoms. +In ACE, the total energy is decomposed into a sum over atomic +energies. The energy of atom *i* is expressed as a linear or non-linear +function of one or more density functions. By projecting the density +onto a local atomic base, the lowest order contributions to the energy +can be expressed as a set of scalar polynomials in basis function +contributions summed over neighbor atoms. Only a single pair_coeff command is used with the *pace* style which specifies an ACE coefficient file followed by N additional arguments -specifying the mapping of ACE elements to LAMMPS atom types, -where N is the number of LAMMPS atom types: +specifying the mapping of ACE elements to LAMMPS atom types, where N is +the number of LAMMPS atom types: * ACE coefficient file * N element names = mapping of ACE elements to atom types Only a single pair_coeff command is used with the *pace* style which -specifies an ACE file that fully defines the potential. -Note that unlike for other potentials, cutoffs are -not set in the pair_style or pair_coeff command; they are specified in -the ACE file. +specifies an ACE file that fully defines the potential. Note that +unlike for other potentials, cutoffs are not set in the pair_style or +pair_coeff command; they are specified in the ACE file. The pair_style *pace* command may be followed by the optional keyword -*product* or *recursive*, which determines which of two algorithms -is used for the calculation of basis functions and derivatives. -The default is *recursive*. +*product* or *recursive*, which determines which of two algorithms is +used for the calculation of basis functions and derivatives. The +default is *recursive*. -The keyword *chunksize* is only applicable when -using the pair style *pace* with the KOKKOS package on GPUs and is -ignored otherwise. This keyword controls the number of atoms -in each pass used to compute the atomic cluster expansion and is used to -avoid running out of memory. For example if there are 8192 atoms in the -simulation and the *chunksize* is set to 4096, the ACE -calculation will be broken up into two passes (running on a single GPU). +The keyword *chunksize* is only applicable when using the pair style +*pace* with the KOKKOS package on GPUs and is ignored otherwise. This +keyword controls the number of atoms in each pass used to compute the +atomic cluster expansion and is used to avoid running out of memory. +For example if there are 8192 atoms in the simulation and the +*chunksize* is set to 4096, the ACE calculation will be broken up into +two passes (running on a single GPU). + +Extrapolation grade +""""""""""""""""""" + +Calculation of extrapolation grade in PACE is implemented in `pair_style +pace/extrapolation`. It is based on the MaxVol algorithm similar to +Moment Tensor Potential (MTP) by Shapeev et al. and is described in +:ref:`(Lysogorskiy2) `. In order to compute +extrapolation grade one needs to provide: + +#. ACE potential in B-basis form (`.yaml` format) and +#. Active Set Inverted (ASI) file for corresponding potential (`.asi` format) + +Calculation of extrapolation grades requires matrix-vector +multiplication for each atom and is slower than the usual `pair_style +pace recursive`, therefore it is *not* computed by default. +Extrapolation grade calculation is involved by `fix pair`, which +requests to compute `gamma`, as shown in example below: + +.. code-block:: LAMMPS + + pair_style pace/extrapolation + pair_coeff * * Cu.yaml Cu.asi Cu + + fix pace_gamma all pair 10 pace/extrapolation gamma 1 + + compute max_pace_gamma all reduce max f_pace_gamma + variable dump_skip equal "c_max_pace_gamma < 5" + + dump pace_dump all custom 20 extrapolative_structures.dump id type x y z f_pace_gamma + dump_modify pace_dump skip v_dump_skip + + variable max_pace_gamma equal c_max_pace_gamma + fix extreme_extrapolation all halt 10 v_max_pace_gamma > 25 + +Here extrapolation grade gamma is computed every 10 steps and is stored +in `f_pace_gamma` per-atom variable. The largest value of extrapolation +grade among all atoms in a structure is reduced to `c_max_pace_gamma` +variable. Only if this value exceeds extrapolation threshold 5, then +the structure will be dumped into `extrapolative_structures.dump` file, +but not more often than every 20 steps. + +On all other steps `pair_style pace recursive` will be used. + +---------- See the :doc:`pair_coeff ` page for alternate ways to specify the path for the ACE coefficient file. @@ -90,9 +143,10 @@ specify a pair_coeff command with I != J arguments for this style. This pair style does not support the :doc:`pair_modify ` shift, table, and tail options. -This pair style does not write its information to :doc:`binary restart files `, since it is stored in potential files. Thus, you -need to re-specify the pair_style and pair_coeff commands in an input -script that reads a restart file. +This pair style does not write its information to :doc:`binary restart +files `, since it is stored in potential files. Thus, you need +to re-specify the pair_style and pair_coeff commands in an input script +that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the @@ -107,19 +161,20 @@ This pair style can only be used via the *pair* keyword of the Restrictions """""""""""" -This pair style is part of the ML-PACE package. It is only enabled if LAMMPS -was built with that package. -See the :doc:`Build package ` page for more info. +This pair style is part of the ML-PACE package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" -:doc:`pair_style snap ` +:doc:`pair_style snap `, +:doc:`fix pair ` Default """"""" -recursive, chunksize = 4096 +recursive, chunksize = 4096, .. _Drautz20191: @@ -127,4 +182,8 @@ recursive, chunksize = 4096 .. _Lysogorskiy20211: -**(Lysogorskiy)** Lysogorskiy, van der Oord, Bochkarev, Menon, Rinaldi, Hammerschmidt, Mrovec, Thompson, Csanyi, Ortner, Drautz, TBD (2021). +**(Lysogorskiy)** Lysogorskiy, van der Oord, Bochkarev, Menon, Rinaldi, Hammerschmidt, Mrovec, Thompson, Csanyi, Ortner, Drautz, npj Comp Mat, 7, 97 (2021). + +.. _Lysogorskiy2022: + +**(Lysogorskiy2022)** Lysogorskiy, Bochkarev, Mrovec, Drautz, TBS (2022). diff --git a/doc/src/pair_peri.rst b/doc/src/pair_peri.rst index 45b406dd61..1fb94acd37 100644 --- a/doc/src/pair_peri.rst +++ b/doc/src/pair_peri.rst @@ -51,8 +51,9 @@ Description """"""""""" The peridynamic pair styles implement material models that can be used -at the mesoscopic and macroscopic scales. See `this document `_ for an overview of LAMMPS commands -for Peridynamics modeling. +at the mesoscopic and macroscopic scales. See `this document +`_ for an overview of LAMMPS commands for +Peridynamics modeling. Style *peri/pmb* implements the Peridynamic bond-based prototype microelastic brittle (PMB) model. @@ -66,26 +67,27 @@ peridynamic viscoelastic solid (VES) model. Style *peri/eps* implements the Peridynamic state-based elastic-plastic solid (EPS) model. -The canonical papers on Peridynamics are :ref:`(Silling 2000) ` -and :ref:`(Silling 2007) `. The implementation of Peridynamics -in LAMMPS is described in :ref:`(Parks) `. Also see the `PDLAMMPS user guide `_ for -more details about its implementation. +The canonical papers on Peridynamics are :ref:`(Silling 2000) +` and :ref:`(Silling 2007) `. The +implementation of Peridynamics in LAMMPS is described in :ref:`(Parks) +`. Also see the :doc:`Peridynamics Howto ` for more +details about its implementation. The peridynamic VES and EPS models in PDLAMMPS were implemented by R. Rahman and J. T. Foster at University of Texas at San Antonio. The original VES formulation is described in "(Mitchell2011)" and the original EPS formulation is in "(Mitchell2011a)". Additional PDF docs -that describe the VES and EPS implementations are include in the -LAMMPS distribution in `doc/PDF/PDLammps_VES.pdf `_ and +that describe the VES and EPS implementations are include in the LAMMPS +distribution in `doc/PDF/PDLammps_VES.pdf `_ and `doc/PDF/PDLammps_EPS.pdf `_. For questions regarding the VES and EPS models in LAMMPS you can contact R. Rahman (rezwanur.rahman at utsa.edu). The following coefficients must be defined for each pair of atom types via the :doc:`pair_coeff ` command as in the examples above, -or in the data file or restart files read by the -:doc:`read_data ` or :doc:`read_restart ` -commands, or by mixing as described below. +or in the data file or restart files read by the :doc:`read_data +` or :doc:`read_restart ` commands, or by +mixing as described below. For the *peri/pmb* style: @@ -96,8 +98,8 @@ For the *peri/pmb* style: C is the effectively a spring constant for Peridynamic bonds, the horizon is a cutoff distance for truncating interactions, and s00 and -:math:`\alpha` are used as a bond breaking criteria. The units of c are such -that c/distance = stiffness/volume\^2, where stiffness is +:math:`\alpha` are used as a bond breaking criteria. The units of c are +such that c/distance = stiffness/volume\^2, where stiffness is energy/distance\^2 and volume is distance\^3. See the users guide for more details. @@ -110,8 +112,8 @@ For the *peri/lps* style: * :math:`\alpha` (unitless) K is the bulk modulus and G is the shear modulus. The horizon is a -cutoff distance for truncating interactions, and s00 and :math:`\alpha` are -used as a bond breaking criteria. See the users guide for more +cutoff distance for truncating interactions, and s00 and :math:`\alpha` +are used as a bond breaking criteria. See the users guide for more details. For the *peri/ves* style: @@ -125,12 +127,12 @@ For the *peri/ves* style: * m_taubi (unitless) K is the bulk modulus and G is the shear modulus. The horizon is a -cutoff distance for truncating interactions, and s00 and :math:`\alpha` are -used as a bond breaking criteria. m_lambdai and m_taubi are the +cutoff distance for truncating interactions, and s00 and :math:`\alpha` +are used as a bond breaking criteria. m_lambdai and m_taubi are the viscoelastic relaxation parameter and time constant, -respectively. m_lambdai varies within zero to one. For very small -values of m_lambdai the viscoelastic model responds very similar to a -linear elastic model. For details please see the description in +respectively. m_lambdai varies within zero to one. For very small values +of m_lambdai the viscoelastic model responds very similar to a linear +elastic model. For details please see the description in "(Mitchell2011)". For the *peri/eps* style: @@ -165,8 +167,9 @@ shift option. The :doc:`pair_modify ` table and tail options are not relevant for these pair styles. -These pair styles write their information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need -to be specified in an input script that reads a restart file. +These pair styles write their information to :doc:`binary restart files +`, so pair_style and pair_coeff commands do not need to be +specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the @@ -177,8 +180,9 @@ These pair styles can only be used via the *pair* keyword of the Restrictions """""""""""" -All of these styles are part of the PERI package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +All of these styles are part of the PERI package. They are only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_quip.rst b/doc/src/pair_quip.rst index c150561cb1..1cb6cf6f08 100644 --- a/doc/src/pair_quip.rst +++ b/doc/src/pair_quip.rst @@ -49,11 +49,12 @@ A QUIP potential is fully specified by the filename which contains the parameters of the potential in XML format, the initialization string, and the map of atomic numbers. -GAP potentials can be obtained from the Data repository section of -`http://www.libatoms.org `_, where the -appropriate initialization strings are also advised. The list of -atomic numbers must be matched to the LAMMPS atom types specified in -the LAMMPS data file or elsewhere. +GAP potentials can be obtained from the `GAP models and databases page +on the libAtoms homepage `https://libatoms.github.io +`_, where the appropriate +initialization strings are also advised. The list of atomic numbers must +be matched to the LAMMPS atom types specified in the LAMMPS data file or +elsewhere. Two examples input scripts are provided in the examples/PACKAGES/quip directory. diff --git a/doc/src/pair_saip_metal.rst b/doc/src/pair_saip_metal.rst index 0acf519a0e..21bfeb0aa9 100644 --- a/doc/src/pair_saip_metal.rst +++ b/doc/src/pair_saip_metal.rst @@ -32,6 +32,8 @@ Examples Description """"""""""" +.. versionadded:: 17Feb2022 + The *saip/metal* style computes the registry-dependent interlayer potential (ILP) potential for hetero-junctions formed with hexagonal 2D materials and metal surfaces, as described in :ref:`(Ouyang6) `. diff --git a/doc/src/pair_smtbq.rst b/doc/src/pair_smtbq.rst index 50b4afaf2d..ea55b2f2d9 100644 --- a/doc/src/pair_smtbq.rst +++ b/doc/src/pair_smtbq.rst @@ -182,19 +182,19 @@ For each cations (metal): * Potential parameter: - If type of potential is 'second_moment' : A (eV), *p*, - :math:`\zeta^0` (eV) and *q*, :math:`r_{c1} (\mathrm{\mathring{A}})`, :math:`r_{c2} - (\mathrm{\mathring{A}})` and :math:`r_0 (\mathrm{\mathring{A}})` - - If type of potential is 'buck' : *C* (eV) and :math:`\rho (\mathrm{\mathring{A}})` + :math:`\zeta^0` (eV) and *q*, :math:`r_{c1} (\AA)`, :math:`r_{c2} + (\AA)` and :math:`r_0 (\AA)` + - If type of potential is 'buck' : *C* (eV) and :math:`\rho (\AA)` - If type of potential is 'buckPlusAttr' : *C* (eV) and :math:`\rho - (\mathrm{\mathring{A}})` *D* (eV), *B* :math:`(\mathrm{\mathring{A}}^{-1})`, :math:`r^{OO}_1 (\mathrm{\mathring{A}})` and - :math:`r^{OO}_2 (\mathrm{\mathring{A}})` + (\AA)` *D* (eV), *B* :math:`(\AA^{-1})`, :math:`r^{OO}_1 (\AA)` and + :math:`r^{OO}_2 (\AA)` * Divider line 4) Tables parameters: * Cutoff radius for the Coulomb interaction (:math:`R_{coul}`) -* Starting radius (:math:`r_{min} = 1,18845 \mathrm{\mathring{A}}`) and increments - (:math:`dr = 0.001 \mathrm{\mathring{A}}`) for creating the potential table. +* Starting radius (:math:`r_{min} = 1,18845 \AA`) and increments + (:math:`dr = 0.001 \AA`) for creating the potential table. * Divider line 5) Rick model parameter: @@ -208,7 +208,7 @@ For each cations (metal): 6) Coordination parameter: * First (:math:`r_{1n}`) and second (:math:`r_{2n}`) neighbor distances - in angstrom + in Angstrom * Divider line 7) Charge initialization mode: diff --git a/doc/src/pair_srp.rst b/doc/src/pair_srp.rst index 6c9a128447..7122c40c1e 100644 --- a/doc/src/pair_srp.rst +++ b/doc/src/pair_srp.rst @@ -132,6 +132,8 @@ at the cutoff distance :math:`r_c`. ---------- +.. versionadded:: 3Aug2022 + Pair style *srp/react* interfaces the pair style *srp* with the bond breaking and formation mechanisms provided by fix *bond/break* and fix *bond/create*, respectively. When using this pair style, whenever a diff --git a/doc/src/pair_style.rst b/doc/src/pair_style.rst index ccd9b0ab1b..48daf34f17 100644 --- a/doc/src/pair_style.rst +++ b/doc/src/pair_style.rst @@ -313,6 +313,7 @@ accelerated styles exist. * :doc:`oxrna2/stk ` - * :doc:`oxrna2/xstk ` - * :doc:`pace ` - Atomic Cluster Expansion (ACE) machine-learning potential +* :doc:`pace/extrapolation ` - Atomic Cluster Expansion (ACE) machine-learning potential with extrapolation grades * :doc:`pod ` - Proper orthogonal decomposition (POD) machine-learning potential * :doc:`peri/eps ` - peridynamic EPS potential * :doc:`peri/lps ` - peridynamic LPS potential @@ -374,6 +375,7 @@ accelerated styles exist. * :doc:`vashishta ` - Vashishta 2-body and 3-body potential * :doc:`vashishta/table ` - * :doc:`wf/cut ` - Wang-Frenkel Potential for short-ranged interactions +* :doc:`ylz ` - Yuan-Li-Zhang Potential for anisotropic interactions * :doc:`yukawa ` - Yukawa potential * :doc:`yukawa/colloid ` - screened Yukawa potential for finite-size particles * :doc:`zbl ` - Ziegler-Biersack-Littmark potential diff --git a/doc/src/pair_sw.rst b/doc/src/pair_sw.rst index 438eabc711..579e4c6f3f 100644 --- a/doc/src/pair_sw.rst +++ b/doc/src/pair_sw.rst @@ -130,6 +130,8 @@ terms. so the inconsistency between potential and force can be neglected in actual simulations. +.. versionadded:: 3Aug2022 + The *threebody* keyword is optional and determines whether or not the three-body term of the potential is calculated. The default value is "on" and it is only available for the plain *sw* pair style variants, diff --git a/doc/src/pair_ylz.rst b/doc/src/pair_ylz.rst new file mode 100644 index 0000000000..5c3738f509 --- /dev/null +++ b/doc/src/pair_ylz.rst @@ -0,0 +1,177 @@ +.. index:: pair_style ylz + +pair_style ylz command +=========================== + +Syntax +"""""" + +.. code-block:: LAMMPS + + pair_style ylz cutoff + + +* cutoff = global cutoff for interactions (distance units) + +Examples +"""""""" + +.. code-block:: LAMMPS + + pair_style ylz 2.6 + pair_coeff * * 1.0 1.0 4 3 0.0 2.6 + + +Description +""""""""""" + +.. versionadded:: 3Nov2022 + +The *ylz* (Yuan-Li-Zhang) style computes an anisotropic interaction +between pairs of coarse-grained particles considering the relative +particle orientations. This potential was originally developed as a +particle-based solvent-free model for biological membranes +:ref:`(Yuan2010a) `. Unlike :doc:`pair_style gayberne +`, whose orientation dependence is strictly derived from +the closest distance between two ellipsoidal rigid bodies, the +orientation-dependence of this pair style is mathematically defined such +that the particles can self-assemble into one-particle-thick fluid +membranes. The potential of this pair style is described by: + +.. math:: + + U ( \mathbf{r}_{ij}, \mathbf{n}_i, \mathbf{n}_j ) =\left\{\begin{matrix} {u}_R(r)+\left [ 1-\phi (\mathbf{\hat{r}}_{ij}, \mathbf{n}_i, \mathbf{n}_j ) \right ]\epsilon, ~~ r<{r}_{min} \\ {u}_A(r)\phi (\mathbf{\hat{r}}_{ij}, \mathbf{n}_i, \mathbf{n}_j ),~~ {r}_{min}`, nanoparticle +endocytosis :ref:`(Huang) `, modeling of red blood cell membranes +:ref:`(Fu) `, :ref:`(Appshaw) `, and modeling of cell +elasticity :ref:`(Becton) `. + +Use of this pair style requires the NVE, NVT, or NPT fixes with the +*asphere* extension (e.g. :doc:`fix nve/asphere `) in +order to integrate particle rotation. Additionally, :doc:`atom_style +ellipsoid ` should be used since it defines the rotational +state of each particle. + +The following coefficients must be defined for each pair of atoms types +via the :doc:`pair_coeff ` command as in the examples above, +or in the data file or restart files read by the :doc:`read_data +` or :doc:`read_restart ` commands, or by +mixing as described below: + +* :math:`\epsilon` = well depth (energy units) +* :math:`\sigma` = minimum effective particle radii (distance units) +* :math:`\zeta` = tune parameter for the slope of the attractive branch +* :math:`\mu` = parameter related to bending rigidity +* :math:`\beta` = parameter related to the spontaneous curvature +* cutoff (distance units) + +The last coefficient is optional. If not specified, the global +cutoff specified in the pair_style command is used. + +---------- + +Mixing, shift, table, tail correction, restart, rRESPA info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +For atom type pairs I,J and I != J, the epsilon and sigma coefficients +and cutoff distance for this pair style can be mixed. The default mix +value is *geometric*\ . See the "pair_modify" command for details. + +The :doc:`pair_modify ` table option is not relevant for +this pair style. + +This pair style does not support the :doc:`pair_modify ` +tail option for adding long-range tail corrections to energy and +pressure. + +This pair style writes its information to :doc:`binary restart files +`, so pair_style and pair_coeff commands do not need to be +specified in an input script that reads a restart file. + +This pair style can only be used via the *pair* keyword of the +:doc:`run_style respa ` command. It does not support the +*inner*, *middle*, *outer* keywords. + +---------- + +Restrictions +"""""""""""" + +The *ylz* style is part of the ASPHERE package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. + +This pair style requires that atoms store torque and a quaternion to +represent their orientation, as defined by the :doc:`atom_style +`. It also requires they store a per-atom :doc:`shape +`. The particles cannot store a per-particle diameter. To avoid +being mistakenly considered as point particles, the shape parameters ought +to be non-spherical, like [1 0.99 0.99]. Unlike the :doc:`resquared +` pair style for which the shape directly determines the +mathematical expressions of the potential, the shape parameters for this +pair style is only involved in the computation of the moment of inertia +and thus only influences the rotational dynamics of individual +particles. + +This pair style requires that **all** atoms are ellipsoids as defined by +the :doc:`atom_style ellipsoid ` command. + + +Related commands +"""""""""""""""" + +:doc:`pair_coeff `, :doc:`fix nve/asphere +:doc:`, `compute temp/asphere `, +:doc::doc:`pair_style resquared `, :doc:`pair_style +:doc:gayberne ` + +Default +""""""" + +none + +---------- + +.. _Yuan: + +**(Yuan2010a)** Yuan, Huang, Li, Lykotrafitis, Zhang, Phys. Rev. E, 82, 011905(2010). + +**(Yuan2010b)** Yuan, Huang, Zhang, Soft. Matter, 6, 4571(2010). + +.. _Huang: + +**(Huang)** Huang, Zhang, Yuan, Gao, Zhang, Nano Lett. 13, 4546(2013). + +.. _Fu: + +**(Fu)** Fu, Peng, Yuan, Kfoury, Young, Comput. Phys. Commun, 210, 193-203(2017). + +.. _Appshaw: + +**(Appshaw)** Appshaw, Seddon, Hanna, Soft. Matter,18, 1747(2022). + +.. _Becton: + +**(Becton)** Becton, Averett, Wang, Biomech. Model. Mechanobiology, 18, 425-433(2019). diff --git a/doc/src/pair_zbl.rst b/doc/src/pair_zbl.rst index 6c698b23d2..1986fffa4d 100644 --- a/doc/src/pair_zbl.rst +++ b/doc/src/pair_zbl.rst @@ -73,7 +73,7 @@ be included in a pair_coeff command. The numerical values of the exponential decay constants in the screening function depend on the unit of distance. In the above - equation they are given for units of angstroms. LAMMPS will + equation they are given for units of Angstroms. LAMMPS will automatically convert these values to the distance unit of the specified LAMMPS :doc:`units ` setting. The values of Z should always be given as multiples of a proton's charge, e.g. 29.0 for diff --git a/doc/src/pair_zero.rst b/doc/src/pair_zero.rst index 062b5204f8..0e6bac643a 100644 --- a/doc/src/pair_zero.rst +++ b/doc/src/pair_zero.rst @@ -8,11 +8,12 @@ Syntax .. code-block:: LAMMPS - pair_style zero cutoff [nocoeff] + pair_style zero cutoff [nocoeff] [full] * zero = style name of this pair style * cutoff = global cutoff (distance units) * nocoeff = ignore all pair_coeff parameters (optional) +* full = build full neighbor list (optional) Examples """""""" @@ -45,6 +46,9 @@ section for any pair style. Similarly, any pair_coeff commands will only be checked for the atom type numbers and the rest ignored. In this case, only the global cutoff will be used. +The optional *full* flag builds a full neighbor list instead of the default +half neighbor list. + The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above, or in the data file or restart files read by the diff --git a/doc/src/plugin.rst b/doc/src/plugin.rst index 1a10ab84ad..41e2621fef 100644 --- a/doc/src/plugin.rst +++ b/doc/src/plugin.rst @@ -59,6 +59,8 @@ The *clear* command will unload all currently loaded plugins. .. admonition:: Automatic loading of plugins :class: note + .. versionadded:: 4May2022 + When the environment variable ``LAMMPS_PLUGIN_PATH`` is set, then LAMMPS will search the directory (or directories) listed in this path for files with names that end in ``plugin.so`` diff --git a/doc/src/prd.rst b/doc/src/prd.rst index 758aa4f570..0f6e9e481f 100644 --- a/doc/src/prd.rst +++ b/doc/src/prd.rst @@ -18,7 +18,7 @@ Syntax * compute-ID = ID of the compute used for event detection * random_seed = random # seed (positive integer) * zero or more keyword/value pairs may be appended -* keyword = *min* or *temp* or *vel* +* keyword = *min* or *temp* or *vel* or *time* .. parsed-literal:: diff --git a/doc/src/processors.rst b/doc/src/processors.rst index d717fa9b73..e4279c00ea 100644 --- a/doc/src/processors.rst +++ b/doc/src/processors.rst @@ -18,18 +18,17 @@ Syntax *grid* arg = gstyle params ... gstyle = *onelevel* or *twolevel* or *numa* or *custom* - onelevel params = none - twolevel params = Nc Cx Cy Cz + *onelevel* params = none + *twolevel* params = Nc Cx Cy Cz Nc = number of cores per node Cx,Cy,Cz = # of cores in each dimension of 3d sub-grid assigned to each node - numa params = none - custom params = infile + *numa* params = none + *custom* params = infile infile = file containing grid layout *map* arg = *cart* or *cart/reorder* or *xyz* or *xzy* or *yxz* or *yzx* or *zxy* or *zyx* cart = use MPI_Cart() methods to map processors to 3d grid with reorder = 0 cart/reorder = use MPI_Cart() methods to map processors to 3d grid with reorder = 1 xyz,xzy,yxz,yzx,zxy,zyx = map processors to 3d grid in IJK ordering - *numa* arg = none *part* args = Psend Precv cstyle Psend = partition # (1 to Np) which will send its processor layout Precv = partition # (1 to Np) which will recv the processor layout diff --git a/doc/src/read_data.rst b/doc/src/read_data.rst index 858029caae..961b92c83e 100644 --- a/doc/src/read_data.rst +++ b/doc/src/read_data.rst @@ -71,8 +71,14 @@ Also see the explanation of the :doc:`-restart command-line switch This command can be used multiple times to add new atoms and their properties to an existing system by using the *add*, *offset*, and -*shift* keywords. See more details below, which includes the use case -for the *extra* keywords. +*shift* keywords. However, it is important to understand that several +system parameters, like the number of types of different kinds and per +atom settings are **locked in** after the first *read_data* command, +which means that no type ID (including its offset) may have a larger +value when processing additional data files than what is set by the +first data file and the corresponding *read_data* command options. See +more details on this situation below, which includes the use case for +the *extra* keywords. The *group* keyword adds all the atoms in the data file to the specified group-ID. The group will be created if it does not already diff --git a/doc/src/read_dump.rst b/doc/src/read_dump.rst index c98347914b..bee4629dfd 100644 --- a/doc/src/read_dump.rst +++ b/doc/src/read_dump.rst @@ -266,6 +266,8 @@ replace properties of the current system. There are various options for how this is done, determined by the specified fields and optional keywords. +.. versionchanged:: 3Aug2022 + The timestep of the snapshot becomes the current timestep for the simulation unless the *timestep* keyword is specified with a *no* value (default setting is *yes*). See the :doc:`reset_timestep ` @@ -397,4 +399,4 @@ Default The option defaults are box = yes, timestep = yes, replace = yes, purge = no, trim = no, add = no, scaled = no, wrapped = yes, and format = native. -.. _vmd: http://www.ks.uiuc.edu/Research/vmd +.. _vmd: https://www.ks.uiuc.edu/Research/vmd diff --git a/doc/src/region.rst b/doc/src/region.rst index db09bcfd42..4ebd731073 100644 --- a/doc/src/region.rst +++ b/doc/src/region.rst @@ -162,6 +162,8 @@ Thus the third example above specifies a cylinder with its axis in the y-direction located at x = 2.0 and z = 3.0, with a radius of 5.0, and extending in the y-direction from -5.0 to the upper box boundary. +.. versionadded:: 4May2022 + For style *ellipsoid*, an axis-aligned ellipsoid is defined. The ellipsoid has its center at (x,y,z) and is defined by 3 axis-aligned vectors given by A = (a,0,0); B = (0,b,0); C = (0,0,c). Note that diff --git a/doc/src/run_style.rst b/doc/src/run_style.rst index e8ba264495..fdbdcd228c 100644 --- a/doc/src/run_style.rst +++ b/doc/src/run_style.rst @@ -101,7 +101,7 @@ Py2 by Pz2, then Px1 must be an integer multiple of Px2, and similarly for Py1 a multiple of Py2, and Pz1 a multiple of Pz2. Typically the best way to do this is to let the first partition choose -its onn optimal layout, then require the second partition's layout to +its own optimal layout, then require the second partition's layout to match the integer multiple constraint. See the :doc:`processors ` command with its *part* keyword for a way to control this, e.g. @@ -221,7 +221,7 @@ impropers, and dihedrals can be computed on this innermost 0.5 fs step. The outermost timestep cannot be greater than 4.0 fs without risking energy drift. Smooth switching of forces between the levels of the rRESPA hierarchy is also necessary to avoid drift, and a 1-2 -angstrom "healing distance" (the distance between the outer and inner +Angstrom "healing distance" (the distance between the outer and inner cutoffs) works reasonably well. We thus recommend the following settings for use of the *respa* style without SHAKE in biomolecular simulations: @@ -277,7 +277,7 @@ Even a LJ system can benefit from rRESPA if the interactions are divided by the inner, middle and outer keywords. A 2-fold or more speedup can be obtained while maintaining good energy conservation. In real units, for a pure LJ fluid at liquid density, with a sigma of -3.0 angstroms, and epsilon of 0.1 Kcal/mol, the following settings +3.0 Angstroms, and epsilon of 0.1 kcal/mol, the following settings seem to work well: .. code-block:: LAMMPS diff --git a/doc/src/tad.rst b/doc/src/tad.rst index b36ad2e431..cc6d52d415 100644 --- a/doc/src/tad.rst +++ b/doc/src/tad.rst @@ -18,7 +18,7 @@ Syntax * tmax = reciprocal of lowest expected pre-exponential factor (time units) * compute-ID = ID of the compute used for event detection * zero or more keyword/value pairs may be appended -* keyword = *min* or *neb* or *min_style* or *neb_style* or *neb_log* +* keyword = *min* or *neb* or *neb_style* or *neb_step* or *neb_log* .. parsed-literal:: diff --git a/doc/src/thermo_modify.rst b/doc/src/thermo_modify.rst index 2600b337bc..1bee26c289 100644 --- a/doc/src/thermo_modify.rst +++ b/doc/src/thermo_modify.rst @@ -28,6 +28,7 @@ Syntax *format* values = *line* string, *int* string, *float* string, ID string, or *none* string = C-style format string ID = integer from 1 to N, or integer from -1 to -N, where N = # of quantities being output + *or* an integer range such as 2*6 (negative values are not allowed) *or* a thermo keyword or reference to compute, fix, property or variable. *temp* value = compute ID that calculates a temperature *press* value = compute ID that calculates a pressure @@ -65,10 +66,10 @@ atom can be "lost" if it moves across a non-periodic simulation box :doc:`boundary ` or if it moves more than a box length outside the simulation domain (or more than a processor sub-domain length) before reneighboring occurs. The latter case is typically due to bad -dynamics, e.g. too large a timestep or huge forces and velocities. If +dynamics (e.g., too large a time step and/or huge forces and velocities). If the value is *ignore*, LAMMPS does not check for lost atoms. If the value is *error* or *warn*, LAMMPS checks and either issues an error or -warning. The code will exit with an error and continue with a warning. +warning. The simulation will exit with an error and continue with a warning. A warning will only be issued once, the first time an atom is lost. This can be a useful debugging option. @@ -89,10 +90,10 @@ that should be investigated, but LAMMPS cannot determine for certain whether they are an indication of an error. Some warning messages are printed during a run (or immediately before) -each time a specific MPI rank encounters the issue, e.g. bonds that are -stretched too far or dihedrals in extreme configurations. These number +each time a specific MPI rank encounters the issue (e.g., bonds that are +stretched too far or dihedrals in extreme configurations). These number of these can quickly blow up the size of the log file and screen output. -Thus a limit of 100 warning messages is applied by default. The warning +Thus, a limit of 100 warning messages is applied by default. The warning count is applied to the entire input unless reset with a ``thermo_modify warn reset`` command. If there are more warnings than the limit, LAMMPS will print one final warning that it will not print any additional @@ -160,8 +161,8 @@ for a column or field of thermodynamic output. The setting for *ID string* replaces the default text with the provided string. *ID* can be a positive integer when it represents the column number counting from the left, a negative integer when it represents the column number from -the right (i.e. -1 is the last column/keyword), or a thermo keyword (or -compute, fix, property, or variable reference) and then it replaces the +the right (i.e., :math:`-1` is the last column/keyword), or a thermo keyword +(or compute, fix, property, or variable reference) and then it replaces the string for that specific thermo keyword. The *colname* keyword can be used multiple times. If multiple *colname* @@ -171,19 +172,22 @@ to their default values. The *format* keyword can be used to change the default numeric format of any of quantities the :doc:`thermo_style ` command -outputs. All the specified format strings are C-style formats, e.g. as -used by the C/C++ printf() command. The *line* keyword takes a single +outputs. All the specified format strings are C-style formats (i.e., as +used by the C/C++ printf() command). The *line* keyword takes a single argument which is the format string for the entire line of thermo -output, with N fields, which you must enclose in quotes if it is more +output, with :math:`N` fields, which you must enclose in quotes if it is more than one field. The *int* and *float* keywords take a single format argument and are applied to all integer or floating-point quantities output. The setting for *ID string* also takes a single format argument -which is used for the indexed value in each line. The interpretation is -the same as for *colname*, i.e. a positive integer is the n-th value +that is used for the indexed value in each line. The interpretation is +the same as for *colname* (i.e., a positive integer is the n-th value corresponding to the n-th thermo keyword, a negative integer is counting -backwards, and a string matches the entry with the thermo keyword., -e.g. the fifth column is output in high precision for "format 5 %20.15g" -and the pair energy for "format epair %20.15g". +backwards, and a string matches the entry with the thermo keyword). +For example, the fifth column is output in high precision for +"format 5 %20.15g", and the pair energy for "format epair %20.15g". +The *ID* field can be a range, such as "3\*6", "*", "2*", or "\*3"; +in such cases, all fields in the range (inclusive) are set to the specified +format string. Ranges containing negative numbers are not supported. The *format* keyword can be used multiple times. The precedence is that for each value in a line of output, the *ID* format (if specified) @@ -201,8 +205,8 @@ settings, reverting all values to their default format. to the corresponding 8-byte form when it is applied to those keywords. However, when specifying the *line* option or *format ID string* option for *step* and *natoms*, you should specify a format - string appropriate for an 8-byte signed integer, e.g. one with "%ld" - or "%lld" depending on the platform. + string appropriate for an 8-byte signed integer (i.e., one with "%ld" + or "%lld", depending on the platform). The *temp* keyword is used to determine how thermodynamic temperature is calculated, which is used by all thermo quantities that require a diff --git a/doc/src/units.rst b/doc/src/units.rst index da81c17078..2554806fb5 100644 --- a/doc/src/units.rst +++ b/doc/src/units.rst @@ -30,7 +30,7 @@ and dump files. Typically, this command is used at the very beginning of an input script. For all units except *lj*, LAMMPS uses physical constants from -www.physics.nist.gov. For the definition of Kcal in real units, +www.physics.nist.gov. For the definition of kcal in real units, LAMMPS uses the thermochemical calorie = 4.184 J. The choice you make for units simply sets some internal conversion @@ -102,17 +102,17 @@ For style *real*, these are the units: * mass = grams/mole * distance = Angstroms * time = femtoseconds -* energy = Kcal/mole +* energy = kcal/mol * velocity = Angstroms/femtosecond -* force = Kcal/mole-Angstrom -* torque = Kcal/mole +* force = (kcal/mol)/Angstrom +* torque = kcal/mol * temperature = Kelvin * pressure = atmospheres * dynamic viscosity = Poise * charge = multiple of electron charge (1.0 is a proton) * dipole = charge\*Angstroms * electric field = volts/Angstrom -* density = gram/cm\^dim +* density = g/cm\^dim For style *metal*, these are the units: diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 969c3f1fe2..fce5a62a55 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -213,6 +213,9 @@ from the list of active variables, and is thus available to be re-defined in a subsequent variable command. The *delete* style does the same thing. +Variables are **not** deleted by the :doc:`clear ` command with +the exception of atomfile-style variables. + ---------- The :doc:`Commands parse ` page explains how @@ -265,7 +268,7 @@ the first string is assigned to the variable. Each time a string is assigned. All processors assign the same string to the variable. -*Index* style variables with a single string value can also be set by +Index-style variables with a single string value can also be set by using the :doc:`command-line switch -var `. The *loop* style is identical to the *index* style except that the @@ -285,7 +288,7 @@ be one string for each processor partition or "world". LAMMPS can be run with multiple partitions via the :doc:`-partition command-line switch `. This variable command assigns one string to each world. All processors in the world are assigned the same string. -The next command cannot be used with *equal* style variables, since +The next command cannot be used with equal-style variables, since there is only one value per world. This style of variable is useful when you wish to run different simulations on different partitions, or when performing a parallel tempering simulation (see the :doc:`temper @@ -303,7 +306,7 @@ string. This continues until all the variable strings are consumed. Thus, this command can be used to run 50 simulations on 8 processor partitions. The simulations will be run one after the other on whatever partition becomes available, until they are all finished. -*Universe* style variables are incremented using the files +Universe-style variables are incremented using the files "tmp.lammps.variable" and "tmp.lammps.variable.lock" which you will see in your directory during such a LAMMPS run. @@ -319,11 +322,12 @@ in the input script, or if the script is read again in a loop. The other difference is that *string* performs variable substitution even if the string parameter is quoted. -For the *format* style, an equal-style variable is specified along -with a C-style format string, e.g. "%f" or "%.10g", which must be -appropriate for formatting a double-precision floating-point value. -The default format is "%.15g". This variable style allows an -equal-style variable to be formatted precisely when it is evaluated. +For the *format* style, an equal-style or compatible variable is +specified along with a C-style format string, e.g. "%f" or "%.10g", +which must be appropriate for formatting a double-precision +floating-point value and may not have extra characters. The default +format is "%.15g". This variable style allows an equal-style variable +to be formatted precisely when it is evaluated. Note that if you simply wish to print a variable value with desired precision to the screen or logfile via the :doc:`print ` or @@ -340,7 +344,9 @@ variable can be used to adapt the behavior of LAMMPS input scripts via environment variable settings, or to retrieve information that has been previously stored with the :doc:`shell putenv ` command. Note that because environment variable settings are stored by the -operating systems, they persist beyond a :doc:`clear ` command. +operating systems, they persist even if the corresponding *getenv* +style variable is deleted, and also are set for sub-shells executed +by the :doc:`shell ` command. For the *file* style, a filename is provided which contains a list of strings to assign to the variable, one per line. The strings can be @@ -372,7 +378,9 @@ This means the variable can then be evaluated as many times as desired and will return those values. There are two ways to cause the next set of per-atom values from the file to be read: use the :doc:`next ` command or the next() function in an atom-style -variable, as discussed below. +variable, as discussed below. Unlike most variable styles +atomfile-style variables are **deleted** during a :doc:`clear ` +command. The rules for formatting the file are as follows. Each time a set of per-atom values is read, a non-blank line is searched for in the file. diff --git a/doc/src/velocity.rst b/doc/src/velocity.rst index cd283de399..c1afaf2edc 100644 --- a/doc/src/velocity.rst +++ b/doc/src/velocity.rst @@ -33,7 +33,7 @@ Syntax *angular* = zero the angular momentum * zero or more keyword/value pairs may be appended -* keyword = *dist* or *sum* or *mom* or *rot* or *temp* or *bias* or *loop* or *units* +* keyword = *dist* or *sum* or *mom* or *rot* or *temp* or *bias* or *loop* or *rigid* or *units* .. parsed-literal:: diff --git a/doc/utils/converters/lammpsdoc/txt2html.py b/doc/utils/converters/lammpsdoc/txt2html.py index ed9f47a4e4..93f1b257a5 100644 --- a/doc/utils/converters/lammpsdoc/txt2html.py +++ b/doc/utils/converters/lammpsdoc/txt2html.py @@ -3,7 +3,7 @@ # # Python rewrite of txt2html # The original txt2html was written in C by Steve Plimpton -# (http://www.cs.sandia.gov/cgi-bin/sjplimp/) +# (https://sjplimp.github.io/) # # Copyright (C) 2015 Richard Berger # diff --git a/doc/utils/sphinx-config/LAMMPSLexer.py b/doc/utils/sphinx-config/LAMMPSLexer.py index 116cdb7388..524d7bf1fa 100644 --- a/doc/utils/sphinx-config/LAMMPSLexer.py +++ b/doc/utils/sphinx-config/LAMMPSLexer.py @@ -9,8 +9,8 @@ LAMMPS_COMMANDS = ("angle_coeff", "angle_style", "atom_modify", "atom_style", "displace_atoms", "dump_modify", "dynamical_matrix", "echo", "elif", "else", "fix_modify", "group2ndx", "hyper", "if", "improper_coeff", "improper_style", "include", "info", "jump", "kim", -"kspace_modify", "kspace_style", "label", "lattice", -"log", "mass", "message", "minimize", "min_modify", "min_style", "molecule", +"kspace_modify", "kspace_style", "label", "labelmap", "lattice", "log", +"mass", "mdi", "message", "minimize", "min_modify", "min_style", "molecule", "ndx2group", "neb", "neb/spin", "neighbor", "neigh_modify", "newton", "next", "package", "pair_coeff", "pair_modify", "pair_style", "pair_write", "partition", "prd", "print", "processors", "python", "quit", "read_data", diff --git a/doc/utils/sphinx-config/_static/css/lammps.css b/doc/utils/sphinx-config/_static/css/lammps.css index cbf08c3da1..2a5b425535 100644 --- a/doc/utils/sphinx-config/_static/css/lammps.css +++ b/doc/utils/sphinx-config/_static/css/lammps.css @@ -1,3 +1,11 @@ +.math { + text-align: left; +} + +.eqno { + float: right; +} + .wy-nav-content { max-width: 100% !important; } diff --git a/doc/utils/sphinx-config/_themes/lammps_theme/static/css/theme.css b/doc/utils/sphinx-config/_themes/lammps_theme/static/css/theme.css index 0d9ae7e1a4..5f393d1f32 100644 --- a/doc/utils/sphinx-config/_themes/lammps_theme/static/css/theme.css +++ b/doc/utils/sphinx-config/_themes/lammps_theme/static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:""}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} diff --git a/doc/utils/sphinx-config/conf.py.in b/doc/utils/sphinx-config/conf.py.in index c89aa8b4ae..9765bd0c11 100644 --- a/doc/utils/sphinx-config/conf.py.in +++ b/doc/utils/sphinx-config/conf.py.in @@ -38,7 +38,7 @@ sys.path.append(os.path.join(LAMMPS_DOC_DIR, 'src', '_ext')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +needs_sphinx = '5.2.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom @@ -53,10 +53,6 @@ extensions = [ 'tab_or_note', 'breathe', ] -# 2017-12-07: commented out, since this package is broken with Sphinx 16.x -# yet we can no longer use Sphinx 15.x, since that breaks with -# newer version of the multiprocessor module. -# 'sphinxcontrib.images', images_config = { 'default_image_width' : '25%', @@ -159,7 +155,6 @@ pygments_style = 'default' # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False - # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for @@ -264,8 +259,18 @@ else: html_math_renderer = 'mathjax' # use relative path for mathjax, so it is looked for in the -# html tree and the manual becomes readable when offline +# html tree and the manual becomes readable when offline mathjax_path = 'mathjax/es5/tex-mml-chtml.js' + +# hack to enable use of \AA in :math: +rst_prolog = r""" + +.. only:: html + + :math:`\renewcommand{\AA}{\text{Å}}` + +""" + # -- Options for LaTeX output --------------------------------------------- latex_elements = { @@ -278,6 +283,48 @@ latex_elements = { # Additional stuff for the LaTeX preamble. 'preamble': r''' \setcounter{tocdepth}{2} +\renewcommand{\sfdefault}{ptm} % Use Times New Roman font for \textrm +\renewcommand{\sfdefault}{phv} % Use Helvetica font for \textsf +% Set up math fonts to match text fonts +\DeclareSymbolFont{operators} {OT1}{ptm}{m}{n} +\DeclareSymbolFont{bold} {OT1}{ptm}{bx}{n} +\DeclareSymbolFont{italic} {OT1}{ptm}{m}{it} +\DeclareSymbolFont{extraops} {OT1}{ztmcm}{m}{n} +\DeclareSymbolFont{letters} {OML}{ztmcm}{m}{it} +\DeclareSymbolFont{largesymbols}{OMX}{ztmcm}{m}{n} +% symbols (and \mathcal) are taken from computer modern. +% setup mappings +\DeclareSymbolFontAlphabet{\mathrm} {operators} +\DeclareSymbolFontAlphabet{\mathnormal}{letters} +\DeclareMathAlphabet{\mathnormal}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mathrm}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mathbf}{OT1}{ptm}{bx}{n} +\DeclareMathAlphabet{\mathit}{OT1}{ptm}{m}{it} +\DeclareMathAlphabet{\mathtt}{OT1}{pcr}{m}{n} +\SetMathAlphabet\mathit{bold}{OT1}{ptm}{bx}{it} +% declare missing operators +\DeclareMathSymbol{\omicron}{0}{operators}{`\o} +\DeclareMathSymbol{\Gamma}{\mathalpha}{extraops}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{extraops}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{extraops}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{extraops}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{extraops}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{extraops}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{extraops}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{extraops}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{extraops}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{extraops}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{extraops}{"0A} + +\renewcommand{\AA}{\mbox{\textrm{\r{A}}}} +% Make ToC number fields wider to accommodate sections with >= 100 subsections +% or >= 10 subsections with >= 10 subsubsections +\makeatletter +\renewcommand*{\sphinxtableofcontentshook}{% + \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{3.1em}} + \renewcommand*\l@subsection{\@dottedtocline{2}{4.6em}{4.5em}} +} +\makeatother ''' } @@ -362,9 +409,9 @@ at Sandia National Laboratories, a US Department of Energy facility, with funding from the DOE. It is an open-source code, distributed freely under the terms of the GNU Public License (GPL). -The primary author of the code is Steve Plimpton, who can be emailed -at sjplimp@sandia.gov. The LAMMPS WWW Site at www.lammps.org has -more information about the code and its uses. +The LAMMPS developers can be contacted at developers@lammps.org. +The LAMMPS WWW Site at www.lammps.org has more information about +the code and its uses. """ epub_author = 'The LAMMPS Developers' diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 15316b4f09..61c1d45ba7 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -78,6 +78,7 @@ Alexey ali aliceblue Allinger +allocatable allocator allocators allosws @@ -122,6 +123,7 @@ Antonelli api Apoorva Appl +Appshaw apptainer Apu arallel @@ -180,6 +182,7 @@ Avalos avalue aveforce Avendano +Averett avi AVX awpmd @@ -236,6 +239,7 @@ bcolor bdiam bdw Beckman +Becton Belak Bellott bem @@ -269,6 +273,7 @@ bilayers binsize binstyle binutils +Biomech biomolecular biomolecule Biomolecules @@ -599,6 +604,7 @@ Cummins Cundall cundall Curk +curv Cusentino customIDs cutbond @@ -657,6 +663,7 @@ Dcut de dE De +deallocate deallocated debye Debye @@ -691,6 +698,7 @@ dequidt Dequidt der dereference +dereferenced derekt Deresiewicz Derjagin @@ -747,6 +755,7 @@ dirname discoverable discretization discretized +discretizing disp dissipative Dissipative @@ -915,9 +924,11 @@ emax Emax Embt emi +Emmrich emol eN endian +endocytosis energetics energyCorr eng @@ -1080,7 +1091,7 @@ filesystem filesystems Fily Fincham -Finchham +Fint fingerprintconstants fingerprintsperelement Finnis @@ -1093,6 +1104,7 @@ flagHI flaglog flagN flagVF +flang fld floralwhite Florez @@ -1148,6 +1160,7 @@ ftm ftol fuer fugacity +Fu Fumi func funcs @@ -1204,6 +1217,7 @@ gewald Gezelter Gflop gfortran +ghostneigh ghostwhite Giacomo gif @@ -1298,6 +1312,7 @@ Hamaker Hamel Hammerschmidt Hanley +Hanna haptic Haque Hara @@ -1482,6 +1497,7 @@ interfacial interial interlayer intermolecular +interoperable Interparticle interstitials intertube @@ -1648,6 +1664,7 @@ kepler keV Keyes keyfile +Kfoury Khersonskii Khrapak Khvostov @@ -1903,6 +1920,7 @@ lwsock lx ly Lybrand +Lykotrafitis lyon Lysogorskiy Lyulin @@ -2013,6 +2031,7 @@ MEAM meamf meanDist mech +Mechanobiology Mecke mediumaquamarine mediumblue @@ -2122,6 +2141,7 @@ modelled modelling Modelling Modine +moduli mofff MOFFF Mohd @@ -2137,6 +2157,7 @@ Monaghan Monaghans monodisperse monodispersity +monolayer monopole monovalent Montalenti @@ -2381,6 +2402,7 @@ Nmols nn nnodes npits +npj nO Nocedal nocite @@ -2412,6 +2434,7 @@ normy normz Noskov noslip +notational noticable Nout noutcol @@ -2527,7 +2550,6 @@ oneAPI onelevel oneway onlysalt -onn ons OO Oord @@ -2725,6 +2747,7 @@ Polym polymorph polymorphism Ponder +Ponte popen Popoola Popov @@ -2772,6 +2795,7 @@ ps Ps pscreen pscrozi +Pseudocode pseudodynamics pseudopotential pSp @@ -3129,8 +3153,10 @@ seagreen Secor sectoring sed +Seddon segmental Seifert +Seleson sellerio Sellerio Semaev @@ -3154,6 +3180,7 @@ sfree Sg Shan Shanno +Shapeev shapex shapey shapez @@ -3209,7 +3236,7 @@ slategray slater Slepoy Sliozberg -sLLG +sLL sllod sm smallbig @@ -3610,6 +3637,7 @@ Universite unix unmaintained unoptimized +unordered unpadded unphysical unphysically @@ -3620,6 +3648,7 @@ unsmoothed unsolvated unsplit unstrained +unstretched untar untilted Unwin @@ -3674,6 +3703,7 @@ vdw vdW vdwl vec +Vecchio vectorial vectorization Vectorization @@ -3880,6 +3910,7 @@ yhi yi ylat ylo +ylz ymax ymin yml diff --git a/examples/ASPHERE/README b/examples/ASPHERE/README index 1aa9552bec..c44f7b0934 100644 --- a/examples/ASPHERE/README +++ b/examples/ASPHERE/README @@ -29,8 +29,10 @@ stochastic rotation dynamics solvent, using the fix srd command. box = 2d rigid box particles in SRDs, self-diffusion and viscosity dimer = 2d rigid dimers in SRDs, self-diffusion and viscosity ellipsoid = 2d ellipsoids in SRDs, self-diffusion and viscosity +flat_membrane = 2d flat membrane in NVE, self-diffusion and viscosity line = 2d line-faceted rigid particles, NEMD shearing for viscosity, implicit and in SRDs poly = 2d poly-disperse spheroids in SRDs, self-diffusion and viscosity star = 2d rigid star particles in SRDs, self-diffusion and viscosity tri = 3d triangle-faceted rigid particles in SRDs, NEMD shearing for viscosity +vesicle = 3d vesicle in NVE, self-diffusionand viscosity diff --git a/examples/ASPHERE/flat_membrane/in.flat_membrane b/examples/ASPHERE/flat_membrane/in.flat_membrane new file mode 100644 index 0000000000..c49961eac3 --- /dev/null +++ b/examples/ASPHERE/flat_membrane/in.flat_membrane @@ -0,0 +1,55 @@ +# flat membrane demo +variable r0 equal 0.97 +variable d1 equal ${r0} +variable d2 equal sqrt(3.0)*${r0} +variable d3 equal 3.0*${r0} +variable ro equal 2./${d1}/${d2}/${d3} + +variable T equal 0.23 +variable LD equal 1.0 + +units lj +atom_style ellipsoid + +boundary p p p + +lattice custom ${ro} a1 ${d1} 0.0 0.0 a2 0.0 ${d2} 0.0 & + a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 + + +region box block 0 40 0 24 -20 20 +create_box 1 box +region membrane block 0 40 0 24 -0.5 0.5 +create_atoms 1 region membrane + +group membrane region membrane + +set type 1 mass 1.0 + +set type 1 shape 1 0.99 0.99 + +set group all quat 0 -1 0 90 + +#compute memb all temp/com +#compute rot all temp/asphere bias memb +velocity all create ${T} 87287 loop geom + +pair_style ylz 2.6 +pair_coeff * * 1.0 1.0 4 3 0.0 2.6 +neighbor 1.0 bin + + +thermo_style custom step temp press pxx pyy +thermo 200 + +timestep 0.01 + +#dump 1 all atom 10 dump_onlymembrane.lammpstrj + +fix 1 all langevin ${T} ${T} ${LD} 48279 + + +fix 2 all nve/asphere +run 3000 + + diff --git a/examples/ASPHERE/flat_membrane/log.18Oct22.flat_membrane.g++.1 b/examples/ASPHERE/flat_membrane/log.18Oct22.flat_membrane.g++.1 new file mode 100644 index 0000000000..750aa5328c --- /dev/null +++ b/examples/ASPHERE/flat_membrane/log.18Oct22.flat_membrane.g++.1 @@ -0,0 +1,159 @@ +LAMMPS (15 Sep 2022) + using 1 OpenMP thread(s) per MPI task +# flat membrane demo +variable r0 equal 0.97 +variable d1 equal ${r0} +variable d1 equal 0.97 +variable d2 equal sqrt(3.0)*${r0} +variable d2 equal sqrt(3.0)*0.97 +variable d3 equal 3.0*${r0} +variable d3 equal 3.0*0.97 +variable ro equal 2./${d1}/${d2}/${d3} +variable ro equal 2./0.97/${d2}/${d3} +variable ro equal 2./0.97/1.68008928334181/${d3} +variable ro equal 2./0.97/1.68008928334181/2.91 + +variable T equal 0.23 +variable LD equal 1.0 + +units lj +atom_style ellipsoid + +boundary p p p + +lattice custom ${ro} a1 ${d1} 0.0 0.0 a2 0.0 ${d2} 0.0 a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +lattice custom 0.421728460751825 a1 ${d1} 0.0 0.0 a2 0.0 ${d2} 0.0 a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +lattice custom 0.421728460751825 a1 0.97 0.0 0.0 a2 0.0 ${d2} 0.0 a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +lattice custom 0.421728460751825 a1 0.97 0.0 0.0 a2 0.0 1.68008928334181 0.0 a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +lattice custom 0.421728460751825 a1 0.97 0.0 0.0 a2 0.0 1.68008928334181 0.0 a3 0.0 0.0 2.91 basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +Lattice spacing in x,y,z = 0.97 1.6800893 2.91 + + +region box block 0 40 0 24 -20 20 +create_box 1 box +Created orthogonal box = (0 0 -58.2) to (38.8 40.322143 58.2) + 1 by 1 by 1 MPI processor grid +region membrane block 0 40 0 24 -0.5 0.5 +create_atoms 1 region membrane +Created 1920 atoms + using lattice units in orthogonal box = (0 0 -58.2) to (38.8 40.322143 58.2) + create_atoms CPU = 0.001 seconds + +group membrane region membrane +1920 atoms in group membrane + +set type 1 mass 1.0 +Setting atom values ... + 1920 settings made for mass + +set type 1 shape 1 1 1 +Setting atom values ... + 1920 settings made for shape + +set group all quat 0 -1 0 90 +Setting atom values ... + 1920 settings made for quat + +#compute memb all temp/com +#compute rot all temp/asphere bias memb +velocity all create ${T} 87287 loop geom +velocity all create 0.23 87287 loop geom + +pair_style ylz 2.6 +pair_coeff * * 1.0 1.0 4 3 0.0 2.6 +neighbor 1.0 bin + + +thermo_style custom step temp press pxx pyy +thermo 200 + +timestep 0.01 + +#dump 1 all atom 10 dump_onlymembrane.lammpstrj + +fix 1 all langevin ${T} ${T} ${LD} 48279 +fix 1 all langevin 0.23 ${T} ${LD} 48279 +fix 1 all langevin 0.23 0.23 ${LD} 48279 +fix 1 all langevin 0.23 0.23 1 48279 + + +fix 2 all nve/asphere +run 3000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair ylz command: + +@Article{Yuan10, + author = {H. Yuan, C. Huang, J. Li, G. Lykotrafitis, and S. Zhang}, + title = {One-particle-thick, solvent-free, coarse-grained model for biological and biomimetic fluid membranes}, + journal = {Phys. Rev. E}, + year = 2010, + volume = 82, + pages = {011905} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 10 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.6 + ghost atom cutoff = 3.6 + binsize = 1.8, bins = 22 23 65 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair ylz, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.024 | 5.024 | 5.024 Mbytes + Step Temp Press Pxx Pyy + 0 0.23 -0.0073508785 -0.012283389 -0.012234574 + 200 0.20903886 -0.0010605951 -0.0011885957 -0.00198842 + 400 0.21898026 -0.00069250685 -0.0013217981 -0.00073225707 + 600 0.22689361 -0.00057919328 -0.00076880503 -0.0010242283 + 800 0.22983221 -0.00032145682 -0.00051928834 -0.00059337525 + 1000 0.23819392 -0.00027969126 -0.00088082301 -5.2666567e-05 + 1200 0.22053795 -0.00029571329 -0.0004446455 -0.00035529929 + 1400 0.22285021 -0.0002690371 -0.00068896571 -3.6258442e-05 + 1600 0.22687044 2.8599875e-05 -0.00032651798 0.0004056081 + 1800 0.23356905 -2.28742e-05 -0.00027073251 0.00025081131 + 2000 0.22499821 8.8230586e-06 -7.5750159e-05 0.0001988705 + 2200 0.23162995 -9.026855e-05 -0.00025832535 5.4904927e-05 + 2400 0.22920223 0.00016700455 3.5283125e-05 0.00034955857 + 2600 0.2260299 5.3095557e-05 0.00025691786 0.00013353467 + 2800 0.2296401 0.00043234854 0.00058344966 0.00063645193 + 3000 0.22564577 2.6423111e-05 8.9918406e-05 0.00022146229 +Loop time of 6.76659 on 1 procs for 3000 steps with 1920 atoms + +Performance: 383058.431 tau/day, 443.355 timesteps/s +99.8% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.7968 | 5.7968 | 5.7968 | 0.0 | 85.67 +Neigh | 0.086077 | 0.086077 | 0.086077 | 0.0 | 1.27 +Comm | 0.034761 | 0.034761 | 0.034761 | 0.0 | 0.51 +Output | 0.00038014 | 0.00038014 | 0.00038014 | 0.0 | 0.01 +Modify | 0.8268 | 0.8268 | 0.8268 | 0.0 | 12.22 +Other | | 0.02181 | | | 0.32 + +Nlocal: 1920 ave 1920 max 1920 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 772 ave 772 max 772 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 46804 ave 46804 max 46804 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 46804 +Ave neighs/atom = 24.377083 +Neighbor list builds = 99 +Dangerous builds = 0 + + +Total wall time: 0:00:06 diff --git a/examples/ASPHERE/flat_membrane/log.18Oct22.flat_membrane.g++.4 b/examples/ASPHERE/flat_membrane/log.18Oct22.flat_membrane.g++.4 new file mode 100644 index 0000000000..7bbe99b58b --- /dev/null +++ b/examples/ASPHERE/flat_membrane/log.18Oct22.flat_membrane.g++.4 @@ -0,0 +1,159 @@ +LAMMPS (15 Sep 2022) + using 1 OpenMP thread(s) per MPI task +# flat membrane demo +variable r0 equal 0.97 +variable d1 equal ${r0} +variable d1 equal 0.97 +variable d2 equal sqrt(3.0)*${r0} +variable d2 equal sqrt(3.0)*0.97 +variable d3 equal 3.0*${r0} +variable d3 equal 3.0*0.97 +variable ro equal 2./${d1}/${d2}/${d3} +variable ro equal 2./0.97/${d2}/${d3} +variable ro equal 2./0.97/1.68008928334181/${d3} +variable ro equal 2./0.97/1.68008928334181/2.91 + +variable T equal 0.23 +variable LD equal 1.0 + +units lj +atom_style ellipsoid + +boundary p p p + +lattice custom ${ro} a1 ${d1} 0.0 0.0 a2 0.0 ${d2} 0.0 a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +lattice custom 0.421728460751825 a1 ${d1} 0.0 0.0 a2 0.0 ${d2} 0.0 a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +lattice custom 0.421728460751825 a1 0.97 0.0 0.0 a2 0.0 ${d2} 0.0 a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +lattice custom 0.421728460751825 a1 0.97 0.0 0.0 a2 0.0 1.68008928334181 0.0 a3 0.0 0.0 ${d3} basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +lattice custom 0.421728460751825 a1 0.97 0.0 0.0 a2 0.0 1.68008928334181 0.0 a3 0.0 0.0 2.91 basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 +Lattice spacing in x,y,z = 0.97 1.6800893 2.91 + + +region box block 0 40 0 24 -20 20 +create_box 1 box +Created orthogonal box = (0 0 -58.2) to (38.8 40.322143 58.2) + 1 by 1 by 4 MPI processor grid +region membrane block 0 40 0 24 -0.5 0.5 +create_atoms 1 region membrane +Created 1920 atoms + using lattice units in orthogonal box = (0 0 -58.2) to (38.8 40.322143 58.2) + create_atoms CPU = 0.001 seconds + +group membrane region membrane +1920 atoms in group membrane + +set type 1 mass 1.0 +Setting atom values ... + 1920 settings made for mass + +set type 1 shape 1 1 1 +Setting atom values ... + 1920 settings made for shape + +set group all quat 0 -1 0 90 +Setting atom values ... + 1920 settings made for quat + +#compute memb all temp/com +#compute rot all temp/asphere bias memb +velocity all create ${T} 87287 loop geom +velocity all create 0.23 87287 loop geom + +pair_style ylz 2.6 +pair_coeff * * 1.0 1.0 4 3 0.0 2.6 +neighbor 1.0 bin + + +thermo_style custom step temp press pxx pyy +thermo 200 + +timestep 0.01 + +#dump 1 all atom 10 dump_onlymembrane.lammpstrj + +fix 1 all langevin ${T} ${T} ${LD} 48279 +fix 1 all langevin 0.23 ${T} ${LD} 48279 +fix 1 all langevin 0.23 0.23 ${LD} 48279 +fix 1 all langevin 0.23 0.23 1 48279 + + +fix 2 all nve/asphere +run 3000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair ylz command: + +@Article{Yuan10, + author = {H. Yuan, C. Huang, J. Li, G. Lykotrafitis, and S. Zhang}, + title = {One-particle-thick, solvent-free, coarse-grained model for biological and biomimetic fluid membranes}, + journal = {Phys. Rev. E}, + year = 2010, + volume = 82, + pages = {011905} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 10 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.6 + ghost atom cutoff = 3.6 + binsize = 1.8, bins = 22 23 65 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair ylz, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.182 | 4.794 | 5.472 Mbytes + Step Temp Press Pxx Pyy + 0 0.23 -0.0073508785 -0.012283389 -0.012234574 + 200 0.20647718 -0.0012368074 -0.0021167303 -0.0015343502 + 400 0.21648371 -0.00085695085 -0.0015627331 -0.0011177093 + 600 0.22929515 -0.00050218657 -0.0008332 -0.00062622609 + 800 0.22062664 -0.00049172378 -0.000611884 -0.00075089294 + 1000 0.22422425 -0.00039405068 -0.00037600355 -0.00070786572 + 1200 0.2298767 -0.00025939082 -0.00021616578 -0.00053125505 + 1400 0.2335927 5.8028332e-05 0.00017530192 -3.1675138e-05 + 1600 0.22884878 -0.0001733902 -0.0008056431 0.00014276754 + 1800 0.22813498 0.00019873459 0.00051040124 5.8860949e-05 + 2000 0.2273166 -3.3595127e-05 0.0001705632 -0.00026498213 + 2200 0.2251643 -2.4517311e-05 -4.0618888e-05 1.066658e-05 + 2400 0.22460629 -4.5661259e-05 -0.00019144039 -1.6649099e-05 + 2600 0.23085675 0.00014029405 0.00017983536 0.00017895001 + 2800 0.22364591 4.2999164e-05 -0.00011000466 0.00024363243 + 3000 0.23421357 0.00023505702 0.00020752013 0.00053567111 +Loop time of 4.68577 on 4 procs for 3000 steps with 1920 atoms + +Performance: 553164.568 tau/day, 640.237 timesteps/s +95.6% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.00015072 | 1.6029 | 3.8573 | 131.7 | 34.21 +Neigh | 0.00055747 | 0.025423 | 0.065858 | 17.0 | 0.54 +Comm | 0.0052259 | 0.48173 | 1.624 | 96.5 | 10.28 +Output | 0.0003894 | 0.023428 | 0.047223 | 15.0 | 0.50 +Modify | 0.00037337 | 0.2141 | 0.44595 | 46.3 | 4.57 +Other | | 2.338 | | | 49.90 + +Nlocal: 480 ave 1011 max 0 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Nghost: 860 ave 1771 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 11697.8 ave 30095 max 0 min +Histogram: 2 0 0 0 0 1 0 0 0 1 + +Total # of neighbors = 46791 +Ave neighs/atom = 24.370313 +Neighbor list builds = 99 +Dangerous builds = 0 + + +Total wall time: 0:00:04 diff --git a/examples/ASPHERE/vesicle/in.vesicle b/examples/ASPHERE/vesicle/in.vesicle new file mode 100644 index 0000000000..ae8e2e3d75 --- /dev/null +++ b/examples/ASPHERE/vesicle/in.vesicle @@ -0,0 +1,33 @@ +# Vesicle demo + +variable T equal 0.2 +variable LD equal 1.0 + +units lj +atom_style ellipsoid + +boundary p p p + +read_data read_data.vesicle1026 + +compute ali all temp/com +compute rott all temp/asphere bias ali + +velocity all create ${T} 87287 loop geom + +pair_style ylz 2.6 +pair_coeff * * 1.0 1.0 4 3 0.0 2.6 +neighbor 1.0 bin + +thermo_style custom step temp press pxx pyy +thermo 200 + +timestep 0.001 + +#dump 1 all atom 10 onlymembrane2.lammpstrj + +fix 1 all langevin ${T} ${T} ${LD} 48279 +fix 2 all nve/asphere + +run 3000 + diff --git a/examples/ASPHERE/vesicle/log.18Oct22.vesicle.g++.1 b/examples/ASPHERE/vesicle/log.18Oct22.vesicle.g++.1 new file mode 100644 index 0000000000..f974a524e6 --- /dev/null +++ b/examples/ASPHERE/vesicle/log.18Oct22.vesicle.g++.1 @@ -0,0 +1,122 @@ +LAMMPS (15 Sep 2022) + using 1 OpenMP thread(s) per MPI task +# Vesicle demo + +variable T equal 0.2 +variable LD equal 1.0 + +units lj +atom_style ellipsoid + +boundary p p p + +read_data read_data.vesicle1026 +Reading data file ... + orthogonal box = (-35 -35 -35) to (35 35 35) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 2938 atoms + 2938 ellipsoids + read_data CPU = 0.010 seconds + +compute ali all temp/com +compute rott all temp/asphere bias ali + +velocity all create ${T} 87287 loop geom +velocity all create 0.2 87287 loop geom + +pair_style ylz 2.6 +pair_coeff * * 1.0 1.0 4 3 0.0 2.6 +neighbor 1.0 bin + +thermo_style custom step temp press pxx pyy +thermo 200 + +timestep 0.001 + +#dump 1 all atom 10 onlymembrane2.lammpstrj + +fix 1 all langevin ${T} ${T} ${LD} 48279 +fix 1 all langevin 0.2 ${T} ${LD} 48279 +fix 1 all langevin 0.2 0.2 ${LD} 48279 +fix 1 all langevin 0.2 0.2 1 48279 +fix 2 all nve/asphere + +run 3000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair ylz command: + +@Article{Yuan10, + author = {H. Yuan, C. Huang, J. Li, G. Lykotrafitis, and S. Zhang}, + title = {One-particle-thick, solvent-free, coarse-grained model for biological and biomimetic fluid membranes}, + journal = {Phys. Rev. E}, + year = 2010, + volume = 82, + pages = {011905} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 10 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.6 + ghost atom cutoff = 3.6 + binsize = 1.8, bins = 39 39 39 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair ylz, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.091 | 5.091 | 5.091 Mbytes + Step Temp Press Pxx Pyy + 0 0.2 -0.0054891414 -0.0052713616 -0.0053641136 + 200 0.12816247 -0.0051288861 -0.0048542514 -0.0049847561 + 400 0.1377632 -0.0048071582 -0.0045651263 -0.0048444087 + 600 0.14983781 -0.0045305725 -0.0043305994 -0.0046127777 + 800 0.16205271 -0.0041176346 -0.0040534483 -0.0041351779 + 1000 0.17462122 -0.0037000069 -0.0034938539 -0.0037915494 + 1200 0.18335448 -0.0032674318 -0.0032790248 -0.0031967931 + 1400 0.19195613 -0.0029332101 -0.0030823703 -0.0028287799 + 1600 0.19261762 -0.0025263447 -0.0025152249 -0.0026205398 + 1800 0.19758674 -0.0021087725 -0.001981333 -0.002309048 + 2000 0.19748896 -0.0017662369 -0.0019316344 -0.0016696035 + 2200 0.20196986 -0.0013363214 -0.0015581191 -0.0013384961 + 2400 0.20109248 -0.0009190831 -0.0010331417 -0.0010664316 + 2600 0.20228664 -0.00053590675 -0.00071808747 -0.00050218533 + 2800 0.20512955 -0.00030845899 -0.00016244901 -0.00047877516 + 3000 0.19855941 -7.9520073e-05 -0.00014969215 -5.4724226e-06 +Loop time of 9.6866 on 1 procs for 3000 steps with 2938 atoms + +Performance: 26758.610 tau/day, 309.706 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 8.3097 | 8.3097 | 8.3097 | 0.0 | 85.79 +Neigh | 0.039037 | 0.039037 | 0.039037 | 0.0 | 0.40 +Comm | 0.0021766 | 0.0021766 | 0.0021766 | 0.0 | 0.02 +Output | 0.00048628 | 0.00048628 | 0.00048628 | 0.0 | 0.01 +Modify | 1.3043 | 1.3043 | 1.3043 | 0.0 | 13.47 +Other | | 0.0309 | | | 0.32 + +Nlocal: 2938 ave 2938 max 2938 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 73242 ave 73242 max 73242 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 73242 +Ave neighs/atom = 24.929204 +Neighbor list builds = 26 +Dangerous builds = 0 + +Total wall time: 0:00:09 diff --git a/examples/ASPHERE/vesicle/log.18Oct22.vesicle.g++.4 b/examples/ASPHERE/vesicle/log.18Oct22.vesicle.g++.4 new file mode 100644 index 0000000000..0340219494 --- /dev/null +++ b/examples/ASPHERE/vesicle/log.18Oct22.vesicle.g++.4 @@ -0,0 +1,122 @@ +LAMMPS (15 Sep 2022) + using 1 OpenMP thread(s) per MPI task +# Vesicle demo + +variable T equal 0.2 +variable LD equal 1.0 + +units lj +atom_style ellipsoid + +boundary p p p + +read_data read_data.vesicle1026 +Reading data file ... + orthogonal box = (-35 -35 -35) to (35 35 35) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 2938 atoms + 2938 ellipsoids + read_data CPU = 0.137 seconds + +compute ali all temp/com +compute rott all temp/asphere bias ali + +velocity all create ${T} 87287 loop geom +velocity all create 0.2 87287 loop geom + +pair_style ylz 2.6 +pair_coeff * * 1.0 1.0 4 3 0.0 2.6 +neighbor 1.0 bin + +thermo_style custom step temp press pxx pyy +thermo 200 + +timestep 0.001 + +#dump 1 all atom 10 onlymembrane2.lammpstrj + +fix 1 all langevin ${T} ${T} ${LD} 48279 +fix 1 all langevin 0.2 ${T} ${LD} 48279 +fix 1 all langevin 0.2 0.2 ${LD} 48279 +fix 1 all langevin 0.2 0.2 1 48279 +fix 2 all nve/asphere + +run 3000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair ylz command: + +@Article{Yuan10, + author = {H. Yuan, C. Huang, J. Li, G. Lykotrafitis, and S. Zhang}, + title = {One-particle-thick, solvent-free, coarse-grained model for biological and biomimetic fluid membranes}, + journal = {Phys. Rev. E}, + year = 2010, + volume = 82, + pages = {011905} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 10 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.6 + ghost atom cutoff = 3.6 + binsize = 1.8, bins = 39 39 39 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair ylz, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.899 | 4.9 | 4.902 Mbytes + Step Temp Press Pxx Pyy + 0 0.2 -0.0054891414 -0.0052713616 -0.0053641136 + 200 0.12893798 -0.0051492794 -0.0048734875 -0.0049624005 + 400 0.13798694 -0.004875313 -0.0047071897 -0.0049305051 + 600 0.14725193 -0.0046349542 -0.004719983 -0.0045791451 + 800 0.16146954 -0.0042232199 -0.0040789193 -0.0043672895 + 1000 0.17268468 -0.0037146703 -0.0036270393 -0.0039169034 + 1200 0.18266242 -0.0032749755 -0.0032971704 -0.0033323855 + 1400 0.18500165 -0.0028179031 -0.0030659821 -0.0027519633 + 1600 0.19513132 -0.0023407512 -0.0025109801 -0.0023416835 + 1800 0.19645259 -0.0019995412 -0.0019064341 -0.0021757747 + 2000 0.19658104 -0.0015897919 -0.0015850523 -0.0016828478 + 2200 0.1989936 -0.0011794062 -0.0011779716 -0.0012070706 + 2400 0.20011525 -0.0009147432 -0.00094040885 -0.001073922 + 2600 0.2013975 -0.00059253676 -0.00051920304 -0.00075138934 + 2800 0.19715513 -0.00020995605 -0.00024386426 -0.0005475745 + 3000 0.1976782 -0.0001308553 5.693004e-05 -0.00034478469 +Loop time of 8.46954 on 4 procs for 3000 steps with 2938 atoms + +Performance: 30603.800 tau/day, 354.211 timesteps/s +77.9% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.1751 | 2.4162 | 2.6707 | 13.2 | 28.53 +Neigh | 0.0090503 | 0.0098389 | 0.010503 | 0.6 | 0.12 +Comm | 3.5807 | 4.1526 | 4.9283 | 24.3 | 49.03 +Output | 0.00032165 | 0.0029648 | 0.010842 | 8.4 | 0.04 +Modify | 0.34554 | 0.37442 | 0.39198 | 2.8 | 4.42 +Other | | 1.514 | | | 17.87 + +Nlocal: 734.5 ave 739 max 730 min +Histogram: 1 0 1 0 0 0 0 1 0 1 +Nghost: 420.25 ave 424 max 415 min +Histogram: 1 0 0 0 0 1 0 1 0 1 +Neighs: 18304.5 ave 19839 max 16636 min +Histogram: 1 0 0 0 1 0 1 0 0 1 + +Total # of neighbors = 73218 +Ave neighs/atom = 24.921035 +Neighbor list builds = 25 +Dangerous builds = 0 + +Total wall time: 0:00:08 diff --git a/examples/ASPHERE/vesicle/read_data.vesicle1026 b/examples/ASPHERE/vesicle/read_data.vesicle1026 new file mode 100644 index 0000000000..fd19a28dc9 --- /dev/null +++ b/examples/ASPHERE/vesicle/read_data.vesicle1026 @@ -0,0 +1,5894 @@ +vesicle with diameter = 30.000000 + 2938 atoms + 2938 ellipsoids + +2 atom types + + -35.000000 35.000000 xlo xhi + -35.000000 35.000000 ylo yhi + -35.000000 35.000000 zlo zhi + + +Atoms + + 1 1 1 0.236369 0.008147 0.007400 15.002449 + 2 1 1 0.236369 0.009058 0.008176 -14.997137 + 3 1 1 0.236369 0.982317 0.006003 14.977515 + 4 1 1 0.236369 0.499657 0.850462 14.970191 + 5 1 1 0.236369 -0.484200 0.858835 14.973257 + 6 1 1 0.236369 -0.980072 0.000536 14.969934 + 7 1 1 0.236369 -0.487738 -0.844341 14.972224 + 8 1 1 0.236369 0.495992 -0.848423 14.969306 + 9 1 1 0.236369 1.967468 0.003801 14.875429 + 10 1 1 0.236369 1.743277 0.918007 14.879609 + 11 1 1 0.236369 1.113786 1.613755 14.879801 + 12 1 1 0.236369 0.245704 1.952462 14.880711 + 13 1 1 0.236369 -0.684707 1.837788 14.877077 + 14 1 1 0.236369 -1.460650 1.302105 14.879852 + 15 1 1 0.236369 -1.892997 0.471044 14.878757 + 16 1 1 0.236369 -1.899581 -0.466026 14.872105 + 17 1 1 0.236369 -1.461286 -1.290651 14.873132 + 18 1 1 0.236369 -0.685121 -1.830163 14.874006 + 19 1 1 0.236369 0.243920 -1.936765 14.874140 + 20 1 1 0.236369 1.121805 -1.605111 14.873376 + 21 1 1 0.236369 1.740185 -0.902411 14.874023 + 22 1 1 0.236369 2.926712 0.009773 14.714534 + 23 1 1 0.236369 2.776288 0.954025 14.721295 + 24 1 1 0.236369 2.318645 1.800006 14.715246 + 25 1 1 0.236369 1.607352 2.458621 14.714752 + 26 1 1 0.236369 0.725955 2.844870 14.715823 + 27 1 1 0.236369 -0.234225 2.920971 14.714802 + 28 1 1 0.236369 -1.171581 2.680787 14.719352 + 29 1 1 0.236369 -1.975411 2.158632 14.715377 + 30 1 1 0.236369 -2.571940 1.394665 14.713028 + 31 1 1 0.236369 -2.879383 0.486979 14.717951 + 32 1 1 0.236369 -2.886125 -0.478112 14.715334 + 33 1 1 0.236369 -2.570883 -1.389643 14.715409 + 34 1 1 0.236369 -1.981504 -2.145722 14.712464 + 35 1 1 0.236369 -1.174532 -2.674720 14.720451 + 36 1 1 0.236369 -0.233422 -2.908453 14.716358 + 37 1 1 0.236369 0.725326 -2.834764 14.712555 + 38 1 1 0.236369 1.603735 -2.443065 14.720828 + 39 1 1 0.236369 2.318807 -1.796879 14.714596 + 40 1 1 0.236369 2.768141 -0.942174 14.717918 + 41 1 1 0.236369 3.886673 0.006786 14.495506 + 42 1 1 0.236369 3.764132 0.974945 14.490888 + 43 1 1 0.236369 3.409728 1.871221 14.498487 + 44 1 1 0.236369 2.838016 2.666692 14.495538 + 45 1 1 0.236369 2.082101 3.283022 14.494300 + 46 1 1 0.236369 1.204590 3.698422 14.497577 + 47 1 1 0.236369 0.248227 3.877786 14.494458 + 48 1 1 0.236369 -0.721005 3.814295 14.489101 + 49 1 1 0.236369 -1.645903 3.521303 14.493714 + 50 1 1 0.236369 -2.467115 2.992798 14.496967 + 51 1 1 0.236369 -3.138075 2.285655 14.496247 + 52 1 1 0.236369 -3.602861 1.435389 14.494610 + 53 1 1 0.236369 -3.845122 0.496555 14.488977 + 54 1 1 0.236369 -3.850047 -0.481406 14.496070 + 55 1 1 0.236369 -3.608468 -1.419260 14.493382 + 56 1 1 0.236369 -3.135851 -2.279685 14.495484 + 57 1 1 0.236369 -2.465065 -2.987372 14.496419 + 58 1 1 0.236369 -1.649593 -3.505831 14.496935 + 59 1 1 0.236369 -0.721615 -3.812873 14.489179 + 60 1 1 0.236369 0.246009 -3.867148 14.496686 + 61 1 1 0.236369 1.207205 -3.688069 14.494561 + 62 1 1 0.236369 2.082784 -3.269809 14.489649 + 63 1 1 0.236369 2.835124 -2.653811 14.491404 + 64 1 1 0.236369 3.409064 -1.867115 14.490222 + 65 1 1 0.236369 3.769226 -0.955625 14.494532 + 66 1 1 0.236369 4.831185 0.007182 14.209362 + 67 1 1 0.236369 4.728366 0.974711 14.204641 + 68 1 1 0.236369 4.432226 1.902409 14.213836 + 69 1 1 0.236369 3.958879 2.761768 14.206463 + 70 1 1 0.236369 3.324492 3.501028 14.207107 + 71 1 1 0.236369 2.558856 4.092555 14.206959 + 72 1 1 0.236369 1.677107 4.522663 14.204372 + 73 1 1 0.236369 0.738266 4.775807 14.209231 + 74 1 1 0.236369 -0.241774 4.820371 14.206512 + 75 1 1 0.236369 -1.199252 4.667897 14.208039 + 76 1 1 0.236369 -2.119901 4.329385 14.213427 + 77 1 1 0.236369 -2.949359 3.814207 14.213145 + 78 1 1 0.236369 -3.655911 3.149587 14.205164 + 79 1 1 0.236369 -4.209582 2.344586 14.209871 + 80 1 1 0.236369 -4.595737 1.449015 14.207548 + 81 1 1 0.236369 -4.793337 0.492737 14.211145 + 82 1 1 0.236369 -4.788546 -0.487115 14.209187 + 83 1 1 0.236369 -4.594618 -1.434430 14.206560 + 84 1 1 0.236369 -4.210245 -2.337042 14.208883 + 85 1 1 0.236369 -3.649250 -3.137962 14.212510 + 86 1 1 0.236369 -2.948467 -3.806856 14.211196 + 87 1 1 0.236369 -2.115829 -4.324088 14.205943 + 88 1 1 0.236369 -1.201007 -4.663990 14.205525 + 89 1 1 0.236369 -0.240405 -4.808847 14.207657 + 90 1 1 0.236369 0.735801 -4.756609 14.212575 + 91 1 1 0.236369 1.675323 -4.515254 14.210800 + 92 1 1 0.236369 2.550988 -4.088988 14.210294 + 93 1 1 0.236369 3.327225 -3.492603 14.205365 + 94 1 1 0.236369 3.965178 -2.750031 14.204745 + 95 1 1 0.236369 4.440180 -1.901151 14.212713 + 96 1 1 0.236369 4.724193 -0.961817 14.208156 + 97 1 1 0.236369 5.745940 0.006101 13.863070 + 98 1 1 0.236369 5.662377 0.972143 13.862796 + 99 1 1 0.236369 5.412473 1.917505 13.863350 + 100 1 1 0.236369 5.014692 2.800030 13.860913 + 101 1 1 0.236369 4.467743 3.614763 13.860509 + 102 1 1 0.236369 3.800382 4.313477 13.867188 + 103 1 1 0.236369 3.012768 4.893471 13.867280 + 104 1 1 0.236369 2.145575 5.331985 13.864229 + 105 1 1 0.236369 1.211008 5.618217 13.861845 + 106 1 1 0.236369 0.249643 5.738793 13.864179 + 107 1 1 0.236369 -0.726485 5.694540 13.864878 + 108 1 1 0.236369 -1.674336 5.493201 13.867139 + 109 1 1 0.236369 -2.577391 5.126097 13.859066 + 110 1 1 0.236369 -3.405862 4.622528 13.863583 + 111 1 1 0.236369 -4.139704 3.972283 13.862477 + 112 1 1 0.236369 -4.755016 3.223939 13.864365 + 113 1 1 0.236369 -5.228391 2.371840 13.863782 + 114 1 1 0.236369 -5.545897 1.455792 13.860451 + 115 1 1 0.236369 -5.718048 0.491941 13.859238 + 116 1 1 0.236369 -5.711314 -0.484398 13.858293 + 117 1 1 0.236369 -5.549647 -1.443818 13.858785 + 118 1 1 0.236369 -5.220719 -2.356827 13.861420 + 119 1 1 0.236369 -4.755072 -3.204463 13.865988 + 120 1 1 0.236369 -4.139783 -3.968336 13.861548 + 121 1 1 0.236369 -3.412277 -4.607617 13.864389 + 122 1 1 0.236369 -2.574664 -5.124518 13.868122 + 123 1 1 0.236369 -1.680830 -5.482667 13.864673 + 124 1 1 0.236369 -0.721365 -5.689452 13.863591 + 125 1 1 0.236369 0.251796 -5.727772 13.860516 + 126 1 1 0.236369 1.218039 -5.608801 13.865591 + 127 1 1 0.236369 2.141134 -5.325368 13.867083 + 128 1 1 0.236369 3.013653 -4.883482 13.866791 + 129 1 1 0.236369 3.795038 -4.302647 13.864164 + 130 1 1 0.236369 4.474122 -3.604820 13.864741 + 131 1 1 0.236369 5.015635 -2.794963 13.867343 + 132 1 1 0.236369 5.421460 -1.905784 13.862525 + 133 1 1 0.236369 5.659502 -0.961837 13.861091 + 134 1 1 0.236369 6.636968 0.003081 13.459410 + 135 1 1 0.236369 6.565086 0.969990 13.456045 + 136 1 1 0.236369 6.354399 1.920187 13.459311 + 137 1 1 0.236369 6.015736 2.822992 13.453566 + 138 1 1 0.236369 5.538814 3.663028 13.463037 + 139 1 1 0.236369 4.946563 4.434812 13.455159 + 140 1 1 0.236369 4.245252 5.102368 13.459165 + 141 1 1 0.236369 3.464621 5.665793 13.456567 + 142 1 1 0.236369 2.600938 6.105942 13.460268 + 143 1 1 0.236369 1.681553 6.422354 13.453371 + 144 1 1 0.236369 0.730737 6.598900 13.453760 + 145 1 1 0.236369 -0.238281 6.632947 13.462362 + 146 1 1 0.236369 -1.204279 6.526881 13.453969 + 147 1 1 0.236369 -2.139696 6.281419 13.456415 + 148 1 1 0.236369 -3.032263 5.909556 13.458353 + 149 1 1 0.236369 -3.858405 5.404235 13.455558 + 150 1 1 0.236369 -4.602318 4.780050 13.458520 + 151 1 1 0.236369 -5.246877 4.059523 13.460900 + 152 1 1 0.236369 -5.784967 3.252610 13.458310 + 153 1 1 0.236369 -6.187544 2.374884 13.462411 + 154 1 1 0.236369 -6.466162 1.445202 13.454562 + 155 1 1 0.236369 -6.611723 0.494172 13.457259 + 156 1 1 0.236369 -6.611739 -0.482438 13.455894 + 157 1 1 0.236369 -6.472233 -1.433887 13.459072 + 158 1 1 0.236369 -6.187571 -2.369661 13.453456 + 159 1 1 0.236369 -5.781771 -3.243640 13.453728 + 160 1 1 0.236369 -5.249937 -4.047241 13.456320 + 161 1 1 0.236369 -4.596915 -4.769634 13.454075 + 162 1 1 0.236369 -3.856347 -5.393940 13.454792 + 163 1 1 0.236369 -3.031080 -5.890668 13.456803 + 164 1 1 0.236369 -2.138056 -6.273561 13.453489 + 165 1 1 0.236369 -1.204074 -6.521459 13.460184 + 166 1 1 0.236369 -0.240979 -6.624119 13.459505 + 167 1 1 0.236369 0.735025 -6.585376 13.454832 + 168 1 1 0.236369 1.687605 -6.409650 13.453713 + 169 1 1 0.236369 2.600470 -6.101056 13.457158 + 170 1 1 0.236369 3.456688 -5.658591 13.457722 + 171 1 1 0.236369 4.246150 -5.096342 13.455118 + 172 1 1 0.236369 4.944596 -4.426660 13.461787 + 173 1 1 0.236369 5.541229 -3.653072 13.459071 + 174 1 1 0.236369 6.007197 -2.814666 13.453321 + 175 1 1 0.236369 6.353469 -1.907785 13.462085 + 176 1 1 0.236369 6.565321 -0.962008 13.457621 + 177 1 1 0.236369 7.506491 0.008855 12.990961 + 178 1 1 0.236369 7.443154 0.979159 12.991444 + 179 1 1 0.236369 7.250921 1.949584 13.000365 + 180 1 1 0.236369 6.933606 2.873006 12.999044 + 181 1 1 0.236369 6.500661 3.752503 12.996533 + 182 1 1 0.236369 5.953113 4.570595 12.990651 + 183 1 1 0.236369 5.310748 5.310591 12.993606 + 184 1 1 0.236369 4.567600 5.952176 12.995019 + 185 1 1 0.236369 3.756868 6.497353 12.991371 + 186 1 1 0.236369 2.871961 6.938860 12.996091 + 187 1 1 0.236369 1.944828 7.250376 12.993640 + 188 1 1 0.236369 0.985203 7.438880 12.994886 + 189 1 1 0.236369 0.007802 7.509677 12.996159 + 190 1 1 0.236369 -0.978135 7.444796 12.991129 + 191 1 1 0.236369 -1.931849 7.246344 12.990954 + 192 1 1 0.236369 -2.862369 6.929114 12.993391 + 193 1 1 0.236369 -3.745132 6.502308 12.995598 + 194 1 1 0.236369 -4.561352 5.958827 12.996000 + 195 1 1 0.236369 -5.298833 5.304484 12.992797 + 196 1 1 0.236369 -5.947087 4.566101 12.999508 + 197 1 1 0.236369 -6.490105 3.755982 12.998638 + 198 1 1 0.236369 -6.923989 2.876169 12.994827 + 199 1 1 0.236369 -7.236267 1.946307 13.000202 + 200 1 1 0.236369 -7.427888 0.979022 12.996164 + 201 1 1 0.236369 -7.493557 0.006889 12.992725 + 202 1 1 0.236369 -7.432050 -0.969486 12.998487 + 203 1 1 0.236369 -7.236328 -1.932407 12.994894 + 204 1 1 0.236369 -6.923768 -2.868993 12.992881 + 205 1 1 0.236369 -6.491683 -3.746454 12.999935 + 206 1 1 0.236369 -5.940760 -4.563291 12.991808 + 207 1 1 0.236369 -5.294541 -5.297698 12.995507 + 208 1 1 0.236369 -4.560209 -5.944023 13.000100 + 209 1 1 0.236369 -3.743775 -6.492182 12.996864 + 210 1 1 0.236369 -2.864255 -6.921115 12.996528 + 211 1 1 0.236369 -1.939065 -7.236487 12.995078 + 212 1 1 0.236369 -0.975934 -7.428026 12.996159 + 213 1 1 0.236369 0.004709 -7.496489 12.999494 + 214 1 1 0.236369 0.981251 -7.435293 12.994143 + 215 1 1 0.236369 1.949586 -7.237357 12.992669 + 216 1 1 0.236369 2.872073 -6.919167 12.994616 + 217 1 1 0.236369 3.752259 -6.493566 12.993117 + 218 1 1 0.236369 4.567418 -5.949014 12.994827 + 219 1 1 0.236369 5.305578 -5.294172 12.996656 + 220 1 1 0.236369 5.954507 -4.560894 12.995727 + 221 1 1 0.236369 6.498302 -3.741482 12.994235 + 222 1 1 0.236369 6.938330 -2.862027 12.999116 + 223 1 1 0.236369 7.248746 -1.939275 12.993385 + 224 1 1 0.236369 7.437685 -0.976474 12.994381 + 225 1 1 0.236369 8.342602 0.000542 12.477221 + 226 1 1 0.236369 8.284859 0.991725 12.472662 + 227 1 1 0.236369 8.104794 1.965208 12.474358 + 228 1 1 0.236369 7.813148 2.906868 12.473229 + 229 1 1 0.236369 7.416586 3.805622 12.473032 + 230 1 1 0.236369 6.915984 4.665417 12.480947 + 231 1 1 0.236369 6.318709 5.445337 12.472378 + 232 1 1 0.236369 5.627629 6.152093 12.480435 + 233 1 1 0.236369 4.864319 6.772642 12.477117 + 234 1 1 0.236369 4.030487 7.304240 12.473181 + 235 1 1 0.236369 3.134197 7.728369 12.476949 + 236 1 1 0.236369 2.197792 8.046352 12.478039 + 237 1 1 0.236369 1.233387 8.243754 12.472946 + 238 1 1 0.236369 0.250139 8.333462 12.481826 + 239 1 1 0.236369 -0.735744 8.302074 12.478574 + 240 1 1 0.236369 -1.711455 8.163359 12.476656 + 241 1 1 0.236369 -2.668131 7.897974 12.480682 + 242 1 1 0.236369 -3.581347 7.526266 12.474672 + 243 1 1 0.236369 -4.440636 7.046880 12.480284 + 244 1 1 0.236369 -5.250579 6.479222 12.475334 + 245 1 1 0.236369 -5.970097 5.809719 12.481457 + 246 1 1 0.236369 -6.616659 5.062180 12.474485 + 247 1 1 0.236369 -7.170667 4.246580 12.481615 + 248 1 1 0.236369 -7.620630 3.366679 12.477152 + 249 1 1 0.236369 -7.967846 2.440552 12.477690 + 250 1 1 0.236369 -8.197550 1.475913 12.481981 + 251 1 1 0.236369 -8.309287 0.499190 12.479754 + 252 1 1 0.236369 -8.313449 -0.484086 12.475182 + 253 1 1 0.236369 -8.196927 -1.468164 12.472623 + 254 1 1 0.236369 -7.967903 -2.425785 12.472485 + 255 1 1 0.236369 -7.621526 -3.349605 12.480174 + 256 1 1 0.236369 -7.169312 -4.229012 12.476165 + 257 1 1 0.236369 -6.617171 -5.054663 12.475886 + 258 1 1 0.236369 -5.975430 -5.804399 12.477275 + 259 1 1 0.236369 -5.247196 -6.466692 12.480966 + 260 1 1 0.236369 -4.438766 -7.046682 12.476103 + 261 1 1 0.236369 -3.583594 -7.518777 12.478088 + 262 1 1 0.236369 -2.660134 -7.885083 12.472992 + 263 1 1 0.236369 -1.707401 -8.152363 12.475404 + 264 1 1 0.236369 -0.732024 -8.296770 12.473493 + 265 1 1 0.236369 0.247938 -8.325579 12.474493 + 266 1 1 0.236369 1.233039 -8.233910 12.475834 + 267 1 1 0.236369 2.199971 -8.030596 12.474747 + 268 1 1 0.236369 3.138777 -7.718087 12.474200 + 269 1 1 0.236369 4.024740 -7.294178 12.478381 + 270 1 1 0.236369 4.865503 -6.761644 12.480041 + 271 1 1 0.236369 5.626075 -6.141365 12.474129 + 272 1 1 0.236369 6.319298 -5.432952 12.481007 + 273 1 1 0.236369 6.916838 -4.646044 12.479501 + 274 1 1 0.236369 7.421795 -3.800243 12.477408 + 275 1 1 0.236369 7.819187 -2.893838 12.481744 + 276 1 1 0.236369 8.109442 -1.952914 12.477693 + 277 1 1 0.236369 8.283970 -0.977144 12.474221 + 278 1 1 0.236369 9.134763 0.003904 11.908878 + 279 1 1 0.236369 9.086678 0.977994 11.908920 + 280 1 1 0.236369 8.927060 1.939988 11.903433 + 281 1 1 0.236369 8.669655 2.873200 11.903570 + 282 1 1 0.236369 8.322831 3.777514 11.908700 + 283 1 1 0.236369 7.872214 4.637782 11.905225 + 284 1 1 0.236369 7.334697 5.448916 11.900819 + 285 1 1 0.236369 6.718580 6.195060 11.908080 + 286 1 1 0.236369 6.019244 6.875793 11.904567 + 287 1 1 0.236369 5.254803 7.475567 11.903100 + 288 1 1 0.236369 4.433233 7.991251 11.903635 + 289 1 1 0.236369 3.558572 8.421059 11.903970 + 290 1 1 0.236369 2.641935 8.747941 11.908248 + 291 1 1 0.236369 1.693779 8.978514 11.900687 + 292 1 1 0.236369 0.730960 9.110054 11.907567 + 293 1 1 0.236369 -0.234218 9.129388 11.909027 + 294 1 1 0.236369 -1.211686 9.056889 11.903158 + 295 1 1 0.236369 -2.162231 8.874002 11.906869 + 296 1 1 0.236369 -3.096054 8.593277 11.902619 + 297 1 1 0.236369 -3.983451 8.217744 11.906520 + 298 1 1 0.236369 -4.836370 7.749660 11.901051 + 299 1 1 0.236369 -5.633873 7.184319 11.909968 + 300 1 1 0.236369 -6.365657 6.548993 11.906400 + 301 1 1 0.236369 -7.029082 5.837095 11.904137 + 302 1 1 0.236369 -7.602521 5.049842 11.900606 + 303 1 1 0.236369 -8.102361 4.213413 11.908876 + 304 1 1 0.236369 -8.503709 3.330269 11.906336 + 305 1 1 0.236369 -8.804485 2.411399 11.908779 + 306 1 1 0.236369 -9.014196 1.457490 11.905346 + 307 1 1 0.236369 -9.110298 0.488764 11.900379 + 308 1 1 0.236369 -9.110304 -0.480655 11.909491 + 309 1 1 0.236369 -9.007939 -1.446733 11.904407 + 310 1 1 0.236369 -8.808203 -2.398372 11.907624 + 311 1 1 0.236369 -8.497827 -3.325156 11.901811 + 312 1 1 0.236369 -8.097600 -4.203402 11.908452 + 313 1 1 0.236369 -7.599611 -5.042783 11.909396 + 314 1 1 0.236369 -7.023189 -5.824264 11.908080 + 315 1 1 0.236369 -6.362364 -6.541619 11.907871 + 316 1 1 0.236369 -5.634340 -7.178748 11.904352 + 317 1 1 0.236369 -4.839173 -7.738678 11.907319 + 318 1 1 0.236369 -3.984984 -8.209963 11.905955 + 319 1 1 0.236369 -3.096898 -8.581793 11.906147 + 320 1 1 0.236369 -2.165798 -8.866601 11.903749 + 321 1 1 0.236369 -1.210239 -9.050098 11.907342 + 322 1 1 0.236369 -0.239174 -9.124435 11.901909 + 323 1 1 0.236369 0.736874 -9.094561 11.900315 + 324 1 1 0.236369 1.699983 -8.971650 11.905920 + 325 1 1 0.236369 2.636773 -8.733502 11.905765 + 326 1 1 0.236369 3.554510 -8.409696 11.905808 + 327 1 1 0.236369 4.429907 -7.984533 11.907245 + 328 1 1 0.236369 5.252794 -7.470225 11.909575 + 329 1 1 0.236369 6.019714 -6.864369 11.909742 + 330 1 1 0.236369 6.715812 -6.193252 11.909333 + 331 1 1 0.236369 7.332818 -5.436181 11.906341 + 332 1 1 0.236369 7.871530 -4.634128 11.909562 + 333 1 1 0.236369 8.315545 -3.770350 11.901470 + 334 1 1 0.236369 8.679190 -2.861096 11.903708 + 335 1 1 0.236369 8.926754 -1.928812 11.900667 + 336 1 1 0.236369 9.080752 -0.965490 11.905684 + 337 1 1 0.236369 9.893911 0.007213 11.284969 + 338 1 1 0.236369 9.843022 0.994033 11.279409 + 339 1 1 0.236369 9.698986 1.967023 11.281860 + 340 1 1 0.236369 9.454189 2.922682 11.278579 + 341 1 1 0.236369 9.123089 3.845766 11.280629 + 342 1 1 0.236369 8.694979 4.732416 11.285398 + 343 1 1 0.236369 8.172183 5.576549 11.282967 + 344 1 1 0.236369 7.583702 6.359481 11.285288 + 345 1 1 0.236369 6.908384 7.088481 11.283987 + 346 1 1 0.236369 6.170659 7.739089 11.286529 + 347 1 1 0.236369 5.371363 8.316176 11.278204 + 348 1 1 0.236369 4.521436 8.808938 11.279355 + 349 1 1 0.236369 3.617469 9.211207 11.281760 + 350 1 1 0.236369 2.688493 9.523629 11.284995 + 351 1 1 0.236369 1.720428 9.746809 11.286527 + 352 1 1 0.236369 0.746106 9.872401 11.277856 + 353 1 1 0.236369 -0.239906 9.894813 11.278973 + 354 1 1 0.236369 -1.224391 9.821727 11.281838 + 355 1 1 0.236369 -2.193793 9.649280 11.285243 + 356 1 1 0.236369 -3.143227 9.381132 11.282841 + 357 1 1 0.236369 -4.065925 9.022492 11.285142 + 358 1 1 0.236369 -4.943813 8.570121 11.279295 + 359 1 1 0.236369 -5.763343 8.038870 11.284324 + 360 1 1 0.236369 -6.542486 7.416157 11.283784 + 361 1 1 0.236369 -7.249694 6.736721 11.277666 + 362 1 1 0.236369 -7.878178 5.972726 11.284999 + 363 1 1 0.236369 -8.430388 5.162562 11.287514 + 364 1 1 0.236369 -8.904059 4.295221 11.278879 + 365 1 1 0.236369 -9.291832 3.383714 11.281203 + 366 1 1 0.236369 -9.580667 2.447719 11.279508 + 367 1 1 0.236369 -9.775115 1.480193 11.284741 + 368 1 1 0.236369 -9.868077 0.500815 11.279376 + 369 1 1 0.236369 -9.876329 -0.487319 11.287466 + 370 1 1 0.236369 -9.771167 -1.465943 11.277767 + 371 1 1 0.236369 -9.577908 -2.434709 11.277995 + 372 1 1 0.236369 -9.289973 -3.373203 11.285640 + 373 1 1 0.236369 -8.908842 -4.282477 11.286195 + 374 1 1 0.236369 -8.434924 -5.152016 11.283260 + 375 1 1 0.236369 -7.878970 -5.963850 11.285138 + 376 1 1 0.236369 -7.248814 -6.722305 11.282792 + 377 1 1 0.236369 -6.538302 -7.407188 11.283456 + 378 1 1 0.236369 -5.771072 -8.026994 11.279504 + 379 1 1 0.236369 -4.941247 -8.555392 11.282632 + 380 1 1 0.236369 -4.061877 -9.012181 11.278106 + 381 1 1 0.236369 -3.147375 -9.374451 11.278158 + 382 1 1 0.236369 -2.197869 -9.634707 11.280949 + 383 1 1 0.236369 -1.223612 -9.805120 11.283906 + 384 1 1 0.236369 -0.243916 -9.877890 11.286517 + 385 1 1 0.236369 0.747338 -9.859262 11.284331 + 386 1 1 0.236369 1.727240 -9.731892 11.284450 + 387 1 1 0.236369 2.685965 -9.515152 11.284555 + 388 1 1 0.236369 3.616730 -9.201883 11.285595 + 389 1 1 0.236369 4.517850 -8.792791 11.284203 + 390 1 1 0.236369 5.366962 -8.298495 11.282796 + 391 1 1 0.236369 6.175494 -7.731697 11.280914 + 392 1 1 0.236369 6.914489 -7.072970 11.286939 + 393 1 1 0.236369 7.584501 -6.354941 11.280062 + 394 1 1 0.236369 8.174263 -5.567352 11.282709 + 395 1 1 0.236369 8.691719 -4.727340 11.285000 + 396 1 1 0.236369 9.113797 -3.833368 11.280139 + 397 1 1 0.236369 9.455047 -2.905230 11.286053 + 398 1 1 0.236369 9.697217 -1.953205 11.282979 + 399 1 1 0.236369 9.842656 -0.977705 11.286698 + 400 1 1 0.236369 10.608389 0.009323 10.610109 + 401 1 1 0.236369 10.565585 0.985530 10.615955 + 402 1 1 0.236369 10.426946 1.954641 10.615879 + 403 1 1 0.236369 10.207687 2.906443 10.612479 + 404 1 1 0.236369 9.895071 3.837892 10.607619 + 405 1 1 0.236369 9.501600 4.731401 10.610270 + 406 1 1 0.236369 9.024913 5.587732 10.609360 + 407 1 1 0.236369 8.470636 6.395593 10.609263 + 408 1 1 0.236369 7.838709 7.150305 10.608867 + 409 1 1 0.236369 7.146309 7.843407 10.606615 + 410 1 1 0.236369 6.395102 8.473356 10.615532 + 411 1 1 0.236369 5.588965 9.019979 10.611137 + 412 1 1 0.236369 4.734314 9.498027 10.612386 + 413 1 1 0.236369 3.835623 9.896103 10.609758 + 414 1 1 0.236369 2.910834 10.206571 10.616542 + 415 1 1 0.236369 1.956142 10.428626 10.616441 + 416 1 1 0.236369 0.988340 10.567152 10.616247 + 417 1 1 0.236369 0.005313 10.615385 10.613264 + 418 1 1 0.236369 -0.975402 10.561965 10.613863 + 419 1 1 0.236369 -1.947902 10.430413 10.609942 + 420 1 1 0.236369 -2.896525 10.202544 10.611829 + 421 1 1 0.236369 -3.823758 9.895994 10.609335 + 422 1 1 0.236369 -4.723535 9.500034 10.613786 + 423 1 1 0.236369 -5.582748 9.025595 10.614382 + 424 1 1 0.236369 -6.389241 8.466582 10.607412 + 425 1 1 0.236369 -7.144085 7.844247 10.608818 + 426 1 1 0.236369 -7.835563 7.150211 10.608641 + 427 1 1 0.236369 -8.459850 6.400515 10.612843 + 428 1 1 0.236369 -9.012643 5.590265 10.613854 + 429 1 1 0.236369 -9.490066 4.731308 10.614945 + 430 1 1 0.236369 -9.881608 3.835018 10.606791 + 431 1 1 0.236369 -10.196521 2.905172 10.608623 + 432 1 1 0.236369 -10.416568 1.958483 10.611293 + 433 1 1 0.236369 -10.554979 0.981636 10.610386 + 434 1 1 0.236369 -10.597025 0.001584 10.610006 + 435 1 1 0.236369 -10.558949 -0.975041 10.607240 + 436 1 1 0.236369 -10.419243 -1.941542 10.614215 + 437 1 1 0.236369 -10.198811 -2.895575 10.610628 + 438 1 1 0.236369 -9.883643 -3.824538 10.613345 + 439 1 1 0.236369 -9.487689 -4.727707 10.612112 + 440 1 1 0.236369 -9.017235 -5.579913 10.607116 + 441 1 1 0.236369 -8.461703 -6.382891 10.609677 + 442 1 1 0.236369 -7.836133 -7.142438 10.616256 + 443 1 1 0.236369 -7.138943 -7.832402 10.615916 + 444 1 1 0.236369 -6.383462 -8.461273 10.610382 + 445 1 1 0.236369 -5.580212 -9.016664 10.612778 + 446 1 1 0.236369 -4.719964 -9.490757 10.612227 + 447 1 1 0.236369 -3.824793 -9.882185 10.614907 + 448 1 1 0.236369 -2.902567 -10.191890 10.616179 + 449 1 1 0.236369 -1.942936 -10.417384 10.607357 + 450 1 1 0.236369 -0.974786 -10.560518 10.615482 + 451 1 1 0.236369 0.009160 -10.603225 10.612226 + 452 1 1 0.236369 0.978665 -10.558995 10.608545 + 453 1 1 0.236369 1.953582 -10.422826 10.608816 + 454 1 1 0.236369 2.906878 -10.191857 10.613659 + 455 1 1 0.236369 3.836156 -9.884879 10.612569 + 456 1 1 0.236369 4.735471 -9.487148 10.612465 + 457 1 1 0.236369 5.586881 -9.009496 10.616287 + 458 1 1 0.236369 6.399753 -8.462582 10.612419 + 459 1 1 0.236369 7.150335 -7.829342 10.607600 + 460 1 1 0.236369 7.838731 -7.144570 10.608268 + 461 1 1 0.236369 8.466010 -6.384455 10.607623 + 462 1 1 0.236369 9.025132 -5.576363 10.608064 + 463 1 1 0.236369 9.499375 -4.720595 10.613317 + 464 1 1 0.236369 9.891889 -3.830212 10.613000 + 465 1 1 0.236369 10.205113 -2.898176 10.610326 + 466 1 1 0.236369 10.432078 -1.943870 10.608230 + 467 1 1 0.236369 10.563273 -0.973349 10.610497 + 468 1 1 0.236369 11.284981 0.008597 9.898187 + 469 1 1 0.236369 11.237111 0.989685 9.894185 + 470 1 1 0.236369 11.115439 1.966393 9.897738 + 471 1 1 0.236369 10.896013 2.924169 9.893139 + 472 1 1 0.236369 10.605130 3.866724 9.896587 + 473 1 1 0.236369 10.222861 4.766785 9.899038 + 474 1 1 0.236369 9.769561 5.644214 9.892284 + 475 1 1 0.236369 9.238978 6.471381 9.894991 + 476 1 1 0.236369 8.644903 7.253909 9.891317 + 477 1 1 0.236369 7.981299 7.981314 9.891511 + 478 1 1 0.236369 7.254566 8.641223 9.890827 + 479 1 1 0.236369 6.472821 9.244148 9.890980 + 480 1 1 0.236369 5.645243 9.769947 9.896457 + 481 1 1 0.236369 4.772595 10.229783 9.894301 + 482 1 1 0.236369 3.863956 10.598809 9.896573 + 483 1 1 0.236369 2.925215 10.894346 9.898753 + 484 1 1 0.236369 1.967786 11.115856 9.897823 + 485 1 1 0.236369 0.984997 11.236211 9.899949 + 486 1 1 0.236369 0.007093 11.279122 9.898003 + 487 1 1 0.236369 -0.980545 11.236238 9.899543 + 488 1 1 0.236369 -1.957140 11.107161 9.897579 + 489 1 1 0.236369 -2.912784 10.897867 9.892723 + 490 1 1 0.236369 -3.852664 10.604164 9.897380 + 491 1 1 0.236369 -4.761531 10.229287 9.897122 + 492 1 1 0.236369 -5.632179 9.774588 9.897920 + 493 1 1 0.236369 -6.460861 9.245194 9.897659 + 494 1 1 0.236369 -7.245598 8.643867 9.893371 + 495 1 1 0.236369 -7.967845 7.981551 9.895292 + 496 1 1 0.236369 -8.634979 7.258680 9.897918 + 497 1 1 0.236369 -9.229647 6.473622 9.895915 + 498 1 1 0.236369 -9.758356 5.641849 9.899726 + 499 1 1 0.236369 -10.218410 4.774017 9.891903 + 500 1 1 0.236369 -10.591340 3.859529 9.899260 + 501 1 1 0.236369 -10.887500 2.921200 9.897709 + 502 1 1 0.236369 -11.100858 1.962981 9.893049 + 503 1 1 0.236369 -11.225983 0.989101 9.896461 + 504 1 1 0.236369 -11.274949 0.006153 9.894816 + 505 1 1 0.236369 -11.231502 -0.981681 9.891482 + 506 1 1 0.236369 -11.105073 -1.957096 9.895681 + 507 1 1 0.236369 -10.883924 -2.916012 9.899882 + 508 1 1 0.236369 -10.591019 -3.849808 9.894609 + 509 1 1 0.236369 -10.216179 -4.762005 9.896097 + 510 1 1 0.236369 -9.760292 -5.630509 9.891297 + 511 1 1 0.236369 -9.232620 -6.459213 9.892186 + 512 1 1 0.236369 -8.632667 -7.245109 9.891817 + 513 1 1 0.236369 -7.969027 -7.973943 9.890556 + 514 1 1 0.236369 -7.241889 -8.633429 9.892914 + 515 1 1 0.236369 -6.463339 -9.230590 9.892489 + 516 1 1 0.236369 -5.628862 -9.763483 9.893773 + 517 1 1 0.236369 -4.763932 -10.216045 9.891531 + 518 1 1 0.236369 -3.856107 -10.595258 9.900173 + 519 1 1 0.236369 -2.917760 -10.883930 9.895322 + 520 1 1 0.236369 -1.957698 -11.101442 9.894066 + 521 1 1 0.236369 -0.978862 -11.229282 9.892686 + 522 1 1 0.236369 0.004484 -11.275387 9.893835 + 523 1 1 0.236369 0.986566 -11.233723 9.894178 + 524 1 1 0.236369 1.965969 -11.105663 9.899450 + 525 1 1 0.236369 2.925136 -10.885127 9.895142 + 526 1 1 0.236369 3.864885 -10.589760 9.896279 + 527 1 1 0.236369 4.775447 -10.219017 9.890235 + 528 1 1 0.236369 5.648526 -9.757734 9.896065 + 529 1 1 0.236369 6.470484 -9.231224 9.897962 + 530 1 1 0.236369 7.250488 -8.632572 9.896759 + 531 1 1 0.236369 7.981428 -7.964562 9.895470 + 532 1 1 0.236369 8.640079 -7.248763 9.898445 + 533 1 1 0.236369 9.243321 -6.464321 9.899812 + 534 1 1 0.236369 9.771989 -5.633899 9.893325 + 535 1 1 0.236369 10.229585 -4.760283 9.898158 + 536 1 1 0.236369 10.602323 -3.856333 9.893039 + 537 1 1 0.236369 10.897257 -2.912255 9.890336 + 538 1 1 0.236369 11.112979 -1.957811 9.891129 + 539 1 1 0.236369 11.242095 -0.977339 9.893474 + 540 1 1 0.236369 11.905501 0.007120 9.134477 + 541 1 1 0.236369 11.863132 0.987598 9.131602 + 542 1 1 0.236369 11.739495 1.964901 9.133044 + 543 1 1 0.236369 11.542015 2.923489 9.135861 + 544 1 1 0.236369 11.258130 3.870478 9.139089 + 545 1 1 0.236369 10.898422 4.784103 9.138234 + 546 1 1 0.236369 10.473551 5.664954 9.138567 + 547 1 1 0.236369 9.964960 6.512622 9.136019 + 548 1 1 0.236369 9.395433 7.311944 9.140614 + 549 1 1 0.236369 8.762213 8.062267 9.141311 + 550 1 1 0.236369 8.063446 8.761565 9.140747 + 551 1 1 0.236369 7.316679 9.396238 9.136037 + 552 1 1 0.236369 6.512794 9.966665 9.140471 + 553 1 1 0.236369 5.670751 10.468179 9.135286 + 554 1 1 0.236369 4.787337 10.906563 9.137452 + 555 1 1 0.236369 3.868444 11.264119 9.137025 + 556 1 1 0.236369 2.921547 11.538993 9.139880 + 557 1 1 0.236369 1.962034 11.744149 9.134269 + 558 1 1 0.236369 0.986962 11.867449 9.138055 + 559 1 1 0.236369 0.002703 11.909849 9.137444 + 560 1 1 0.236369 -0.980748 11.868851 9.137986 + 561 1 1 0.236369 -1.950508 11.741844 9.134521 + 562 1 1 0.236369 -2.917052 11.537781 9.134738 + 563 1 1 0.236369 -3.855143 11.263477 9.133303 + 564 1 1 0.236369 -4.776384 10.899116 9.132428 + 565 1 1 0.236369 -5.656226 10.467590 9.134287 + 566 1 1 0.236369 -6.504879 9.966091 9.134970 + 567 1 1 0.236369 -7.301230 9.399486 9.136779 + 568 1 1 0.236369 -8.052303 8.761163 9.141330 + 569 1 1 0.236369 -8.751561 8.065716 9.131703 + 570 1 1 0.236369 -9.388849 7.318574 9.138517 + 571 1 1 0.236369 -9.954628 6.514598 9.140473 + 572 1 1 0.236369 -10.456509 5.664017 9.140080 + 573 1 1 0.236369 -10.894702 4.788390 9.132613 + 574 1 1 0.236369 -11.248796 3.870109 9.140974 + 575 1 1 0.236369 -11.531768 2.926150 9.135830 + 576 1 1 0.236369 -11.729661 1.961409 9.140179 + 577 1 1 0.236369 -11.851966 0.985300 9.140071 + 578 1 1 0.236369 -11.898628 0.004810 9.134973 + 579 1 1 0.236369 -11.851035 -0.980446 9.137733 + 580 1 1 0.236369 -11.728097 -1.958239 9.140067 + 581 1 1 0.236369 -11.531010 -2.919659 9.131631 + 582 1 1 0.236369 -11.246666 -3.861437 9.132190 + 583 1 1 0.236369 -10.892097 -4.778317 9.135189 + 584 1 1 0.236369 -10.464454 -5.657860 9.132913 + 585 1 1 0.236369 -9.960534 -6.500610 9.131762 + 586 1 1 0.236369 -9.386939 -7.301209 9.139244 + 587 1 1 0.236369 -8.747848 -8.051832 9.134694 + 588 1 1 0.236369 -8.051598 -8.748254 9.139596 + 589 1 1 0.236369 -7.301416 -9.382415 9.133158 + 590 1 1 0.236369 -6.505662 -9.954721 9.138183 + 591 1 1 0.236369 -5.658576 -10.463964 9.140177 + 592 1 1 0.236369 -4.779397 -10.888044 9.138993 + 593 1 1 0.236369 -3.862904 -11.254573 9.133718 + 594 1 1 0.236369 -2.919988 -11.529648 9.135011 + 595 1 1 0.236369 -1.951938 -11.735844 9.135053 + 596 1 1 0.236369 -0.977767 -11.857216 9.134096 + 597 1 1 0.236369 0.001897 -11.896903 9.134794 + 598 1 1 0.236369 0.987669 -11.857676 9.132291 + 599 1 1 0.236369 1.960201 -11.732927 9.135937 + 600 1 1 0.236369 2.921901 -11.526647 9.135968 + 601 1 1 0.236369 3.872528 -11.251563 9.131712 + 602 1 1 0.236369 4.785902 -10.892133 9.137792 + 603 1 1 0.236369 5.673213 -10.459936 9.132016 + 604 1 1 0.236369 6.515814 -9.955386 9.133113 + 605 1 1 0.236369 7.315144 -9.386994 9.138268 + 606 1 1 0.236369 8.068008 -8.746748 9.136967 + 607 1 1 0.236369 8.764125 -8.050649 9.131482 + 608 1 1 0.236369 9.400898 -7.301807 9.134302 + 609 1 1 0.236369 9.962538 -6.505991 9.135188 + 610 1 1 0.236369 10.474656 -5.655949 9.132886 + 611 1 1 0.236369 10.904103 -4.778868 9.132167 + 612 1 1 0.236369 11.265409 -3.858976 9.136029 + 613 1 1 0.236369 11.541431 -2.915244 9.135125 + 614 1 1 0.236369 11.742791 -1.951687 9.139667 + 615 1 1 0.236369 11.867668 -0.978886 9.136797 + 616 1 1 0.236369 12.474323 0.007287 8.341729 + 617 1 1 0.236369 12.438578 0.987418 8.338157 + 618 1 1 0.236369 12.327501 1.951616 8.333694 + 619 1 1 0.236369 12.133187 2.912923 8.333603 + 620 1 1 0.236369 11.870071 3.862704 8.335216 + 621 1 1 0.236369 11.530053 4.777062 8.337213 + 622 1 1 0.236369 11.118533 5.666303 8.340736 + 623 1 1 0.236369 10.636633 6.526217 8.335148 + 624 1 1 0.236369 10.096760 7.338386 8.336341 + 625 1 1 0.236369 9.484652 8.109755 8.340003 + 626 1 1 0.236369 8.825327 8.821402 8.336426 + 627 1 1 0.236369 8.106554 9.484779 8.336773 + 628 1 1 0.236369 7.338181 10.093942 8.335108 + 629 1 1 0.236369 6.525533 10.639169 8.337430 + 630 1 1 0.236369 5.672013 11.118375 8.342511 + 631 1 1 0.236369 4.780535 11.532433 8.342431 + 632 1 1 0.236369 3.859888 11.866547 8.337490 + 633 1 1 0.236369 2.920824 12.131449 8.340308 + 634 1 1 0.236369 1.956858 12.328443 8.336076 + 635 1 1 0.236369 0.978715 12.436207 8.343053 + 636 1 1 0.236369 0.001209 12.478697 8.339800 + 637 1 1 0.236369 -0.969918 12.443240 8.335623 + 638 1 1 0.236369 -1.946215 12.325204 8.334650 + 639 1 1 0.236369 -2.903092 12.130432 8.339212 + 640 1 1 0.236369 -3.851980 11.866930 8.336297 + 641 1 1 0.236369 -4.767322 11.522681 8.334265 + 642 1 1 0.236369 -5.655891 11.121511 8.335138 + 643 1 1 0.236369 -6.516305 10.638210 8.334049 + 644 1 1 0.236369 -7.324737 10.093108 8.340362 + 645 1 1 0.236369 -8.096321 9.493323 8.341371 + 646 1 1 0.236369 -8.818572 8.823674 8.341627 + 647 1 1 0.236369 -9.478921 8.102821 8.336204 + 648 1 1 0.236369 -10.088171 7.331730 8.342512 + 649 1 1 0.236369 -10.632935 6.522447 8.339633 + 650 1 1 0.236369 -11.110618 5.663720 8.333698 + 651 1 1 0.236369 -11.521201 4.773576 8.336994 + 652 1 1 0.236369 -11.859728 3.859879 8.338890 + 653 1 1 0.236369 -12.127014 2.914411 8.339831 + 654 1 1 0.236369 -12.312141 1.954677 8.338021 + 655 1 1 0.236369 -12.430778 0.985794 8.341665 + 656 1 1 0.236369 -12.466658 0.008583 8.335002 + 657 1 1 0.236369 -12.426645 -0.975066 8.343302 + 658 1 1 0.236369 -12.313501 -1.941440 8.341891 + 659 1 1 0.236369 -12.122083 -2.902005 8.336955 + 660 1 1 0.236369 -11.857167 -3.852013 8.339716 + 661 1 1 0.236369 -11.521427 -4.765162 8.336591 + 662 1 1 0.236369 -11.107769 -5.656034 8.334446 + 663 1 1 0.236369 -10.625636 -6.507436 8.338769 + 664 1 1 0.236369 -10.081356 -7.324858 8.341806 + 665 1 1 0.236369 -9.481114 -8.092923 8.341193 + 666 1 1 0.236369 -8.816982 -8.811630 8.343030 + 667 1 1 0.236369 -8.094295 -9.479966 8.336889 + 668 1 1 0.236369 -7.324481 -10.087581 8.337451 + 669 1 1 0.236369 -6.512455 -10.633798 8.335058 + 670 1 1 0.236369 -5.660130 -11.107952 8.336891 + 671 1 1 0.236369 -4.763365 -11.516216 8.339090 + 672 1 1 0.236369 -3.853253 -11.858829 8.339056 + 673 1 1 0.236369 -2.910484 -12.122262 8.335158 + 674 1 1 0.236369 -1.949637 -12.316036 8.334724 + 675 1 1 0.236369 -0.976881 -12.430622 8.337539 + 676 1 1 0.236369 0.006210 -12.465539 8.341867 + 677 1 1 0.236369 0.984282 -12.424683 8.335404 + 678 1 1 0.236369 1.951578 -12.309882 8.338561 + 679 1 1 0.236369 2.920853 -12.125341 8.334817 + 680 1 1 0.236369 3.861360 -11.857628 8.342200 + 681 1 1 0.236369 4.780223 -11.513788 8.341220 + 682 1 1 0.236369 5.662824 -11.110107 8.339197 + 683 1 1 0.236369 6.525230 -10.624498 8.337449 + 684 1 1 0.236369 7.340228 -10.083904 8.338455 + 685 1 1 0.236369 8.109789 -9.482163 8.342423 + 686 1 1 0.236369 8.827656 -8.810805 8.342604 + 687 1 1 0.236369 9.491672 -8.093388 8.338537 + 688 1 1 0.236369 10.095229 -7.325419 8.338846 + 689 1 1 0.236369 10.635942 -6.514112 8.342651 + 690 1 1 0.236369 11.116659 -5.661788 8.339339 + 691 1 1 0.236369 11.524006 -4.770511 8.341311 + 692 1 1 0.236369 11.861928 -3.850462 8.340167 + 693 1 1 0.236369 12.136832 -2.905206 8.338250 + 694 1 1 0.236369 12.321506 -1.941197 8.335751 + 695 1 1 0.236369 12.436552 -0.976474 8.339579 + 696 1 1 0.236369 12.993710 0.007571 7.501843 + 697 1 1 0.236369 12.957848 0.991310 7.501975 + 698 1 1 0.236369 12.848261 1.963987 7.508620 + 699 1 1 0.236369 12.657076 2.926451 7.501256 + 700 1 1 0.236369 12.407794 3.881814 7.506456 + 701 1 1 0.236369 12.076487 4.805124 7.504373 + 702 1 1 0.236369 11.681822 5.700681 7.506126 + 703 1 1 0.236369 11.212281 6.574788 7.507375 + 704 1 1 0.236369 10.684580 7.401285 7.503033 + 705 1 1 0.236369 10.090805 8.182451 7.500430 + 706 1 1 0.236369 9.444381 8.930246 7.508355 + 707 1 1 0.236369 8.747499 9.610094 7.503693 + 708 1 1 0.236369 7.992372 10.243681 7.506613 + 709 1 1 0.236369 7.200482 10.828036 7.508957 + 710 1 1 0.236369 6.353919 11.337913 7.502741 + 711 1 1 0.236369 5.487475 11.782816 7.509979 + 712 1 1 0.236369 4.576468 12.164621 7.508344 + 713 1 1 0.236369 3.645433 12.478092 7.507913 + 714 1 1 0.236369 2.694813 12.710396 7.506566 + 715 1 1 0.236369 1.718773 12.883816 7.505437 + 716 1 1 0.236369 0.741288 12.976463 7.503867 + 717 1 1 0.236369 -0.241183 12.992644 7.508222 + 718 1 1 0.236369 -1.219758 12.938089 7.505953 + 719 1 1 0.236369 -2.193752 12.805793 7.507816 + 720 1 1 0.236369 -3.162855 12.600913 7.509877 + 721 1 1 0.236369 -4.105877 12.327837 7.507883 + 722 1 1 0.236369 -5.024334 11.987090 7.508529 + 723 1 1 0.236369 -5.918837 11.565593 7.504856 + 724 1 1 0.236369 -6.771753 11.086148 7.508738 + 725 1 1 0.236369 -7.592363 10.541510 7.503338 + 726 1 1 0.236369 -8.369206 9.934465 7.502053 + 727 1 1 0.236369 -9.096167 9.277220 7.504944 + 728 1 1 0.236369 -9.764385 8.565778 7.500312 + 729 1 1 0.236369 -10.385881 7.802834 7.508276 + 730 1 1 0.236369 -10.947621 6.992721 7.502643 + 731 1 1 0.236369 -11.440121 6.141000 7.506775 + 732 1 1 0.236369 -11.879558 5.256682 7.507939 + 733 1 1 0.236369 -12.236448 4.347058 7.506818 + 734 1 1 0.236369 -12.529715 3.410524 7.506508 + 735 1 1 0.236369 -12.752821 2.453059 7.502373 + 736 1 1 0.236369 -12.904880 1.472722 7.504774 + 737 1 1 0.236369 -12.975105 0.496402 7.509364 + 738 1 1 0.236369 -12.978077 -0.490293 7.502411 + 739 1 1 0.236369 -12.905381 -1.469381 7.502091 + 740 1 1 0.236369 -12.756313 -2.434974 7.502725 + 741 1 1 0.236369 -12.528128 -3.399757 7.507758 + 742 1 1 0.236369 -12.243189 -4.338927 7.503314 + 743 1 1 0.236369 -11.878174 -5.248265 7.506031 + 744 1 1 0.236369 -11.448705 -6.134024 7.501840 + 745 1 1 0.236369 -10.947888 -6.981665 7.500875 + 746 1 1 0.236369 -10.392502 -7.785873 7.503089 + 747 1 1 0.236369 -9.764465 -8.549057 7.502309 + 748 1 1 0.236369 -9.096290 -9.265291 7.509092 + 749 1 1 0.236369 -8.370029 -9.929459 7.509369 + 750 1 1 0.236369 -7.592647 -10.531836 7.500319 + 751 1 1 0.236369 -6.772411 -11.080398 7.505936 + 752 1 1 0.236369 -5.918387 -11.557160 7.500438 + 753 1 1 0.236369 -5.017977 -11.971141 7.504249 + 754 1 1 0.236369 -4.104337 -12.317834 7.505216 + 755 1 1 0.236369 -3.160884 -12.595744 7.508403 + 756 1 1 0.236369 -2.201313 -12.798758 7.506250 + 757 1 1 0.236369 -1.224415 -12.930551 7.502552 + 758 1 1 0.236369 -0.245368 -12.980101 7.509047 + 759 1 1 0.236369 0.742197 -12.964523 7.507673 + 760 1 1 0.236369 1.723509 -12.873010 7.505627 + 761 1 1 0.236369 2.691129 -12.702157 7.508972 + 762 1 1 0.236369 3.639262 -12.468089 7.503681 + 763 1 1 0.236369 4.571877 -12.151129 7.503377 + 764 1 1 0.236369 5.485363 -11.770884 7.506189 + 765 1 1 0.236369 6.361789 -11.322589 7.500869 + 766 1 1 0.236369 7.196835 -10.814448 7.503755 + 767 1 1 0.236369 7.990156 -10.239451 7.501874 + 768 1 1 0.236369 8.749129 -9.601131 7.508105 + 769 1 1 0.236369 9.445991 -8.916522 7.507232 + 770 1 1 0.236369 10.093203 -8.175773 7.506747 + 771 1 1 0.236369 10.687583 -7.387980 7.509140 + 772 1 1 0.236369 11.208905 -6.556421 7.508210 + 773 1 1 0.236369 11.673766 -5.694055 7.505487 + 774 1 1 0.236369 12.077576 -4.793994 7.500155 + 775 1 1 0.236369 12.405406 -3.867996 7.500947 + 776 1 1 0.236369 12.662085 -2.915590 7.505148 + 777 1 1 0.236369 12.849076 -1.950627 7.509525 + 778 1 1 0.236369 12.960250 -0.980748 7.508431 + 779 1 1 0.236369 13.460905 0.001787 6.643680 + 780 1 1 0.236369 13.420082 0.984448 6.644064 + 781 1 1 0.236369 13.316652 1.966304 6.638056 + 782 1 1 0.236369 13.136804 2.927099 6.637539 + 783 1 1 0.236369 12.886653 3.885653 6.642163 + 784 1 1 0.236369 12.566020 4.812956 6.636453 + 785 1 1 0.236369 12.188879 5.712009 6.643922 + 786 1 1 0.236369 11.735136 6.592766 6.643633 + 787 1 1 0.236369 11.225927 7.432076 6.637988 + 788 1 1 0.236369 10.655487 8.231792 6.637779 + 789 1 1 0.236369 10.020536 8.983207 6.641257 + 790 1 1 0.236369 9.338722 9.690556 6.641496 + 791 1 1 0.236369 8.611075 10.342447 6.642334 + 792 1 1 0.236369 7.832653 10.946398 6.640267 + 793 1 1 0.236369 7.017163 11.488950 6.635302 + 794 1 1 0.236369 6.159312 11.966054 6.639925 + 795 1 1 0.236369 5.268911 12.386440 6.634761 + 796 1 1 0.236369 4.344253 12.737892 6.641907 + 797 1 1 0.236369 3.403465 13.017634 6.640927 + 798 1 1 0.236369 2.444462 13.235540 6.640325 + 799 1 1 0.236369 1.479364 13.372649 6.636600 + 800 1 1 0.236369 0.500764 13.447304 6.641467 + 801 1 1 0.236369 -0.484497 13.449446 6.641575 + 802 1 1 0.236369 -1.470060 13.375653 6.637773 + 803 1 1 0.236369 -2.436350 13.235330 6.634658 + 804 1 1 0.236369 -3.401632 13.019266 6.642767 + 805 1 1 0.236369 -4.342565 12.733890 6.642033 + 806 1 1 0.236369 -5.255160 12.390639 6.639427 + 807 1 1 0.236369 -6.148034 11.970807 6.641400 + 808 1 1 0.236369 -7.001720 11.490053 6.642242 + 809 1 1 0.236369 -7.820310 10.948014 6.637637 + 810 1 1 0.236369 -8.599748 10.348126 6.643467 + 811 1 1 0.236369 -9.330043 9.693349 6.640097 + 812 1 1 0.236369 -10.017140 8.982667 6.637209 + 813 1 1 0.236369 -10.640725 8.223694 6.636999 + 814 1 1 0.236369 -11.210143 7.426788 6.643232 + 815 1 1 0.236369 -11.723091 6.592393 6.637991 + 816 1 1 0.236369 -12.180215 5.711968 6.635831 + 817 1 1 0.236369 -12.561739 4.809159 6.643794 + 818 1 1 0.236369 -12.878996 3.885488 6.640839 + 819 1 1 0.236369 -13.124387 2.933171 6.644152 + 820 1 1 0.236369 -13.303747 1.961008 6.636269 + 821 1 1 0.236369 -13.409308 0.992010 6.642618 + 822 1 1 0.236369 -13.449415 0.000637 6.639268 + 823 1 1 0.236369 -13.415142 -0.977758 6.640238 + 824 1 1 0.236369 -13.308860 -1.954742 6.634779 + 825 1 1 0.236369 -13.123518 -2.921105 6.639975 + 826 1 1 0.236369 -12.880631 -3.874704 6.640666 + 827 1 1 0.236369 -12.561521 -4.801617 6.639311 + 828 1 1 0.236369 -12.175560 -5.704119 6.634927 + 829 1 1 0.236369 -11.729471 -6.574302 6.639482 + 830 1 1 0.236369 -11.213429 -7.420783 6.634862 + 831 1 1 0.236369 -10.643230 -8.218635 6.642767 + 832 1 1 0.236369 -10.017970 -8.974838 6.640277 + 833 1 1 0.236369 -9.329624 -9.682012 6.641241 + 834 1 1 0.236369 -8.604573 -10.338796 6.640803 + 835 1 1 0.236369 -7.824860 -10.941032 6.640565 + 836 1 1 0.236369 -7.005884 -11.478972 6.643869 + 837 1 1 0.236369 -6.146014 -11.961965 6.636100 + 838 1 1 0.236369 -5.260652 -12.372814 6.639079 + 839 1 1 0.236369 -4.339686 -12.727254 6.642754 + 840 1 1 0.236369 -3.401687 -13.006505 6.639300 + 841 1 1 0.236369 -2.442454 -13.219569 6.641954 + 842 1 1 0.236369 -1.463537 -13.366531 6.636129 + 843 1 1 0.236369 -0.488418 -13.442926 6.641247 + 844 1 1 0.236369 0.497369 -13.434851 6.643475 + 845 1 1 0.236369 1.481025 -13.366450 6.635957 + 846 1 1 0.236369 2.447902 -13.220472 6.638611 + 847 1 1 0.236369 3.409683 -13.011402 6.634749 + 848 1 1 0.236369 4.351320 -12.726468 6.636588 + 849 1 1 0.236369 5.265894 -12.380793 6.640992 + 850 1 1 0.236369 6.157878 -11.955153 6.643044 + 851 1 1 0.236369 7.009355 -11.477045 6.637778 + 852 1 1 0.236369 7.837139 -10.940216 6.634603 + 853 1 1 0.236369 8.607454 -10.333678 6.643383 + 854 1 1 0.236369 9.340105 -9.680969 6.639041 + 855 1 1 0.236369 10.027466 -8.976652 6.643435 + 856 1 1 0.236369 10.652950 -8.220031 6.637610 + 857 1 1 0.236369 11.227538 -7.420494 6.641241 + 858 1 1 0.236369 11.735720 -6.581916 6.634505 + 859 1 1 0.236369 12.183807 -5.703225 6.639454 + 860 1 1 0.236369 12.565776 -4.798318 6.637648 + 861 1 1 0.236369 12.889421 -3.870351 6.637691 + 862 1 1 0.236369 13.135533 -2.919573 6.643864 + 863 1 1 0.236369 13.314244 -1.952480 6.641835 + 864 1 1 0.236369 13.423301 -0.972158 6.637670 + 865 1 1 0.236369 13.858787 0.006343 5.746580 + 866 1 1 0.236369 13.826831 0.983547 5.744407 + 867 1 1 0.236369 13.728011 1.959307 5.746016 + 868 1 1 0.236369 13.555505 2.918880 5.749846 + 869 1 1 0.236369 13.310552 3.864969 5.746410 + 870 1 1 0.236369 13.005053 4.800391 5.741757 + 871 1 1 0.236369 12.634344 5.700556 5.748634 + 872 1 1 0.236369 12.200228 6.579132 5.747513 + 873 1 1 0.236369 11.710330 7.424531 5.741340 + 874 1 1 0.236369 11.160284 8.231376 5.741865 + 875 1 1 0.236369 10.553020 8.993001 5.743222 + 876 1 1 0.236369 9.890627 9.713183 5.744487 + 877 1 1 0.236369 9.176679 10.388218 5.745536 + 878 1 1 0.236369 8.426471 11.015515 5.743002 + 879 1 1 0.236369 7.624033 11.578965 5.748531 + 880 1 1 0.236369 6.788750 12.086890 5.748179 + 881 1 1 0.236369 5.919216 12.535227 5.742989 + 882 1 1 0.236369 5.020990 12.924916 5.746408 + 883 1 1 0.236369 4.097585 13.245614 5.741267 + 884 1 1 0.236369 3.153791 13.501594 5.746951 + 885 1 1 0.236369 2.195228 13.685338 5.743725 + 886 1 1 0.236369 1.224521 13.808591 5.746946 + 887 1 1 0.236369 0.246752 13.861085 5.743205 + 888 1 1 0.236369 -0.730913 13.842525 5.747056 + 889 1 1 0.236369 -1.698840 13.757368 5.744189 + 890 1 1 0.236369 -2.666574 13.601267 5.744170 + 891 1 1 0.236369 -3.620567 13.383149 5.742321 + 892 1 1 0.236369 -4.558733 13.090117 5.747497 + 893 1 1 0.236369 -5.470189 12.739097 5.748445 + 894 1 1 0.236369 -6.356005 12.319064 5.749516 + 895 1 1 0.236369 -7.200441 11.842472 5.745393 + 896 1 1 0.236369 -8.019394 11.306518 5.742183 + 897 1 1 0.236369 -8.797778 10.707996 5.746280 + 898 1 1 0.236369 -9.533259 10.064214 5.742233 + 899 1 1 0.236369 -10.220258 9.359631 5.744355 + 900 1 1 0.236369 -10.850298 8.621829 5.748782 + 901 1 1 0.236369 -11.427159 7.826661 5.744542 + 902 1 1 0.236369 -11.958871 7.004237 5.749508 + 903 1 1 0.236369 -12.421947 6.138680 5.743982 + 904 1 1 0.236369 -12.822608 5.254840 5.747234 + 905 1 1 0.236369 -13.163986 4.330706 5.746138 + 906 1 1 0.236369 -13.430449 3.391159 5.741260 + 907 1 1 0.236369 -13.638887 2.435025 5.744375 + 908 1 1 0.236369 -13.770734 1.471706 5.749499 + 909 1 1 0.236369 -13.845538 0.491214 5.740807 + 910 1 1 0.236369 -13.843353 -0.486095 5.744092 + 911 1 1 0.236369 -13.779019 -1.457108 5.742658 + 912 1 1 0.236369 -13.639097 -2.428197 5.742530 + 913 1 1 0.236369 -13.435679 -3.380410 5.743823 + 914 1 1 0.236369 -13.157145 -4.328335 5.749493 + 915 1 1 0.236369 -12.817865 -5.242389 5.745276 + 916 1 1 0.236369 -12.421017 -6.132738 5.748284 + 917 1 1 0.236369 -11.953720 -6.993932 5.743754 + 918 1 1 0.236369 -11.434097 -7.817595 5.744838 + 919 1 1 0.236369 -10.851216 -8.611835 5.749762 + 920 1 1 0.236369 -10.213596 -9.354448 5.741581 + 921 1 1 0.236369 -9.530418 -10.055162 5.740955 + 922 1 1 0.236369 -8.800003 -10.693313 5.747312 + 923 1 1 0.236369 -8.023469 -11.289480 5.749569 + 924 1 1 0.236369 -7.205053 -11.827667 5.741340 + 925 1 1 0.236369 -6.352552 -12.312866 5.746768 + 926 1 1 0.236369 -5.468713 -12.728488 5.741712 + 927 1 1 0.236369 -4.554994 -13.084764 5.747191 + 928 1 1 0.236369 -3.618699 -13.370411 5.746508 + 929 1 1 0.236369 -2.669363 -13.589757 5.740689 + 930 1 1 0.236369 -1.703475 -13.746236 5.748231 + 931 1 1 0.236369 -0.732175 -13.831888 5.750114 + 932 1 1 0.236369 0.244820 -13.849639 5.744619 + 933 1 1 0.236369 1.224259 -13.796974 5.743699 + 934 1 1 0.236369 2.195229 -13.675130 5.740740 + 935 1 1 0.236369 3.158366 -13.488748 5.742504 + 936 1 1 0.236369 4.105472 -13.237269 5.746062 + 937 1 1 0.236369 5.028927 -12.911443 5.746265 + 938 1 1 0.236369 5.922809 -12.529288 5.742777 + 939 1 1 0.236369 6.789812 -12.073184 5.746795 + 940 1 1 0.236369 7.630407 -11.572598 5.740852 + 941 1 1 0.236369 8.427747 -11.003454 5.749657 + 942 1 1 0.236369 9.182997 -10.379667 5.741177 + 943 1 1 0.236369 9.892752 -9.707614 5.743591 + 944 1 1 0.236369 10.546850 -8.982820 5.746762 + 945 1 1 0.236369 11.160544 -8.219281 5.745291 + 946 1 1 0.236369 11.710731 -7.415056 5.745561 + 947 1 1 0.236369 12.202271 -6.566022 5.744043 + 948 1 1 0.236369 12.634405 -5.694671 5.747941 + 949 1 1 0.236369 13.011987 -4.784239 5.743077 + 950 1 1 0.236369 13.311049 -3.855275 5.746744 + 951 1 1 0.236369 13.550176 -2.910878 5.749473 + 952 1 1 0.236369 13.726943 -1.948393 5.743558 + 953 1 1 0.236369 13.832616 -0.975879 5.748386 + 954 1 1 0.236369 14.209118 0.001496 4.829468 + 955 1 1 0.236369 14.177135 0.981974 4.822835 + 956 1 1 0.236369 14.070273 1.964773 4.823166 + 957 1 1 0.236369 13.909856 2.921342 4.825742 + 958 1 1 0.236369 13.671074 3.882797 4.828465 + 959 1 1 0.236369 13.372683 4.807060 4.828169 + 960 1 1 0.236369 13.002777 5.727189 4.828392 + 961 1 1 0.236369 12.585067 6.603882 4.821686 + 962 1 1 0.236369 12.099089 7.458128 4.822878 + 963 1 1 0.236369 11.549812 8.277956 4.829231 + 964 1 1 0.236369 10.955832 9.055345 4.830011 + 965 1 1 0.236369 10.303628 9.782209 4.829061 + 966 1 1 0.236369 9.606536 10.474257 4.831037 + 967 1 1 0.236369 8.860008 11.114509 4.830789 + 968 1 1 0.236369 8.072915 11.699380 4.823823 + 969 1 1 0.236369 7.244866 12.219523 4.826690 + 970 1 1 0.236369 6.385389 12.690826 4.829469 + 971 1 1 0.236369 5.492401 13.106627 4.826816 + 972 1 1 0.236369 4.584620 13.447357 4.827766 + 973 1 1 0.236369 3.643304 13.731196 4.827174 + 974 1 1 0.236369 2.690146 13.953563 4.828902 + 975 1 1 0.236369 1.713732 14.108888 4.822226 + 976 1 1 0.236369 0.744427 14.194882 4.826520 + 977 1 1 0.236369 -0.237223 14.201880 4.823891 + 978 1 1 0.236369 -1.218612 14.156508 4.824966 + 979 1 1 0.236369 -2.193368 14.041506 4.827108 + 980 1 1 0.236369 -3.158101 13.856921 4.829029 + 981 1 1 0.236369 -4.101004 13.605228 4.825715 + 982 1 1 0.236369 -5.034504 13.289715 4.826668 + 983 1 1 0.236369 -5.940414 12.909249 4.822882 + 984 1 1 0.236369 -6.809336 12.462340 4.823740 + 985 1 1 0.236369 -7.653764 11.966251 4.824520 + 986 1 1 0.236369 -8.460285 11.405844 4.826092 + 987 1 1 0.236369 -9.227627 10.801115 4.823995 + 988 1 1 0.236369 -9.952463 10.139300 4.824225 + 989 1 1 0.236369 -10.627903 9.420657 4.830508 + 990 1 1 0.236369 -11.248142 8.671856 4.827453 + 991 1 1 0.236369 -11.823980 7.869671 4.830979 + 992 1 1 0.236369 -12.333498 7.034907 4.827773 + 993 1 1 0.236369 -12.789428 6.165578 4.824099 + 994 1 1 0.236369 -13.183486 5.273957 4.822617 + 995 1 1 0.236369 -13.518777 4.350015 4.827056 + 996 1 1 0.236369 -13.784854 3.403707 4.826018 + 997 1 1 0.236369 -13.983358 2.446754 4.828507 + 998 1 1 0.236369 -14.123401 1.477904 4.829186 + 999 1 1 0.236369 -14.194888 0.492007 4.825586 + 1000 1 1 0.236369 -14.186821 -0.487820 4.827266 + 1001 1 1 0.236369 -14.121529 -1.462051 4.823648 + 1002 1 1 0.236369 -13.989316 -2.431571 4.831027 + 1003 1 1 0.236369 -13.781241 -3.390694 4.826720 + 1004 1 1 0.236369 -13.521592 -4.338619 4.824354 + 1005 1 1 0.236369 -13.185484 -5.264123 4.823883 + 1006 1 1 0.236369 -12.791269 -6.162061 4.831121 + 1007 1 1 0.236369 -12.337770 -7.027476 4.828486 + 1008 1 1 0.236369 -11.825732 -7.857503 4.828671 + 1009 1 1 0.236369 -11.256052 -8.660873 4.828161 + 1010 1 1 0.236369 -10.627600 -9.411052 4.829382 + 1011 1 1 0.236369 -9.954812 -10.123473 4.827397 + 1012 1 1 0.236369 -9.226790 -10.792543 4.826624 + 1013 1 1 0.236369 -8.463734 -11.396298 4.830379 + 1014 1 1 0.236369 -7.652060 -11.951935 4.825521 + 1015 1 1 0.236369 -6.809667 -12.456242 4.824018 + 1016 1 1 0.236369 -5.935345 -12.893447 4.824408 + 1017 1 1 0.236369 -5.035022 -13.279612 4.830640 + 1018 1 1 0.236369 -4.098949 -13.589177 4.828619 + 1019 1 1 0.236369 -3.158023 -13.838572 4.830123 + 1020 1 1 0.236369 -2.188522 -14.024565 4.825379 + 1021 1 1 0.236369 -1.222148 -14.148488 4.827922 + 1022 1 1 0.236369 -0.241434 -14.199706 4.821908 + 1023 1 1 0.236369 0.736091 -14.179688 4.830792 + 1024 1 1 0.236369 1.718498 -14.096416 4.826289 + 1025 1 1 0.236369 2.682626 -13.943881 4.826791 + 1026 1 1 0.236369 3.637217 -13.720544 4.829255 + 1027 1 1 0.236369 4.582615 -13.440818 4.824954 + 1028 1 1 0.236369 5.495670 -13.089713 4.827852 + 1029 1 1 0.236369 6.389442 -12.684133 4.824861 + 1030 1 1 0.236369 7.246897 -12.214064 4.824703 + 1031 1 1 0.236369 8.075038 -11.681897 4.828053 + 1032 1 1 0.236369 8.856236 -11.097656 4.825929 + 1033 1 1 0.236369 9.610177 -10.463220 4.822621 + 1034 1 1 0.236369 10.308375 -9.779789 4.823953 + 1035 1 1 0.236369 10.958040 -9.045503 4.831310 + 1036 1 1 0.236369 11.556741 -8.261353 4.828581 + 1037 1 1 0.236369 12.095436 -7.446322 4.828186 + 1038 1 1 0.236369 12.583148 -6.600582 4.824853 + 1039 1 1 0.236369 13.008166 -5.711907 4.821790 + 1040 1 1 0.236369 13.371186 -4.799605 4.827297 + 1041 1 1 0.236369 13.668416 -3.872118 4.821955 + 1042 1 1 0.236369 13.902808 -2.919017 4.824239 + 1043 1 1 0.236369 14.073253 -1.947114 4.823499 + 1044 1 1 0.236369 14.172385 -0.978560 4.826085 + 1045 1 1 0.236369 14.496932 0.008819 3.889972 + 1046 1 1 0.236369 14.465694 0.987377 3.888565 + 1047 1 1 0.236369 14.357119 1.951947 3.885433 + 1048 1 1 0.236369 14.197656 2.920363 3.885206 + 1049 1 1 0.236369 13.963893 3.869734 3.883068 + 1050 1 1 0.236369 13.678057 4.807274 3.884005 + 1051 1 1 0.236369 13.324568 5.714794 3.889498 + 1052 1 1 0.236369 12.899234 6.600005 3.883180 + 1053 1 1 0.236369 12.432994 7.464668 3.891464 + 1054 1 1 0.236369 11.892131 8.286757 3.886582 + 1055 1 1 0.236369 11.312876 9.064589 3.883083 + 1056 1 1 0.236369 10.676377 9.810018 3.888007 + 1057 1 1 0.236369 9.987705 10.502121 3.890603 + 1058 1 1 0.236369 9.259494 11.153469 3.885759 + 1059 1 1 0.236369 8.485699 11.750854 3.890085 + 1060 1 1 0.236369 7.670359 12.300605 3.889369 + 1061 1 1 0.236369 6.817900 12.786762 3.888195 + 1062 1 1 0.236369 5.940019 13.226187 3.886056 + 1063 1 1 0.236369 5.033888 13.591256 3.886224 + 1064 1 1 0.236369 4.103751 13.905255 3.886569 + 1065 1 1 0.236369 3.156946 14.148257 3.886516 + 1066 1 1 0.236369 2.200184 14.327615 3.884475 + 1067 1 1 0.236369 1.231550 14.442653 3.887253 + 1068 1 1 0.236369 0.248254 14.493875 3.882684 + 1069 1 1 0.236369 -0.729744 14.470341 3.887934 + 1070 1 1 0.236369 -1.699218 14.395562 3.882777 + 1071 1 1 0.236369 -2.667019 14.248803 3.891008 + 1072 1 1 0.236369 -3.624910 14.026443 3.890886 + 1073 1 1 0.236369 -4.560424 13.757434 3.885668 + 1074 1 1 0.236369 -5.480416 13.416953 3.892026 + 1075 1 1 0.236369 -6.377454 13.018160 3.891833 + 1076 1 1 0.236369 -7.237820 12.550021 3.892172 + 1077 1 1 0.236369 -8.072570 12.039243 3.883863 + 1078 1 1 0.236369 -8.865780 11.463881 3.882315 + 1079 1 1 0.236369 -9.615190 10.833649 3.884767 + 1080 1 1 0.236369 -10.326068 10.160986 3.885749 + 1081 1 1 0.236369 -10.989445 9.445301 3.884619 + 1082 1 1 0.236369 -11.599588 8.682014 3.889845 + 1083 1 1 0.236369 -12.157209 7.871721 3.884545 + 1084 1 1 0.236369 -12.662474 7.036183 3.886770 + 1085 1 1 0.236369 -13.108584 6.162400 3.884880 + 1086 1 1 0.236369 -13.494222 5.270053 3.885744 + 1087 1 1 0.236369 -13.819298 4.340642 3.891315 + 1088 1 1 0.236369 -14.084871 3.402836 3.882413 + 1089 1 1 0.236369 -14.275512 2.438193 3.883608 + 1090 1 1 0.236369 -14.404588 1.474597 3.886166 + 1091 1 1 0.236369 -14.477076 0.491232 3.890692 + 1092 1 1 0.236369 -14.470909 -0.481758 3.884418 + 1093 1 1 0.236369 -14.411085 -1.465500 3.891638 + 1094 1 1 0.236369 -14.273842 -2.429172 3.891984 + 1095 1 1 0.236369 -14.081150 -3.388592 3.886038 + 1096 1 1 0.236369 -13.820282 -4.333674 3.892134 + 1097 1 1 0.236369 -13.497881 -5.258701 3.883507 + 1098 1 1 0.236369 -13.112846 -6.152288 3.889895 + 1099 1 1 0.236369 -12.665221 -7.030031 3.888079 + 1100 1 1 0.236369 -12.157454 -7.865787 3.888497 + 1101 1 1 0.236369 -11.597786 -8.673831 3.887185 + 1102 1 1 0.236369 -10.986623 -9.435796 3.884490 + 1103 1 1 0.236369 -10.331248 -10.153452 3.883727 + 1104 1 1 0.236369 -9.613560 -10.824213 3.888637 + 1105 1 1 0.236369 -8.859511 -11.456050 3.890310 + 1106 1 1 0.236369 -8.067302 -12.022726 3.888982 + 1107 1 1 0.236369 -7.244017 -12.540834 3.887002 + 1108 1 1 0.236369 -6.377039 -13.007844 3.891730 + 1109 1 1 0.236369 -5.481041 -13.404391 3.888200 + 1110 1 1 0.236369 -4.563012 -13.739473 3.884553 + 1111 1 1 0.236369 -3.629434 -14.025236 3.889124 + 1112 1 1 0.236369 -2.673784 -14.232102 3.885492 + 1113 1 1 0.236369 -1.702331 -14.381351 3.889775 + 1114 1 1 0.236369 -0.729075 -14.464349 3.892267 + 1115 1 1 0.236369 0.250947 -14.481835 3.884983 + 1116 1 1 0.236369 1.224518 -14.431572 3.891604 + 1117 1 1 0.236369 2.195791 -14.317541 3.889250 + 1118 1 1 0.236369 3.164173 -14.140253 3.883238 + 1119 1 1 0.236369 4.111002 -13.892796 3.884744 + 1120 1 1 0.236369 5.041411 -13.581372 3.891632 + 1121 1 1 0.236369 5.938919 -13.209941 3.887084 + 1122 1 1 0.236369 6.818344 -12.775953 3.891111 + 1123 1 1 0.236369 7.665091 -12.286133 3.890079 + 1124 1 1 0.236369 8.481607 -11.749522 3.882469 + 1125 1 1 0.236369 9.252573 -11.144773 3.889993 + 1126 1 1 0.236369 9.991323 -10.495413 3.889144 + 1127 1 1 0.236369 10.669531 -9.798838 3.890962 + 1128 1 1 0.236369 11.306480 -9.057418 3.888091 + 1129 1 1 0.236369 11.897522 -8.272285 3.888547 + 1130 1 1 0.236369 12.431325 -7.448625 3.883397 + 1131 1 1 0.236369 12.901684 -6.590016 3.884423 + 1132 1 1 0.236369 13.316466 -5.712887 3.882649 + 1133 1 1 0.236369 13.673426 -4.793894 3.886731 + 1134 1 1 0.236369 13.965124 -3.862148 3.885551 + 1135 1 1 0.236369 14.197401 -2.907470 3.885159 + 1136 1 1 0.236369 14.365883 -1.950808 3.887250 + 1137 1 1 0.236369 14.462122 -0.975208 3.884103 + 1138 1 1 0.236369 14.712795 0.000516 2.935693 + 1139 1 1 0.236369 14.682835 0.987680 2.935757 + 1140 1 1 0.236369 14.581059 1.968572 2.932269 + 1141 1 1 0.236369 14.421993 2.933210 2.926363 + 1142 1 1 0.236369 14.193375 3.889038 2.935385 + 1143 1 1 0.236369 13.907739 4.829142 2.933184 + 1144 1 1 0.236369 13.552514 5.747853 2.927093 + 1145 1 1 0.236369 13.135397 6.642535 2.936319 + 1146 1 1 0.236369 12.666983 7.502466 2.929499 + 1147 1 1 0.236369 12.130378 8.329914 2.934447 + 1148 1 1 0.236369 11.549695 9.126678 2.930969 + 1149 1 1 0.236369 10.920296 9.878089 2.932226 + 1150 1 1 0.236369 10.236692 10.581458 2.931131 + 1151 1 1 0.236369 9.505470 11.236003 2.931879 + 1152 1 1 0.236369 8.732913 11.850196 2.928108 + 1153 1 1 0.236369 7.919582 12.404275 2.932227 + 1154 1 1 0.236369 7.079573 12.911406 2.927903 + 1155 1 1 0.236369 6.193947 13.347790 2.930809 + 1156 1 1 0.236369 5.294834 13.735809 2.931731 + 1157 1 1 0.236369 4.365206 14.056609 2.930974 + 1158 1 1 0.236369 3.418818 14.312943 2.934696 + 1159 1 1 0.236369 2.450984 14.513742 2.936317 + 1160 1 1 0.236369 1.480084 14.638398 2.936077 + 1161 1 1 0.236369 0.499946 14.705408 2.933814 + 1162 1 1 0.236369 -0.488369 14.704020 2.928354 + 1163 1 1 0.236369 -1.467063 14.646744 2.926718 + 1164 1 1 0.236369 -2.437209 14.515246 2.928241 + 1165 1 1 0.236369 -3.404994 14.312192 2.932130 + 1166 1 1 0.236369 -4.355437 14.055361 2.932638 + 1167 1 1 0.236369 -5.281333 13.729949 2.930003 + 1168 1 1 0.236369 -6.189093 13.350642 2.932720 + 1169 1 1 0.236369 -7.062648 12.910988 2.935268 + 1170 1 1 0.236369 -7.912010 12.403009 2.928890 + 1171 1 1 0.236369 -8.721806 11.853912 2.929218 + 1172 1 1 0.236369 -9.491387 11.238181 2.927609 + 1173 1 1 0.236369 -10.217790 10.577261 2.931641 + 1174 1 1 0.236369 -10.907744 9.875095 2.934562 + 1175 1 1 0.236369 -11.537417 9.127357 2.929353 + 1176 1 1 0.236369 -12.121611 8.332316 2.934232 + 1177 1 1 0.236369 -12.648496 7.498003 2.930725 + 1178 1 1 0.236369 -13.130221 6.638896 2.931860 + 1179 1 1 0.236369 -13.540829 5.744983 2.936216 + 1180 1 1 0.236369 -13.891137 4.828142 2.933253 + 1181 1 1 0.236369 -14.186243 3.887307 2.936056 + 1182 1 1 0.236369 -14.414676 2.939398 2.927314 + 1183 1 1 0.236369 -14.573402 1.968821 2.935336 + 1184 1 1 0.236369 -14.672680 0.986369 2.926939 + 1185 1 1 0.236369 -14.705873 0.008321 2.927588 + 1186 1 1 0.236369 -14.672322 -0.975100 2.932662 + 1187 1 1 0.236369 -14.580038 -1.954670 2.930056 + 1188 1 1 0.236369 -14.413492 -2.926439 2.929551 + 1189 1 1 0.236369 -14.184544 -3.883192 2.934312 + 1190 1 1 0.236369 -13.895354 -4.824941 2.929372 + 1191 1 1 0.236369 -13.537247 -5.739904 2.932429 + 1192 1 1 0.236369 -13.121978 -6.629675 2.930975 + 1193 1 1 0.236369 -12.655223 -7.492762 2.929281 + 1194 1 1 0.236369 -12.121692 -8.319634 2.934679 + 1195 1 1 0.236369 -11.544418 -9.112488 2.932060 + 1196 1 1 0.236369 -10.902655 -9.860293 2.927060 + 1197 1 1 0.236369 -10.226131 -10.574203 2.929018 + 1198 1 1 0.236369 -9.492452 -11.230045 2.928064 + 1199 1 1 0.236369 -8.723068 -11.838115 2.931958 + 1200 1 1 0.236369 -7.908081 -12.398573 2.928376 + 1201 1 1 0.236369 -7.065175 -12.895380 2.931279 + 1202 1 1 0.236369 -6.187803 -13.344402 2.933649 + 1203 1 1 0.236369 -5.278757 -13.722990 2.935905 + 1204 1 1 0.236369 -4.355210 -14.042834 2.933979 + 1205 1 1 0.236369 -3.405992 -14.306013 2.927156 + 1206 1 1 0.236369 -2.437365 -14.502458 2.935737 + 1207 1 1 0.236369 -1.472163 -14.636403 2.936100 + 1208 1 1 0.236369 -0.481864 -14.703281 2.932426 + 1209 1 1 0.236369 0.493486 -14.695997 2.935930 + 1210 1 1 0.236369 1.479257 -14.629933 2.929661 + 1211 1 1 0.236369 2.452865 -14.503912 2.935367 + 1212 1 1 0.236369 3.417238 -14.309859 2.926358 + 1213 1 1 0.236369 4.362351 -14.047506 2.931188 + 1214 1 1 0.236369 5.293731 -13.720458 2.927830 + 1215 1 1 0.236369 6.200811 -13.336503 2.929505 + 1216 1 1 0.236369 7.070405 -12.894841 2.928069 + 1217 1 1 0.236369 7.916988 -12.390844 2.932284 + 1218 1 1 0.236369 8.736477 -11.834582 2.932931 + 1219 1 1 0.236369 9.504848 -11.233556 2.929844 + 1220 1 1 0.236369 10.229830 -10.568692 2.926892 + 1221 1 1 0.236369 10.915057 -9.863629 2.926827 + 1222 1 1 0.236369 11.547015 -9.116958 2.926913 + 1223 1 1 0.236369 12.131687 -8.317111 2.927070 + 1224 1 1 0.236369 12.660617 -7.492395 2.926512 + 1225 1 1 0.236369 13.133857 -6.627448 2.936092 + 1226 1 1 0.236369 13.545920 -5.742717 2.933703 + 1227 1 1 0.236369 13.901243 -4.823205 2.933879 + 1228 1 1 0.236369 14.190274 -3.880274 2.926688 + 1229 1 1 0.236369 14.425822 -2.929044 2.927531 + 1230 1 1 0.236369 14.581456 -1.954503 2.928968 + 1231 1 1 0.236369 14.688226 -0.978789 2.935288 + 1232 1 1 0.236369 14.875663 0.007657 1.967613 + 1233 1 1 0.236369 14.839632 0.989407 1.967834 + 1234 1 1 0.236369 14.745179 1.965272 1.961361 + 1235 1 1 0.236369 14.587250 2.934460 1.960816 + 1236 1 1 0.236369 14.362218 3.892046 1.959765 + 1237 1 1 0.236369 14.071334 4.838014 1.965324 + 1238 1 1 0.236369 13.722854 5.752452 1.965073 + 1239 1 1 0.236369 13.315058 6.646245 1.959782 + 1240 1 1 0.236369 12.838616 7.511250 1.962232 + 1241 1 1 0.236369 12.316913 8.348224 1.958349 + 1242 1 1 0.236369 11.736301 9.136562 1.964448 + 1243 1 1 0.236369 11.108440 9.898852 1.965703 + 1244 1 1 0.236369 10.435766 10.602637 1.966522 + 1245 1 1 0.236369 9.712260 11.271905 1.965746 + 1246 1 1 0.236369 8.947860 11.892923 1.962228 + 1247 1 1 0.236369 8.139858 12.453494 1.961371 + 1248 1 1 0.236369 7.294125 12.966617 1.958447 + 1249 1 1 0.236369 6.430137 13.418649 1.966087 + 1250 1 1 0.236369 5.528328 13.809254 1.958953 + 1251 1 1 0.236369 4.598459 14.149792 1.957954 + 1252 1 1 0.236369 3.656217 14.422619 1.960643 + 1253 1 1 0.236369 2.699844 14.632860 1.967321 + 1254 1 1 0.236369 1.724607 14.775598 1.964635 + 1255 1 1 0.236369 0.745783 14.858313 1.961749 + 1256 1 1 0.236369 -0.241555 14.876658 1.966462 + 1257 1 1 0.236369 -1.223387 14.829757 1.964641 + 1258 1 1 0.236369 -2.199321 14.707860 1.963974 + 1259 1 1 0.236369 -3.169431 14.530412 1.962287 + 1260 1 1 0.236369 -4.117955 14.294512 1.967506 + 1261 1 1 0.236369 -5.055690 13.991763 1.966122 + 1262 1 1 0.236369 -5.967415 13.628961 1.957998 + 1263 1 1 0.236369 -6.857837 13.195741 1.959309 + 1264 1 1 0.236369 -7.716559 12.715842 1.962721 + 1265 1 1 0.236369 -8.536472 12.181083 1.963699 + 1266 1 1 0.236369 -9.323537 11.586966 1.960823 + 1267 1 1 0.236369 -10.064429 10.950080 1.962282 + 1268 1 1 0.236369 -10.765612 10.254758 1.961876 + 1269 1 1 0.236369 -11.420725 9.518738 1.959266 + 1270 1 1 0.236369 -12.030101 8.748077 1.967421 + 1271 1 1 0.236369 -12.582636 7.929099 1.961493 + 1272 1 1 0.236369 -13.073648 7.086819 1.966263 + 1273 1 1 0.236369 -13.515440 6.205755 1.958306 + 1274 1 1 0.236369 -13.889143 5.295444 1.962131 + 1275 1 1 0.236369 -14.208042 4.361121 1.958649 + 1276 1 1 0.236369 -14.472129 3.413412 1.961031 + 1277 1 1 0.236369 -14.660834 2.450535 1.967353 + 1278 1 1 0.236369 -14.789586 1.481697 1.966438 + 1279 1 1 0.236369 -14.857567 0.497720 1.959628 + 1280 1 1 0.236369 -14.854702 -0.488496 1.963252 + 1281 1 1 0.236369 -14.789110 -1.470130 1.960842 + 1282 1 1 0.236369 -14.663351 -2.443444 1.966922 + 1283 1 1 0.236369 -14.467711 -3.402880 1.958707 + 1284 1 1 0.236369 -14.212084 -4.351868 1.965768 + 1285 1 1 0.236369 -13.898278 -5.286197 1.959637 + 1286 1 1 0.236369 -13.513983 -6.191968 1.965093 + 1287 1 1 0.236369 -13.072783 -7.070941 1.960213 + 1288 1 1 0.236369 -12.577640 -7.926834 1.959964 + 1289 1 1 0.236369 -12.027713 -8.735601 1.960054 + 1290 1 1 0.236369 -11.418039 -9.516937 1.967660 + 1291 1 1 0.236369 -10.765119 -10.247613 1.961711 + 1292 1 1 0.236369 -10.063819 -10.936768 1.964246 + 1293 1 1 0.236369 -9.323436 -11.582982 1.958359 + 1294 1 1 0.236369 -8.535296 -12.173670 1.960214 + 1295 1 1 0.236369 -7.709220 -12.702958 1.966641 + 1296 1 1 0.236369 -6.851580 -13.189146 1.962494 + 1297 1 1 0.236369 -5.967198 -13.615413 1.957924 + 1298 1 1 0.236369 -5.058661 -13.980483 1.962542 + 1299 1 1 0.236369 -4.118907 -14.286501 1.966134 + 1300 1 1 0.236369 -3.171402 -14.527933 1.966612 + 1301 1 1 0.236369 -2.200861 -14.703801 1.960904 + 1302 1 1 0.236369 -1.221424 -14.817519 1.960253 + 1303 1 1 0.236369 -0.236550 -14.861800 1.966209 + 1304 1 1 0.236369 0.745503 -14.848513 1.962270 + 1305 1 1 0.236369 1.722295 -14.767523 1.962964 + 1306 1 1 0.236369 2.697564 -14.625053 1.959748 + 1307 1 1 0.236369 3.654950 -14.407740 1.959408 + 1308 1 1 0.236369 4.605318 -14.137056 1.966961 + 1309 1 1 0.236369 5.530204 -13.800800 1.967820 + 1310 1 1 0.236369 6.429551 -13.407554 1.961794 + 1311 1 1 0.236369 7.297307 -12.950589 1.966161 + 1312 1 1 0.236369 8.138582 -12.440268 1.967433 + 1313 1 1 0.236369 8.941549 -11.882761 1.966831 + 1314 1 1 0.236369 9.712886 -11.262242 1.966303 + 1315 1 1 0.236369 10.437392 -10.595156 1.964726 + 1316 1 1 0.236369 11.115622 -9.885046 1.959611 + 1317 1 1 0.236369 11.741422 -9.125872 1.960268 + 1318 1 1 0.236369 12.319865 -8.336862 1.962236 + 1319 1 1 0.236369 12.839557 -7.505467 1.958144 + 1320 1 1 0.236369 13.315119 -6.641792 1.960579 + 1321 1 1 0.236369 13.720496 -5.746360 1.967694 + 1322 1 1 0.236369 14.067941 -4.823483 1.961020 + 1323 1 1 0.236369 14.363268 -3.883538 1.963610 + 1324 1 1 0.236369 14.587516 -2.927608 1.964010 + 1325 1 1 0.236369 14.750580 -1.958351 1.966908 + 1326 1 1 0.236369 14.842007 -0.982842 1.961853 + 1327 1 1 0.236369 14.974616 0.008152 0.987975 + 1328 1 1 0.236369 14.942479 0.985331 0.983092 + 1329 1 1 0.236369 14.841060 1.958184 0.981675 + 1330 1 1 0.236369 14.684353 2.922530 0.987271 + 1331 1 1 0.236369 14.460618 3.882007 0.987927 + 1332 1 1 0.236369 14.180707 4.819508 0.984015 + 1333 1 1 0.236369 13.831355 5.736483 0.986763 + 1334 1 1 0.236369 13.433249 6.624798 0.984209 + 1335 1 1 0.236369 12.970833 7.493649 0.989142 + 1336 1 1 0.236369 12.449241 8.324123 0.984702 + 1337 1 1 0.236369 11.879800 9.112656 0.988035 + 1338 1 1 0.236369 11.260399 9.871388 0.987381 + 1339 1 1 0.236369 10.592236 10.592068 0.990693 + 1340 1 1 0.236369 9.875108 11.257509 0.983055 + 1341 1 1 0.236369 9.117618 11.879484 0.987029 + 1342 1 1 0.236369 8.318971 12.454856 0.981884 + 1343 1 1 0.236369 7.488506 12.972218 0.986491 + 1344 1 1 0.236369 6.627264 13.431940 0.989508 + 1345 1 1 0.236369 5.736805 13.834267 0.981454 + 1346 1 1 0.236369 4.818477 14.182699 0.984341 + 1347 1 1 0.236369 3.874160 14.462820 0.988140 + 1348 1 1 0.236369 2.926837 14.681940 0.989650 + 1349 1 1 0.236369 1.958086 14.843092 0.986056 + 1350 1 1 0.236369 0.983325 14.938801 0.990995 + 1351 1 1 0.236369 0.001170 14.973467 0.985333 + 1352 1 1 0.236369 -0.970800 14.936511 0.983720 + 1353 1 1 0.236369 -1.950452 14.840521 0.985776 + 1354 1 1 0.236369 -2.917627 14.681948 0.982655 + 1355 1 1 0.236369 -3.870546 14.467340 0.982636 + 1356 1 1 0.236369 -4.807512 14.181651 0.983730 + 1357 1 1 0.236369 -5.722496 13.835626 0.988618 + 1358 1 1 0.236369 -6.614507 13.433989 0.987139 + 1359 1 1 0.236369 -7.479984 12.972552 0.990716 + 1360 1 1 0.236369 -8.311729 12.455215 0.988780 + 1361 1 1 0.236369 -9.106717 11.876322 0.986776 + 1362 1 1 0.236369 -9.862436 11.263036 0.985549 + 1363 1 1 0.236369 -10.574383 10.589197 0.983918 + 1364 1 1 0.236369 -11.246227 9.869752 0.988571 + 1365 1 1 0.236369 -11.870820 9.114989 0.981991 + 1366 1 1 0.236369 -12.437022 8.324662 0.982115 + 1367 1 1 0.236369 -12.961224 7.492290 0.988396 + 1368 1 1 0.236369 -13.423682 6.620149 0.984593 + 1369 1 1 0.236369 -13.827679 5.734363 0.986853 + 1370 1 1 0.236369 -14.171901 4.819300 0.984035 + 1371 1 1 0.236369 -14.454623 3.876425 0.988184 + 1372 1 1 0.236369 -14.677263 2.920731 0.984652 + 1373 1 1 0.236369 -14.839715 1.956332 0.988232 + 1374 1 1 0.236369 -14.930437 0.979974 0.991000 + 1375 1 1 0.236369 -14.966930 0.004837 0.981884 + 1376 1 1 0.236369 -14.934371 -0.974758 0.985729 + 1377 1 1 0.236369 -14.833520 -1.949888 0.981985 + 1378 1 1 0.236369 -14.671687 -2.911222 0.988299 + 1379 1 1 0.236369 -14.448123 -3.869768 0.990167 + 1380 1 1 0.236369 -14.167832 -4.808430 0.981911 + 1381 1 1 0.236369 -13.818553 -5.727479 0.986246 + 1382 1 1 0.236369 -13.418752 -6.617934 0.986573 + 1383 1 1 0.236369 -12.957413 -7.481550 0.987898 + 1384 1 1 0.236369 -12.442034 -8.315418 0.984043 + 1385 1 1 0.236369 -11.870521 -9.104847 0.987066 + 1386 1 1 0.236369 -11.248533 -9.868935 0.983032 + 1387 1 1 0.236369 -10.583182 -10.577783 0.987615 + 1388 1 1 0.236369 -9.860134 -11.249370 0.988031 + 1389 1 1 0.236369 -9.111224 -11.872331 0.985644 + 1390 1 1 0.236369 -8.311349 -12.438816 0.982624 + 1391 1 1 0.236369 -7.475676 -12.959365 0.985265 + 1392 1 1 0.236369 -6.616180 -13.423250 0.987007 + 1393 1 1 0.236369 -5.721826 -13.823166 0.984270 + 1394 1 1 0.236369 -4.803082 -14.171891 0.989354 + 1395 1 1 0.236369 -3.865111 -14.449031 0.982274 + 1396 1 1 0.236369 -2.910778 -14.673616 0.983559 + 1397 1 1 0.236369 -1.951793 -14.831354 0.990423 + 1398 1 1 0.236369 -0.976361 -14.928210 0.987599 + 1399 1 1 0.236369 0.008979 -14.959814 0.988576 + 1400 1 1 0.236369 0.984880 -14.929507 0.989156 + 1401 1 1 0.236369 1.958739 -14.832727 0.981531 + 1402 1 1 0.236369 2.926217 -14.673394 0.985194 + 1403 1 1 0.236369 3.882168 -14.454656 0.988302 + 1404 1 1 0.236369 4.816587 -14.168224 0.982437 + 1405 1 1 0.236369 5.729982 -13.819790 0.987373 + 1406 1 1 0.236369 6.624665 -13.423742 0.983515 + 1407 1 1 0.236369 7.488221 -12.957564 0.989447 + 1408 1 1 0.236369 8.325371 -12.441013 0.989414 + 1409 1 1 0.236369 9.118071 -11.865778 0.985578 + 1410 1 1 0.236369 9.875965 -11.247149 0.984995 + 1411 1 1 0.236369 10.591094 -10.574062 0.990663 + 1412 1 1 0.236369 11.256920 -9.863160 0.981129 + 1413 1 1 0.236369 11.879991 -9.103464 0.985031 + 1414 1 1 0.236369 12.450908 -8.311023 0.985925 + 1415 1 1 0.236369 12.964133 -7.478490 0.987228 + 1416 1 1 0.236369 13.429908 -6.618335 0.981747 + 1417 1 1 0.236369 13.835470 -5.721617 0.982474 + 1418 1 1 0.236369 14.177805 -4.801639 0.987589 + 1419 1 1 0.236369 14.466228 -3.868633 0.983230 + 1420 1 1 0.236369 14.687594 -2.915293 0.982238 + 1421 1 1 0.236369 14.843432 -1.945764 0.981478 + 1422 1 1 0.236369 14.940379 -0.978019 0.982703 + 1423 1 1 0.236369 15.003864 0.008808 0.005111 + 1424 1 1 0.236369 14.975639 0.981086 0.008673 + 1425 1 1 0.236369 14.879016 1.963008 0.007663 + 1426 1 1 0.236369 14.716082 2.933139 0.001350 + 1427 1 1 0.236369 14.495825 3.887943 0.000649 + 1428 1 1 0.236369 14.213404 4.826377 0.006724 + 1429 1 1 0.236369 13.866035 5.743457 0.004822 + 1430 1 1 0.236369 13.460147 6.640346 0.004954 + 1431 1 1 0.236369 12.991474 7.509132 0.003135 + 1432 1 1 0.236369 12.475943 8.340379 0.003235 + 1433 1 1 0.236369 11.906209 9.140889 0.009091 + 1434 1 1 0.236369 11.282191 9.891178 0.004503 + 1435 1 1 0.236369 10.607105 10.611712 0.007486 + 1436 1 1 0.236369 9.892474 11.278698 0.001853 + 1437 1 1 0.236369 9.139763 11.905753 0.000849 + 1438 1 1 0.236369 8.333710 12.478932 0.002070 + 1439 1 1 0.236369 7.508637 12.991855 0.005589 + 1440 1 1 0.236369 6.635111 13.460867 0.006617 + 1441 1 1 0.236369 5.746942 13.862184 0.009392 + 1442 1 1 0.236369 4.826594 14.212935 0.000402 + 1443 1 1 0.236369 3.884466 14.491958 0.001637 + 1444 1 1 0.236369 2.932071 14.712390 0.004381 + 1445 1 1 0.236369 1.959115 14.873868 0.003257 + 1446 1 1 0.236369 0.987759 14.968712 0.000899 + 1447 1 1 0.236369 0.005996 15.009504 0.008103 + 1448 1 1 0.236369 -0.980487 14.968048 0.003996 + 1449 1 1 0.236369 -1.957329 14.872820 0.006553 + 1450 1 1 0.236369 -2.924830 14.711903 0.005668 + 1451 1 1 0.236369 -3.882089 14.491050 0.000031 + 1452 1 1 0.236369 -4.817240 14.204066 0.006514 + 1453 1 1 0.236369 -5.731929 13.864617 0.003171 + 1454 1 1 0.236369 -6.628156 13.458261 0.002659 + 1455 1 1 0.236369 -7.494799 12.992836 0.004604 + 1456 1 1 0.236369 -8.324915 12.473982 0.006232 + 1457 1 1 0.236369 -9.130444 11.901209 0.008019 + 1458 1 1 0.236369 -9.881107 11.281282 0.005612 + 1459 1 1 0.236369 -10.605522 10.606680 0.000248 + 1460 1 1 0.236369 -11.272427 9.896214 0.007935 + 1461 1 1 0.236369 -11.898869 9.136210 0.002731 + 1462 1 1 0.236369 -12.466450 8.336635 0.008229 + 1463 1 1 0.236369 -12.990335 7.507444 0.006886 + 1464 1 1 0.236369 -13.445424 6.642724 0.006039 + 1465 1 1 0.236369 -13.849706 5.742876 0.003870 + 1466 1 1 0.236369 -14.194784 4.826734 0.000655 + 1467 1 1 0.236369 -14.479018 3.886753 0.009986 + 1468 1 1 0.236369 -14.706728 2.929767 0.006610 + 1469 1 1 0.236369 -14.868959 1.966284 0.002292 + 1470 1 1 0.236369 -14.966876 0.990872 0.000923 + 1471 1 1 0.236369 -14.994922 0.006265 0.002410 + 1472 1 1 0.236369 -14.962028 -0.979234 0.009026 + 1473 1 1 0.236369 -14.864044 -1.956663 0.002173 + 1474 1 1 0.236369 -14.710950 -2.920555 0.004795 + 1475 1 1 0.236369 -14.482271 -3.879000 0.009092 + 1476 1 1 0.236369 -14.198782 -4.818910 0.001938 + 1477 1 1 0.236369 -13.856483 -5.734749 0.004480 + 1478 1 1 0.236369 -13.443706 -6.632525 0.006178 + 1479 1 1 0.236369 -12.984476 -7.493215 0.005942 + 1480 1 1 0.236369 -12.467638 -8.332997 0.006659 + 1481 1 1 0.236369 -11.890881 -9.131081 0.002677 + 1482 1 1 0.236369 -11.271038 -9.887322 0.004239 + 1483 1 1 0.236369 -10.602082 -10.605828 0.007993 + 1484 1 1 0.236369 -9.881790 -11.268591 0.009323 + 1485 1 1 0.236369 -9.126095 -11.891834 0.004697 + 1486 1 1 0.236369 -8.328015 -12.468087 0.003063 + 1487 1 1 0.236369 -7.493199 -12.988689 0.004394 + 1488 1 1 0.236369 -6.630658 -13.448787 0.003069 + 1489 1 1 0.236369 -5.737859 -13.854031 0.002750 + 1490 1 1 0.236369 -4.815803 -14.196664 0.001387 + 1491 1 1 0.236369 -3.873617 -14.484823 0.001665 + 1492 1 1 0.236369 -2.922287 -14.702261 0.004939 + 1493 1 1 0.236369 -1.956767 -14.862553 0.000866 + 1494 1 1 0.236369 -0.976608 -14.958370 0.009268 + 1495 1 1 0.236369 0.003002 -14.996540 0.001485 + 1496 1 1 0.236369 0.985061 -14.964981 0.001605 + 1497 1 1 0.236369 1.966227 -14.862806 0.007177 + 1498 1 1 0.236369 2.930391 -14.709679 0.006749 + 1499 1 1 0.236369 3.886187 -14.487579 0.003585 + 1500 1 1 0.236369 4.825196 -14.198747 0.000905 + 1501 1 1 0.236369 5.741654 -13.849138 0.000082 + 1502 1 1 0.236369 6.636932 -13.449066 0.003728 + 1503 1 1 0.236369 7.500868 -12.988223 0.007883 + 1504 1 1 0.236369 8.337847 -12.471257 0.004473 + 1505 1 1 0.236369 9.133994 -11.890970 0.000996 + 1506 1 1 0.236369 9.893163 -11.271568 0.008058 + 1507 1 1 0.236369 10.610850 -10.602827 0.006595 + 1508 1 1 0.236369 11.278789 -9.883538 0.004524 + 1509 1 1 0.236369 11.905251 -9.123500 0.005334 + 1510 1 1 0.236369 12.479108 -8.330219 0.005267 + 1511 1 1 0.236369 12.992817 -7.493073 0.006297 + 1512 1 1 0.236369 13.460942 -6.632292 0.006466 + 1513 1 1 0.236369 13.858934 -5.730664 0.001918 + 1514 1 1 0.236369 14.207891 -4.814474 0.008017 + 1515 1 1 0.236369 14.488921 -3.880617 0.001966 + 1516 1 1 0.236369 14.713986 -2.921927 0.004113 + 1517 1 1 0.236369 14.871686 -1.951563 0.002357 + 1518 1 1 0.236369 14.969776 -0.971747 0.002722 + 1519 1 1 0.236369 14.969309 0.005293 -0.980960 + 1520 1 1 0.236369 14.938517 0.985211 -0.971764 + 1521 1 1 0.236369 14.841580 1.960509 -0.975845 + 1522 1 1 0.236369 14.681667 2.929321 -0.976406 + 1523 1 1 0.236369 14.463854 3.875502 -0.975812 + 1524 1 1 0.236369 14.182551 4.815326 -0.977679 + 1525 1 1 0.236369 13.837915 5.731086 -0.977723 + 1526 1 1 0.236369 13.426499 6.627065 -0.971164 + 1527 1 1 0.236369 12.967394 7.492849 -0.976310 + 1528 1 1 0.236369 12.449101 8.320617 -0.973578 + 1529 1 1 0.236369 11.880058 9.119929 -0.974347 + 1530 1 1 0.236369 11.256100 9.872276 -0.973091 + 1531 1 1 0.236369 10.584576 10.589391 -0.978322 + 1532 1 1 0.236369 9.873375 11.257339 -0.978208 + 1533 1 1 0.236369 9.113609 11.883789 -0.973874 + 1534 1 1 0.236369 8.315972 12.452102 -0.979201 + 1535 1 1 0.236369 7.493489 12.970852 -0.972710 + 1536 1 1 0.236369 6.624432 13.425388 -0.979350 + 1537 1 1 0.236369 5.737577 13.831314 -0.971514 + 1538 1 1 0.236369 4.818893 14.181217 -0.973821 + 1539 1 1 0.236369 3.874047 14.460026 -0.979704 + 1540 1 1 0.236369 2.926890 14.680621 -0.972516 + 1541 1 1 0.236369 1.960760 14.844197 -0.971730 + 1542 1 1 0.236369 0.985398 14.945205 -0.975405 + 1543 1 1 0.236369 0.005523 14.970505 -0.977059 + 1544 1 1 0.236369 -0.976765 14.941534 -0.976631 + 1545 1 1 0.236369 -1.945977 14.843427 -0.974030 + 1546 1 1 0.236369 -2.917809 14.680549 -0.978447 + 1547 1 1 0.236369 -3.870265 14.462870 -0.980762 + 1548 1 1 0.236369 -4.802359 14.181810 -0.971567 + 1549 1 1 0.236369 -5.719397 13.831111 -0.971085 + 1550 1 1 0.236369 -6.616101 13.424746 -0.973252 + 1551 1 1 0.236369 -7.480762 12.965032 -0.971153 + 1552 1 1 0.236369 -8.309624 12.451948 -0.976171 + 1553 1 1 0.236369 -9.102768 11.878115 -0.979767 + 1554 1 1 0.236369 -9.859921 11.260046 -0.976403 + 1555 1 1 0.236369 -10.577976 10.584022 -0.973621 + 1556 1 1 0.236369 -11.250125 9.876192 -0.974313 + 1557 1 1 0.236369 -11.866290 9.115782 -0.972307 + 1558 1 1 0.236369 -12.440917 8.316046 -0.973464 + 1559 1 1 0.236369 -12.953524 7.488002 -0.974875 + 1560 1 1 0.236369 -13.423955 6.627289 -0.978299 + 1561 1 1 0.236369 -13.823197 5.737175 -0.977683 + 1562 1 1 0.236369 -14.166375 4.821109 -0.972690 + 1563 1 1 0.236369 -14.456073 3.883808 -0.977188 + 1564 1 1 0.236369 -14.676915 2.929052 -0.980243 + 1565 1 1 0.236369 -14.837954 1.962358 -0.972391 + 1566 1 1 0.236369 -14.932617 0.986956 -0.976693 + 1567 1 1 0.236369 -14.963845 0.005550 -0.979326 + 1568 1 1 0.236369 -14.930351 -0.974758 -0.981004 + 1569 1 1 0.236369 -14.839344 -1.952430 -0.974522 + 1570 1 1 0.236369 -14.674753 -2.913543 -0.977350 + 1571 1 1 0.236369 -14.455117 -3.865334 -0.977286 + 1572 1 1 0.236369 -14.171125 -4.808523 -0.976634 + 1573 1 1 0.236369 -13.826090 -5.719560 -0.975886 + 1574 1 1 0.236369 -13.422745 -6.619418 -0.978046 + 1575 1 1 0.236369 -12.953003 -7.480154 -0.976264 + 1576 1 1 0.236369 -12.435984 -8.313029 -0.980984 + 1577 1 1 0.236369 -11.866634 -9.110341 -0.979333 + 1578 1 1 0.236369 -11.246168 -9.862702 -0.978011 + 1579 1 1 0.236369 -10.582134 -10.580728 -0.973602 + 1580 1 1 0.236369 -9.865408 -11.243860 -0.975238 + 1581 1 1 0.236369 -9.109982 -11.869834 -0.974035 + 1582 1 1 0.236369 -8.315699 -12.437954 -0.973000 + 1583 1 1 0.236369 -7.480778 -12.962440 -0.972527 + 1584 1 1 0.236369 -6.613130 -13.418233 -0.979870 + 1585 1 1 0.236369 -5.721709 -13.822757 -0.974474 + 1586 1 1 0.236369 -4.805838 -14.165466 -0.973517 + 1587 1 1 0.236369 -3.869583 -14.451316 -0.974026 + 1588 1 1 0.236369 -2.917215 -14.671498 -0.974996 + 1589 1 1 0.236369 -1.948684 -14.830808 -0.980664 + 1590 1 1 0.236369 -0.971331 -14.934314 -0.979095 + 1591 1 1 0.236369 0.007624 -14.965958 -0.977740 + 1592 1 1 0.236369 0.984707 -14.927927 -0.974619 + 1593 1 1 0.236369 1.961178 -14.839224 -0.978873 + 1594 1 1 0.236369 2.926545 -14.676382 -0.980278 + 1595 1 1 0.236369 3.875206 -14.454866 -0.971241 + 1596 1 1 0.236369 4.816313 -14.166198 -0.978979 + 1597 1 1 0.236369 5.731434 -13.827479 -0.971214 + 1598 1 1 0.236369 6.621047 -13.416361 -0.974943 + 1599 1 1 0.236369 7.485420 -12.954740 -0.978567 + 1600 1 1 0.236369 8.317692 -12.440017 -0.975867 + 1601 1 1 0.236369 9.118593 -11.872287 -0.973919 + 1602 1 1 0.236369 9.873327 -11.252741 -0.978448 + 1603 1 1 0.236369 10.590836 -10.577634 -0.979900 + 1604 1 1 0.236369 11.256019 -9.868765 -0.975550 + 1605 1 1 0.236369 11.874918 -9.111250 -0.978858 + 1606 1 1 0.236369 12.450663 -8.314415 -0.977925 + 1607 1 1 0.236369 12.965362 -7.479436 -0.971316 + 1608 1 1 0.236369 13.433749 -6.613402 -0.977955 + 1609 1 1 0.236369 13.837586 -5.719400 -0.971584 + 1610 1 1 0.236369 14.177467 -4.806284 -0.976941 + 1611 1 1 0.236369 14.458114 -3.873486 -0.980944 + 1612 1 1 0.236369 14.686995 -2.916951 -0.977946 + 1613 1 1 0.236369 14.848203 -1.947285 -0.979495 + 1614 1 1 0.236369 14.945551 -0.971083 -0.971106 + 1615 1 1 0.236369 14.872242 0.002892 -1.953390 + 1616 1 1 0.236369 14.843661 0.987856 -1.952441 + 1617 1 1 0.236369 14.747580 1.969642 -1.955270 + 1618 1 1 0.236369 14.586757 2.937411 -1.949067 + 1619 1 1 0.236369 14.361466 3.894008 -1.956862 + 1620 1 1 0.236369 14.072385 4.832133 -1.949657 + 1621 1 1 0.236369 13.723261 5.752006 -1.953621 + 1622 1 1 0.236369 13.309860 6.649760 -1.948689 + 1623 1 1 0.236369 12.843884 7.510140 -1.952613 + 1624 1 1 0.236369 12.315038 8.343397 -1.949185 + 1625 1 1 0.236369 11.736416 9.138049 -1.954365 + 1626 1 1 0.236369 11.116282 9.896824 -1.953891 + 1627 1 1 0.236369 10.431412 10.608116 -1.951914 + 1628 1 1 0.236369 9.710992 11.275005 -1.948778 + 1629 1 1 0.236369 8.948704 11.890174 -1.956563 + 1630 1 1 0.236369 8.135892 12.454051 -1.957471 + 1631 1 1 0.236369 7.295348 12.965203 -1.953882 + 1632 1 1 0.236369 6.424326 13.414784 -1.951936 + 1633 1 1 0.236369 5.529653 13.813262 -1.948696 + 1634 1 1 0.236369 4.599506 14.153492 -1.954955 + 1635 1 1 0.236369 3.653512 14.424411 -1.952442 + 1636 1 1 0.236369 2.691516 14.633656 -1.950076 + 1637 1 1 0.236369 1.721421 14.779827 -1.954619 + 1638 1 1 0.236369 0.741141 14.860946 -1.956940 + 1639 1 1 0.236369 -0.244576 14.878073 -1.953476 + 1640 1 1 0.236369 -1.223743 14.828580 -1.957602 + 1641 1 1 0.236369 -2.204013 14.717096 -1.951139 + 1642 1 1 0.236369 -3.165976 14.530542 -1.956777 + 1643 1 1 0.236369 -4.125336 14.291975 -1.955896 + 1644 1 1 0.236369 -5.054996 13.989043 -1.952591 + 1645 1 1 0.236369 -5.965986 13.621662 -1.951619 + 1646 1 1 0.236369 -6.858561 13.194857 -1.954157 + 1647 1 1 0.236369 -7.713466 12.721941 -1.951828 + 1648 1 1 0.236369 -8.535534 12.181585 -1.949429 + 1649 1 1 0.236369 -9.326548 11.584688 -1.950873 + 1650 1 1 0.236369 -10.067347 10.942924 -1.953964 + 1651 1 1 0.236369 -10.766992 10.258887 -1.952174 + 1652 1 1 0.236369 -11.425197 9.521213 -1.955395 + 1653 1 1 0.236369 -12.023066 8.742114 -1.950619 + 1654 1 1 0.236369 -12.573141 7.931182 -1.954460 + 1655 1 1 0.236369 -13.070782 7.079564 -1.957107 + 1656 1 1 0.236369 -13.513388 6.206233 -1.954871 + 1657 1 1 0.236369 -13.895748 5.300552 -1.954889 + 1658 1 1 0.236369 -14.210385 4.361166 -1.957661 + 1659 1 1 0.236369 -14.472625 3.418418 -1.956132 + 1660 1 1 0.236369 -14.659269 2.454582 -1.949284 + 1661 1 1 0.236369 -14.792345 1.475509 -1.951333 + 1662 1 1 0.236369 -14.857539 0.500139 -1.949328 + 1663 1 1 0.236369 -14.861816 -0.488768 -1.955183 + 1664 1 1 0.236369 -14.797644 -1.472704 -1.948933 + 1665 1 1 0.236369 -14.666290 -2.446864 -1.955805 + 1666 1 1 0.236369 -14.466409 -3.403939 -1.948251 + 1667 1 1 0.236369 -14.208741 -4.354005 -1.953749 + 1668 1 1 0.236369 -13.891541 -5.283416 -1.955597 + 1669 1 1 0.236369 -13.511196 -6.192004 -1.949709 + 1670 1 1 0.236369 -13.076947 -7.069880 -1.954288 + 1671 1 1 0.236369 -12.577091 -7.926723 -1.952878 + 1672 1 1 0.236369 -12.023330 -8.737295 -1.950416 + 1673 1 1 0.236369 -11.423372 -9.514906 -1.949574 + 1674 1 1 0.236369 -10.763530 -10.247029 -1.953948 + 1675 1 1 0.236369 -10.071410 -10.932637 -1.956927 + 1676 1 1 0.236369 -9.323952 -11.580401 -1.955239 + 1677 1 1 0.236369 -8.536114 -12.168329 -1.949973 + 1678 1 1 0.236369 -7.717340 -12.711935 -1.948524 + 1679 1 1 0.236369 -6.853658 -13.192936 -1.952210 + 1680 1 1 0.236369 -5.968317 -13.610742 -1.948513 + 1681 1 1 0.236369 -5.055435 -13.982173 -1.951920 + 1682 1 1 0.236369 -4.117146 -14.279717 -1.948013 + 1683 1 1 0.236369 -3.163535 -14.526048 -1.950269 + 1684 1 1 0.236369 -2.197038 -14.700598 -1.956037 + 1685 1 1 0.236369 -1.224915 -14.820355 -1.952725 + 1686 1 1 0.236369 -0.241365 -14.862297 -1.951491 + 1687 1 1 0.236369 0.744916 -14.848385 -1.949203 + 1688 1 1 0.236369 1.718548 -14.762738 -1.951892 + 1689 1 1 0.236369 2.691094 -14.623468 -1.947896 + 1690 1 1 0.236369 3.653479 -14.412838 -1.956601 + 1691 1 1 0.236369 4.600846 -14.142664 -1.954959 + 1692 1 1 0.236369 5.530051 -13.799503 -1.953124 + 1693 1 1 0.236369 6.428014 -13.409793 -1.956597 + 1694 1 1 0.236369 7.296537 -12.959583 -1.955612 + 1695 1 1 0.236369 8.136949 -12.442899 -1.956082 + 1696 1 1 0.236369 8.947586 -11.880195 -1.951173 + 1697 1 1 0.236369 9.714158 -11.265207 -1.954635 + 1698 1 1 0.236369 10.434957 -10.594903 -1.949987 + 1699 1 1 0.236369 11.109038 -9.881668 -1.952433 + 1700 1 1 0.236369 11.736726 -9.131833 -1.955587 + 1701 1 1 0.236369 12.322259 -8.333427 -1.951025 + 1702 1 1 0.236369 12.843915 -7.502356 -1.957402 + 1703 1 1 0.236369 13.315603 -6.640243 -1.952167 + 1704 1 1 0.236369 13.716602 -5.741884 -1.947955 + 1705 1 1 0.236369 14.071731 -4.819450 -1.954263 + 1706 1 1 0.236369 14.357122 -3.887567 -1.952306 + 1707 1 1 0.236369 14.588168 -2.922460 -1.948620 + 1708 1 1 0.236369 14.743665 -1.955953 -1.955294 + 1709 1 1 0.236369 14.843583 -0.978604 -1.949568 + 1710 1 1 0.236369 14.715713 0.001524 -2.924604 + 1711 1 1 0.236369 14.687192 0.985114 -2.917556 + 1712 1 1 0.236369 14.587282 1.965362 -2.923559 + 1713 1 1 0.236369 14.419056 2.935708 -2.917860 + 1714 1 1 0.236369 14.192239 3.890331 -2.918288 + 1715 1 1 0.236369 13.899101 4.833560 -2.924464 + 1716 1 1 0.236369 13.551112 5.752138 -2.916569 + 1717 1 1 0.236369 13.136250 6.642502 -2.923818 + 1718 1 1 0.236369 12.659736 7.501432 -2.918569 + 1719 1 1 0.236369 12.130479 8.332130 -2.918247 + 1720 1 1 0.236369 11.550556 9.124035 -2.921375 + 1721 1 1 0.236369 10.920103 9.869712 -2.917198 + 1722 1 1 0.236369 10.233039 10.580137 -2.925345 + 1723 1 1 0.236369 9.498664 11.237787 -2.924997 + 1724 1 1 0.236369 8.727268 11.849799 -2.917772 + 1725 1 1 0.236369 7.924199 12.409881 -2.926168 + 1726 1 1 0.236369 7.074726 12.905763 -2.919072 + 1727 1 1 0.236369 6.196526 13.345253 -2.918188 + 1728 1 1 0.236369 5.295424 13.738041 -2.925193 + 1729 1 1 0.236369 4.362384 14.060507 -2.921469 + 1730 1 1 0.236369 3.415810 14.314594 -2.922880 + 1731 1 1 0.236369 2.454117 14.509448 -2.918616 + 1732 1 1 0.236369 1.481300 14.645763 -2.923502 + 1733 1 1 0.236369 0.494881 14.708679 -2.918111 + 1734 1 1 0.236369 -0.485093 14.709189 -2.924624 + 1735 1 1 0.236369 -1.462837 14.644742 -2.917718 + 1736 1 1 0.236369 -2.446241 14.507772 -2.917094 + 1737 1 1 0.236369 -3.404617 14.319736 -2.924444 + 1738 1 1 0.236369 -4.354602 14.060686 -2.925851 + 1739 1 1 0.236369 -5.284436 13.729713 -2.920870 + 1740 1 1 0.236369 -6.190061 13.353380 -2.926260 + 1741 1 1 0.236369 -7.062625 12.910588 -2.918071 + 1742 1 1 0.236369 -7.906197 12.400558 -2.917269 + 1743 1 1 0.236369 -8.724864 11.849250 -2.919302 + 1744 1 1 0.236369 -9.490523 11.241186 -2.923922 + 1745 1 1 0.236369 -10.225560 10.579027 -2.920463 + 1746 1 1 0.236369 -10.901098 9.874930 -2.916966 + 1747 1 1 0.236369 -11.537773 9.125252 -2.917400 + 1748 1 1 0.236369 -12.124760 8.331846 -2.920293 + 1749 1 1 0.236369 -12.650749 7.503687 -2.918431 + 1750 1 1 0.236369 -13.125557 6.637943 -2.917993 + 1751 1 1 0.236369 -13.536308 5.751719 -2.920753 + 1752 1 1 0.236369 -13.894198 4.830098 -2.926348 + 1753 1 1 0.236369 -14.188325 3.893101 -2.923842 + 1754 1 1 0.236369 -14.411070 2.938715 -2.922035 + 1755 1 1 0.236369 -14.571411 1.963590 -2.922048 + 1756 1 1 0.236369 -14.676988 0.986646 -2.917602 + 1757 1 1 0.236369 -14.707456 0.005543 -2.925678 + 1758 1 1 0.236369 -14.671434 -0.978200 -2.922956 + 1759 1 1 0.236369 -14.580121 -1.959984 -2.924584 + 1760 1 1 0.236369 -14.407517 -2.922936 -2.923894 + 1761 1 1 0.236369 -14.181421 -3.886458 -2.919077 + 1762 1 1 0.236369 -13.892175 -4.821532 -2.923473 + 1763 1 1 0.236369 -13.542559 -5.742948 -2.923981 + 1764 1 1 0.236369 -13.125561 -6.625403 -2.924958 + 1765 1 1 0.236369 -12.652860 -7.492144 -2.924148 + 1766 1 1 0.236369 -12.119060 -8.316992 -2.918179 + 1767 1 1 0.236369 -11.537247 -9.113791 -2.922573 + 1768 1 1 0.236369 -10.901398 -9.859592 -2.919700 + 1769 1 1 0.236369 -10.220728 -10.572625 -2.916997 + 1770 1 1 0.236369 -9.494299 -11.225592 -2.922090 + 1771 1 1 0.236369 -8.717380 -11.835067 -2.920303 + 1772 1 1 0.236369 -7.911354 -12.396460 -2.916659 + 1773 1 1 0.236369 -7.067895 -12.895244 -2.922708 + 1774 1 1 0.236369 -6.188736 -13.339245 -2.919710 + 1775 1 1 0.236369 -5.280477 -13.719802 -2.923207 + 1776 1 1 0.236369 -4.353155 -14.049115 -2.917498 + 1777 1 1 0.236369 -3.402921 -14.310972 -2.923399 + 1778 1 1 0.236369 -2.437046 -14.498042 -2.923401 + 1779 1 1 0.236369 -1.462961 -14.635543 -2.917284 + 1780 1 1 0.236369 -0.486243 -14.701115 -2.921426 + 1781 1 1 0.236369 0.501232 -14.697154 -2.924283 + 1782 1 1 0.236369 1.473742 -14.634849 -2.926097 + 1783 1 1 0.236369 2.447515 -14.498592 -2.924653 + 1784 1 1 0.236369 3.413530 -14.302174 -2.923331 + 1785 1 1 0.236369 4.364543 -14.041803 -2.916740 + 1786 1 1 0.236369 5.292837 -13.724839 -2.918518 + 1787 1 1 0.236369 6.201711 -13.336908 -2.919622 + 1788 1 1 0.236369 7.075618 -12.899923 -2.917948 + 1789 1 1 0.236369 7.920469 -12.394193 -2.922146 + 1790 1 1 0.236369 8.732156 -11.837023 -2.919317 + 1791 1 1 0.236369 9.505459 -11.233824 -2.921542 + 1792 1 1 0.236369 10.227684 -10.569864 -2.918149 + 1793 1 1 0.236369 10.919031 -9.859551 -2.921981 + 1794 1 1 0.236369 11.547220 -9.114987 -2.917755 + 1795 1 1 0.236369 12.133787 -8.323741 -2.926266 + 1796 1 1 0.236369 12.660606 -7.488971 -2.916395 + 1797 1 1 0.236369 13.134231 -6.630206 -2.923603 + 1798 1 1 0.236369 13.551016 -5.741797 -2.926020 + 1799 1 1 0.236369 13.899459 -4.823522 -2.924834 + 1800 1 1 0.236369 14.191845 -3.880205 -2.921559 + 1801 1 1 0.236369 14.418962 -2.924751 -2.917466 + 1802 1 1 0.236369 14.582464 -1.957970 -2.923521 + 1803 1 1 0.236369 14.682194 -0.976415 -2.918514 + 1804 1 1 0.236369 14.497691 0.007159 -3.880582 + 1805 1 1 0.236369 14.460544 0.980948 -3.874973 + 1806 1 1 0.236369 14.360859 1.955942 -3.879819 + 1807 1 1 0.236369 14.194091 2.920214 -3.881467 + 1808 1 1 0.236369 13.972712 3.875870 -3.873757 + 1809 1 1 0.236369 13.674111 4.803227 -3.875420 + 1810 1 1 0.236369 13.323121 5.722798 -3.872705 + 1811 1 1 0.236369 12.904718 6.602509 -3.872435 + 1812 1 1 0.236369 12.427366 7.460331 -3.876938 + 1813 1 1 0.236369 11.900721 8.284877 -3.873226 + 1814 1 1 0.236369 11.313887 9.067751 -3.877519 + 1815 1 1 0.236369 10.673190 9.805074 -3.873389 + 1816 1 1 0.236369 9.990504 10.508407 -3.882047 + 1817 1 1 0.236369 9.259625 11.152680 -3.880998 + 1818 1 1 0.236369 8.481001 11.759917 -3.874879 + 1819 1 1 0.236369 7.667443 12.304775 -3.878375 + 1820 1 1 0.236369 6.822488 12.790411 -3.878349 + 1821 1 1 0.236369 5.946860 13.223068 -3.876267 + 1822 1 1 0.236369 5.039087 13.596753 -3.882047 + 1823 1 1 0.236369 4.107107 13.896956 -3.878409 + 1824 1 1 0.236369 3.163226 14.148537 -3.881718 + 1825 1 1 0.236369 2.203561 14.330077 -3.875390 + 1826 1 1 0.236369 1.227581 14.445065 -3.877082 + 1827 1 1 0.236369 0.250111 14.488730 -3.881525 + 1828 1 1 0.236369 -0.730739 14.474577 -3.878223 + 1829 1 1 0.236369 -1.708349 14.387881 -3.877984 + 1830 1 1 0.236369 -2.674655 14.242787 -3.875693 + 1831 1 1 0.236369 -3.630746 14.027707 -3.880102 + 1832 1 1 0.236369 -4.565672 13.753692 -3.881475 + 1833 1 1 0.236369 -5.487991 13.415003 -3.877609 + 1834 1 1 0.236369 -6.371671 13.016109 -3.874999 + 1835 1 1 0.236369 -7.238016 12.551942 -3.876146 + 1836 1 1 0.236369 -8.074997 12.035373 -3.873280 + 1837 1 1 0.236369 -8.868431 11.466718 -3.879758 + 1838 1 1 0.236369 -9.619907 10.841587 -3.880085 + 1839 1 1 0.236369 -10.326797 10.163752 -3.879928 + 1840 1 1 0.236369 -10.992288 9.446674 -3.874184 + 1841 1 1 0.236369 -11.605528 8.674477 -3.875262 + 1842 1 1 0.236369 -12.157444 7.878764 -3.873501 + 1843 1 1 0.236369 -12.664769 7.034835 -3.875176 + 1844 1 1 0.236369 -13.106298 6.162496 -3.875675 + 1845 1 1 0.236369 -13.495691 5.269050 -3.877890 + 1846 1 1 0.236369 -13.820051 4.340921 -3.876658 + 1847 1 1 0.236369 -14.085205 3.395915 -3.872383 + 1848 1 1 0.236369 -14.282211 2.435876 -3.872713 + 1849 1 1 0.236369 -14.413639 1.475370 -3.878917 + 1850 1 1 0.236369 -14.474681 0.496153 -3.880731 + 1851 1 1 0.236369 -14.478211 -0.480744 -3.878115 + 1852 1 1 0.236369 -14.406136 -1.456425 -3.876741 + 1853 1 1 0.236369 -14.274135 -2.428793 -3.881988 + 1854 1 1 0.236369 -14.076061 -3.385086 -3.873619 + 1855 1 1 0.236369 -13.819527 -4.334872 -3.873342 + 1856 1 1 0.236369 -13.497855 -5.251970 -3.877314 + 1857 1 1 0.236369 -13.111840 -6.151009 -3.880193 + 1858 1 1 0.236369 -12.662942 -7.028485 -3.875070 + 1859 1 1 0.236369 -12.157093 -7.869944 -3.875289 + 1860 1 1 0.236369 -11.602139 -8.666285 -3.877678 + 1861 1 1 0.236369 -10.988949 -9.436813 -3.880580 + 1862 1 1 0.236369 -10.324953 -10.151016 -3.874342 + 1863 1 1 0.236369 -9.612819 -10.828117 -3.873401 + 1864 1 1 0.236369 -8.867119 -11.450948 -3.880861 + 1865 1 1 0.236369 -8.067855 -12.028353 -3.872889 + 1866 1 1 0.236369 -7.238666 -12.542430 -3.882283 + 1867 1 1 0.236369 -6.376488 -13.001851 -3.877898 + 1868 1 1 0.236369 -5.479242 -13.409139 -3.882174 + 1869 1 1 0.236369 -4.566377 -13.744484 -3.879941 + 1870 1 1 0.236369 -3.629887 -14.017497 -3.875216 + 1871 1 1 0.236369 -2.670142 -14.238394 -3.875344 + 1872 1 1 0.236369 -1.702822 -14.383311 -3.879634 + 1873 1 1 0.236369 -0.730571 -14.463696 -3.879020 + 1874 1 1 0.236369 0.252739 -14.483873 -3.881353 + 1875 1 1 0.236369 1.232148 -14.427747 -3.881870 + 1876 1 1 0.236369 2.203830 -14.314863 -3.874693 + 1877 1 1 0.236369 3.157146 -14.138947 -3.879037 + 1878 1 1 0.236369 4.105655 -13.890154 -3.877067 + 1879 1 1 0.236369 5.032303 -13.578192 -3.872767 + 1880 1 1 0.236369 5.943915 -13.210696 -3.875596 + 1881 1 1 0.236369 6.817629 -12.777737 -3.877554 + 1882 1 1 0.236369 7.668175 -12.286962 -3.875792 + 1883 1 1 0.236369 8.485550 -11.742039 -3.875629 + 1884 1 1 0.236369 9.256122 -11.150082 -3.879984 + 1885 1 1 0.236369 9.986054 -10.499550 -3.874237 + 1886 1 1 0.236369 10.670624 -9.802040 -3.877258 + 1887 1 1 0.236369 11.310447 -9.060691 -3.877945 + 1888 1 1 0.236369 11.901511 -8.276950 -3.875195 + 1889 1 1 0.236369 12.424840 -7.449371 -3.876733 + 1890 1 1 0.236369 12.903272 -6.593522 -3.879736 + 1891 1 1 0.236369 13.323245 -5.704588 -3.881534 + 1892 1 1 0.236369 13.670470 -4.794536 -3.876395 + 1893 1 1 0.236369 13.969939 -3.865045 -3.875543 + 1894 1 1 0.236369 14.202089 -2.911636 -3.876406 + 1895 1 1 0.236369 14.359652 -1.949238 -3.876949 + 1896 1 1 0.236369 14.457170 -0.970813 -3.877560 + 1897 1 1 0.236369 14.210805 0.001168 -4.818354 + 1898 1 1 0.236369 14.179202 0.987407 -4.817282 + 1899 1 1 0.236369 14.074845 1.963322 -4.813943 + 1900 1 1 0.236369 13.909321 2.928636 -4.811627 + 1901 1 1 0.236369 13.667599 3.876594 -4.818942 + 1902 1 1 0.236369 13.373430 4.812646 -4.813671 + 1903 1 1 0.236369 13.005874 5.722167 -4.820246 + 1904 1 1 0.236369 12.581161 6.601778 -4.821237 + 1905 1 1 0.236369 12.093160 7.461165 -4.817053 + 1906 1 1 0.236369 11.556800 8.276192 -4.815962 + 1907 1 1 0.236369 10.956831 9.049054 -4.819283 + 1908 1 1 0.236369 10.307755 9.790014 -4.820144 + 1909 1 1 0.236369 9.609122 10.469487 -4.814821 + 1910 1 1 0.236369 8.856691 11.108096 -4.818051 + 1911 1 1 0.236369 8.078272 11.693735 -4.816487 + 1912 1 1 0.236369 7.248034 12.220808 -4.814645 + 1913 1 1 0.236369 6.390387 12.690988 -4.815639 + 1914 1 1 0.236369 5.499620 13.106215 -4.816531 + 1915 1 1 0.236369 4.583695 13.448668 -4.813828 + 1916 1 1 0.236369 3.638332 13.735707 -4.814740 + 1917 1 1 0.236369 2.685393 13.951634 -4.818397 + 1918 1 1 0.236369 1.718278 14.105017 -4.813271 + 1919 1 1 0.236369 0.744538 14.194164 -4.814984 + 1920 1 1 0.236369 -0.236818 14.203995 -4.815721 + 1921 1 1 0.236369 -1.215432 14.151092 -4.821401 + 1922 1 1 0.236369 -2.191943 14.041958 -4.813222 + 1923 1 1 0.236369 -3.154849 13.854630 -4.820452 + 1924 1 1 0.236369 -4.099974 13.601924 -4.813188 + 1925 1 1 0.236369 -5.036442 13.286146 -4.818217 + 1926 1 1 0.236369 -5.932202 12.902816 -4.817298 + 1927 1 1 0.236369 -6.812932 12.471134 -4.813654 + 1928 1 1 0.236369 -7.660112 11.964750 -4.820176 + 1929 1 1 0.236369 -8.459976 11.410408 -4.815511 + 1930 1 1 0.236369 -9.232499 10.796738 -4.812286 + 1931 1 1 0.236369 -9.955214 10.130097 -4.815228 + 1932 1 1 0.236369 -10.625751 9.424415 -4.821114 + 1933 1 1 0.236369 -11.253758 8.668110 -4.814609 + 1934 1 1 0.236369 -11.823912 7.868260 -4.819021 + 1935 1 1 0.236369 -12.337625 7.031535 -4.814683 + 1936 1 1 0.236369 -12.793255 6.171281 -4.817960 + 1937 1 1 0.236369 -13.188147 5.265760 -4.816173 + 1938 1 1 0.236369 -13.517736 4.345763 -4.819371 + 1939 1 1 0.236369 -13.789542 3.407062 -4.812537 + 1940 1 1 0.236369 -13.990986 2.449381 -4.817857 + 1941 1 1 0.236369 -14.126894 1.474325 -4.820804 + 1942 1 1 0.236369 -14.192257 0.498046 -4.821283 + 1943 1 1 0.236369 -14.187792 -0.482989 -4.815323 + 1944 1 1 0.236369 -14.125499 -1.461951 -4.812222 + 1945 1 1 0.236369 -13.985463 -2.433011 -4.818393 + 1946 1 1 0.236369 -13.784283 -3.389840 -4.814140 + 1947 1 1 0.236369 -13.515593 -4.337249 -4.818703 + 1948 1 1 0.236369 -13.183729 -5.261293 -4.820348 + 1949 1 1 0.236369 -12.794385 -6.156159 -4.816451 + 1950 1 1 0.236369 -12.338549 -7.026676 -4.817717 + 1951 1 1 0.236369 -11.821924 -7.864463 -4.811806 + 1952 1 1 0.236369 -11.253050 -8.658627 -4.818674 + 1953 1 1 0.236369 -10.623492 -9.413486 -4.815669 + 1954 1 1 0.236369 -9.948550 -10.126069 -4.815878 + 1955 1 1 0.236369 -9.228477 -10.788821 -4.815433 + 1956 1 1 0.236369 -8.464808 -11.396642 -4.815983 + 1957 1 1 0.236369 -7.653670 -11.955937 -4.818793 + 1958 1 1 0.236369 -6.814672 -12.456261 -4.820073 + 1959 1 1 0.236369 -5.936491 -12.900900 -4.814262 + 1960 1 1 0.236369 -5.032945 -13.278417 -4.821195 + 1961 1 1 0.236369 -4.103137 -13.592299 -4.813576 + 1962 1 1 0.236369 -3.150760 -13.841450 -4.817528 + 1963 1 1 0.236369 -2.190216 -14.025798 -4.813292 + 1964 1 1 0.236369 -1.214582 -14.141156 -4.811882 + 1965 1 1 0.236369 -0.242821 -14.192514 -4.817367 + 1966 1 1 0.236369 0.740501 -14.183989 -4.821053 + 1967 1 1 0.236369 1.712612 -14.090854 -4.813722 + 1968 1 1 0.236369 2.688388 -13.947044 -4.815291 + 1969 1 1 0.236369 3.642787 -13.720779 -4.816504 + 1970 1 1 0.236369 4.583955 -13.440893 -4.815915 + 1971 1 1 0.236369 5.502079 -13.096759 -4.818500 + 1972 1 1 0.236369 6.392130 -12.688334 -4.814121 + 1973 1 1 0.236369 7.247153 -12.215443 -4.818225 + 1974 1 1 0.236369 8.068768 -11.681488 -4.812758 + 1975 1 1 0.236369 8.861428 -11.104330 -4.818255 + 1976 1 1 0.236369 9.603148 -10.464105 -4.813632 + 1977 1 1 0.236369 10.302562 -9.778999 -4.813544 + 1978 1 1 0.236369 10.953840 -9.044799 -4.821090 + 1979 1 1 0.236369 11.549569 -8.268711 -4.817567 + 1980 1 1 0.236369 12.099079 -7.445859 -4.811940 + 1981 1 1 0.236369 12.584460 -6.600041 -4.817448 + 1982 1 1 0.236369 13.007844 -5.711310 -4.818287 + 1983 1 1 0.236369 13.369267 -4.805065 -4.815228 + 1984 1 1 0.236369 13.673988 -3.866708 -4.813012 + 1985 1 1 0.236369 13.905847 -2.916196 -4.813709 + 1986 1 1 0.236369 14.078312 -1.952379 -4.816208 + 1987 1 1 0.236369 14.179036 -0.971641 -4.814175 + 1988 1 1 0.236369 13.861758 0.008184 -5.732854 + 1989 1 1 0.236369 13.829137 0.986924 -5.735804 + 1990 1 1 0.236369 13.723750 1.950218 -5.731747 + 1991 1 1 0.236369 13.554768 2.919575 -5.735306 + 1992 1 1 0.236369 13.317265 3.861688 -5.730770 + 1993 1 1 0.236369 13.011210 4.791884 -5.732274 + 1994 1 1 0.236369 12.634676 5.697225 -5.738921 + 1995 1 1 0.236369 12.208374 6.576787 -5.737874 + 1996 1 1 0.236369 11.706350 7.419725 -5.738974 + 1997 1 1 0.236369 11.157873 8.228050 -5.734910 + 1998 1 1 0.236369 10.553105 8.993370 -5.739685 + 1999 1 1 0.236369 9.893128 9.716237 -5.735566 + 2000 1 1 0.236369 9.179263 10.389684 -5.730425 + 2001 1 1 0.236369 8.427602 11.013241 -5.733429 + 2002 1 1 0.236369 7.631691 11.581246 -5.731542 + 2003 1 1 0.236369 6.789833 12.084944 -5.735289 + 2004 1 1 0.236369 5.919527 12.539364 -5.737375 + 2005 1 1 0.236369 5.021821 12.924580 -5.738421 + 2006 1 1 0.236369 4.099402 13.247336 -5.730639 + 2007 1 1 0.236369 3.154700 13.496839 -5.732689 + 2008 1 1 0.236369 2.201328 13.684382 -5.730748 + 2009 1 1 0.236369 1.221870 13.810371 -5.733539 + 2010 1 1 0.236369 0.250503 13.863050 -5.738391 + 2011 1 1 0.236369 -0.731794 13.839888 -5.737353 + 2012 1 1 0.236369 -1.699385 13.753523 -5.739669 + 2013 1 1 0.236369 -2.671931 13.603822 -5.739811 + 2014 1 1 0.236369 -3.621102 13.383500 -5.737456 + 2015 1 1 0.236369 -4.550584 13.094423 -5.738547 + 2016 1 1 0.236369 -5.468755 12.732876 -5.733480 + 2017 1 1 0.236369 -6.356308 12.321568 -5.731227 + 2018 1 1 0.236369 -7.207442 11.844219 -5.736732 + 2019 1 1 0.236369 -8.022483 11.301665 -5.739250 + 2020 1 1 0.236369 -8.800019 10.703531 -5.732321 + 2021 1 1 0.236369 -9.534097 10.057596 -5.735567 + 2022 1 1 0.236369 -10.212559 9.364768 -5.733378 + 2023 1 1 0.236369 -10.849691 8.613501 -5.733421 + 2024 1 1 0.236369 -11.427417 7.830079 -5.736037 + 2025 1 1 0.236369 -11.956195 7.004985 -5.733658 + 2026 1 1 0.236369 -12.415121 6.147999 -5.733917 + 2027 1 1 0.236369 -12.826518 5.248846 -5.735000 + 2028 1 1 0.236369 -13.158623 4.330077 -5.738339 + 2029 1 1 0.236369 -13.429280 3.395967 -5.735132 + 2030 1 1 0.236369 -13.640581 2.434293 -5.732768 + 2031 1 1 0.236369 -13.771238 1.474626 -5.736053 + 2032 1 1 0.236369 -13.841928 0.491559 -5.732877 + 2033 1 1 0.236369 -13.841296 -0.483012 -5.733387 + 2034 1 1 0.236369 -13.774828 -1.456624 -5.730694 + 2035 1 1 0.236369 -13.634985 -2.424908 -5.737172 + 2036 1 1 0.236369 -13.434000 -3.384614 -5.736828 + 2037 1 1 0.236369 -13.162492 -4.321307 -5.736381 + 2038 1 1 0.236369 -12.823452 -5.237606 -5.739990 + 2039 1 1 0.236369 -12.418679 -6.129451 -5.733916 + 2040 1 1 0.236369 -11.952276 -6.997440 -5.734599 + 2041 1 1 0.236369 -11.434134 -7.820363 -5.736596 + 2042 1 1 0.236369 -10.852497 -8.605249 -5.736037 + 2043 1 1 0.236369 -10.213300 -9.355505 -5.735629 + 2044 1 1 0.236369 -9.530246 -10.047715 -5.737107 + 2045 1 1 0.236369 -8.793444 -10.698068 -5.737995 + 2046 1 1 0.236369 -8.024424 -11.291310 -5.739092 + 2047 1 1 0.236369 -7.201307 -11.832575 -5.738912 + 2048 1 1 0.236369 -6.350020 -12.313407 -5.730786 + 2049 1 1 0.236369 -5.469820 -12.729000 -5.735327 + 2050 1 1 0.236369 -4.555819 -13.077106 -5.732769 + 2051 1 1 0.236369 -3.622134 -13.370673 -5.737142 + 2052 1 1 0.236369 -2.667612 -13.595149 -5.740174 + 2053 1 1 0.236369 -1.699764 -13.744935 -5.734095 + 2054 1 1 0.236369 -0.732373 -13.831050 -5.736676 + 2055 1 1 0.236369 0.252790 -13.855822 -5.733763 + 2056 1 1 0.236369 1.229768 -13.795468 -5.731792 + 2057 1 1 0.236369 2.195598 -13.675746 -5.739238 + 2058 1 1 0.236369 3.156130 -13.491775 -5.734368 + 2059 1 1 0.236369 4.101625 -13.232384 -5.734428 + 2060 1 1 0.236369 5.026578 -12.914213 -5.735033 + 2061 1 1 0.236369 5.925655 -12.521625 -5.735705 + 2062 1 1 0.236369 6.794986 -12.079425 -5.730584 + 2063 1 1 0.236369 7.626660 -11.571682 -5.738428 + 2064 1 1 0.236369 8.424447 -10.999388 -5.734658 + 2065 1 1 0.236369 9.185154 -10.380702 -5.733987 + 2066 1 1 0.236369 9.891044 -9.705832 -5.739950 + 2067 1 1 0.236369 10.554288 -8.981208 -5.733829 + 2068 1 1 0.236369 11.156492 -8.221458 -5.731870 + 2069 1 1 0.236369 11.712322 -7.416564 -5.736300 + 2070 1 1 0.236369 12.206033 -6.565202 -5.735878 + 2071 1 1 0.236369 12.643055 -5.692503 -5.739403 + 2072 1 1 0.236369 13.004611 -4.784969 -5.734438 + 2073 1 1 0.236369 13.314304 -3.859781 -5.731535 + 2074 1 1 0.236369 13.553756 -2.912402 -5.738182 + 2075 1 1 0.236369 13.721185 -1.948678 -5.739305 + 2076 1 1 0.236369 13.832719 -0.969274 -5.738372 + 2077 1 1 0.236369 13.461935 0.003010 -6.627652 + 2078 1 1 0.236369 13.421592 0.985851 -6.627006 + 2079 1 1 0.236369 13.317544 1.965293 -6.628020 + 2080 1 1 0.236369 13.132722 2.933282 -6.629648 + 2081 1 1 0.236369 12.888886 3.883486 -6.631187 + 2082 1 1 0.236369 12.568010 4.809601 -6.627916 + 2083 1 1 0.236369 12.185534 5.712153 -6.628710 + 2084 1 1 0.236369 11.740200 6.590648 -6.627693 + 2085 1 1 0.236369 11.221811 7.423018 -6.633082 + 2086 1 1 0.236369 10.651113 8.225005 -6.627590 + 2087 1 1 0.236369 10.024321 8.983887 -6.627527 + 2088 1 1 0.236369 9.340822 9.690848 -6.625029 + 2089 1 1 0.236369 8.613564 10.343933 -6.626042 + 2090 1 1 0.236369 7.837676 10.951151 -6.632549 + 2091 1 1 0.236369 7.009848 11.484698 -6.624838 + 2092 1 1 0.236369 6.153691 11.971760 -6.632334 + 2093 1 1 0.236369 5.268590 12.383067 -6.632154 + 2094 1 1 0.236369 4.347494 12.736887 -6.634245 + 2095 1 1 0.236369 3.412473 13.023969 -6.631324 + 2096 1 1 0.236369 2.453300 13.232907 -6.631586 + 2097 1 1 0.236369 1.477818 13.373148 -6.628466 + 2098 1 1 0.236369 0.499935 13.449685 -6.630365 + 2099 1 1 0.236369 -0.487315 13.446855 -6.632466 + 2100 1 1 0.236369 -1.465062 13.373706 -6.630402 + 2101 1 1 0.236369 -2.433725 13.236305 -6.632784 + 2102 1 1 0.236369 -3.397141 13.020505 -6.626007 + 2103 1 1 0.236369 -4.334404 12.734368 -6.632833 + 2104 1 1 0.236369 -5.254364 12.382513 -6.627535 + 2105 1 1 0.236369 -6.146482 11.966417 -6.626829 + 2106 1 1 0.236369 -7.001868 11.484813 -6.634181 + 2107 1 1 0.236369 -7.818925 10.944499 -6.632908 + 2108 1 1 0.236369 -8.603592 10.350185 -6.634024 + 2109 1 1 0.236369 -9.333490 9.690248 -6.626243 + 2110 1 1 0.236369 -10.009566 8.979978 -6.633859 + 2111 1 1 0.236369 -10.644051 8.226548 -6.627669 + 2112 1 1 0.236369 -11.213260 7.429673 -6.629770 + 2113 1 1 0.236369 -11.722747 6.589660 -6.626300 + 2114 1 1 0.236369 -12.171124 5.716345 -6.630746 + 2115 1 1 0.236369 -12.558872 4.814491 -6.634077 + 2116 1 1 0.236369 -12.881604 3.879630 -6.632144 + 2117 1 1 0.236369 -13.130877 2.932598 -6.627221 + 2118 1 1 0.236369 -13.303546 1.960353 -6.628841 + 2119 1 1 0.236369 -13.411531 0.982594 -6.625633 + 2120 1 1 0.236369 -13.443471 0.003397 -6.626942 + 2121 1 1 0.236369 -13.409741 -0.973841 -6.633298 + 2122 1 1 0.236369 -13.303101 -1.955010 -6.624616 + 2123 1 1 0.236369 -13.126005 -2.915382 -6.626943 + 2124 1 1 0.236369 -12.880089 -3.869770 -6.634192 + 2125 1 1 0.236369 -12.555784 -4.802477 -6.627539 + 2126 1 1 0.236369 -12.175676 -5.700975 -6.629475 + 2127 1 1 0.236369 -11.731457 -6.575199 -6.633983 + 2128 1 1 0.236369 -11.212885 -7.414475 -6.633186 + 2129 1 1 0.236369 -10.642877 -8.219608 -6.633564 + 2130 1 1 0.236369 -10.018898 -8.974646 -6.628252 + 2131 1 1 0.236369 -9.328543 -9.677128 -6.631996 + 2132 1 1 0.236369 -8.602277 -10.333666 -6.632910 + 2133 1 1 0.236369 -7.825504 -10.936336 -6.629029 + 2134 1 1 0.236369 -7.007118 -11.473789 -6.625027 + 2135 1 1 0.236369 -6.148213 -11.959639 -6.628161 + 2136 1 1 0.236369 -5.259283 -12.371552 -6.627431 + 2137 1 1 0.236369 -4.337220 -12.727635 -6.631986 + 2138 1 1 0.236369 -3.402074 -13.010612 -6.632262 + 2139 1 1 0.236369 -2.440823 -13.221620 -6.633957 + 2140 1 1 0.236369 -1.468563 -13.368505 -6.627697 + 2141 1 1 0.236369 -0.482533 -13.439583 -6.629258 + 2142 1 1 0.236369 0.495777 -13.442787 -6.629472 + 2143 1 1 0.236369 1.478940 -13.364801 -6.625713 + 2144 1 1 0.236369 2.449610 -13.223656 -6.624675 + 2145 1 1 0.236369 3.410569 -13.009160 -6.626733 + 2146 1 1 0.236369 4.344879 -12.724560 -6.631864 + 2147 1 1 0.236369 5.271353 -12.379297 -6.627568 + 2148 1 1 0.236369 6.159809 -11.955822 -6.626737 + 2149 1 1 0.236369 7.008764 -11.474418 -6.628468 + 2150 1 1 0.236369 7.832463 -10.938341 -6.626106 + 2151 1 1 0.236369 8.608836 -10.333421 -6.625062 + 2152 1 1 0.236369 9.343745 -9.681533 -6.627955 + 2153 1 1 0.236369 10.021791 -8.974774 -6.634141 + 2154 1 1 0.236369 10.653873 -8.220473 -6.632487 + 2155 1 1 0.236369 11.225880 -7.416342 -6.634063 + 2156 1 1 0.236369 11.737759 -6.578824 -6.624980 + 2157 1 1 0.236369 12.185562 -5.701964 -6.629486 + 2158 1 1 0.236369 12.565758 -4.803186 -6.626382 + 2159 1 1 0.236369 12.887826 -3.874062 -6.629762 + 2160 1 1 0.236369 13.135315 -2.920796 -6.629388 + 2161 1 1 0.236369 13.310807 -1.954029 -6.630073 + 2162 1 1 0.236369 13.421801 -0.974160 -6.625413 + 2163 1 1 0.236369 12.994890 0.001307 -7.491257 + 2164 1 1 0.236369 12.958689 0.982960 -7.493668 + 2165 1 1 0.236369 12.849833 1.965540 -7.497077 + 2166 1 1 0.236369 12.663832 2.925152 -7.497083 + 2167 1 1 0.236369 12.408094 3.875066 -7.497545 + 2168 1 1 0.236369 12.071419 4.807305 -7.492957 + 2169 1 1 0.236369 11.675478 5.704675 -7.492254 + 2170 1 1 0.236369 11.213398 6.571456 -7.491773 + 2171 1 1 0.236369 10.689705 7.403018 -7.491938 + 2172 1 1 0.236369 10.098163 8.189416 -7.497462 + 2173 1 1 0.236369 9.447129 8.926180 -7.491995 + 2174 1 1 0.236369 8.744205 9.612510 -7.493703 + 2175 1 1 0.236369 7.989655 10.244480 -7.497685 + 2176 1 1 0.236369 7.198906 10.827016 -7.496189 + 2177 1 1 0.236369 6.357806 11.340754 -7.495468 + 2178 1 1 0.236369 5.479590 11.788474 -7.494994 + 2179 1 1 0.236369 4.575340 12.165959 -7.494594 + 2180 1 1 0.236369 3.640050 12.471363 -7.496549 + 2181 1 1 0.236369 2.692335 12.710655 -7.497086 + 2182 1 1 0.236369 1.719578 12.878381 -7.492965 + 2183 1 1 0.236369 0.746561 12.969766 -7.490659 + 2184 1 1 0.236369 -0.245660 12.995304 -7.494058 + 2185 1 1 0.236369 -1.219107 12.933707 -7.494069 + 2186 1 1 0.236369 -2.195668 12.808761 -7.492613 + 2187 1 1 0.236369 -3.158470 12.607105 -7.496274 + 2188 1 1 0.236369 -4.101153 12.329507 -7.495467 + 2189 1 1 0.236369 -5.020665 11.981667 -7.494906 + 2190 1 1 0.236369 -5.918459 11.571548 -7.490713 + 2191 1 1 0.236369 -6.768196 11.085587 -7.495492 + 2192 1 1 0.236369 -7.595577 10.541458 -7.493626 + 2193 1 1 0.236369 -8.368020 9.941478 -7.495406 + 2194 1 1 0.236369 -9.096458 9.277131 -7.494462 + 2195 1 1 0.236369 -9.764174 8.560059 -7.499588 + 2196 1 1 0.236369 -10.391953 7.801113 -7.491978 + 2197 1 1 0.236369 -10.946495 6.987115 -7.493285 + 2198 1 1 0.236369 -11.442871 6.146381 -7.497997 + 2199 1 1 0.236369 -11.874086 5.255924 -7.499854 + 2200 1 1 0.236369 -12.235258 4.340977 -7.492368 + 2201 1 1 0.236369 -12.536518 3.402456 -7.494325 + 2202 1 1 0.236369 -12.750271 2.451509 -7.493458 + 2203 1 1 0.236369 -12.901433 1.480087 -7.493653 + 2204 1 1 0.236369 -12.974133 0.498979 -7.492657 + 2205 1 1 0.236369 -12.978953 -0.483993 -7.491127 + 2206 1 1 0.236369 -12.901290 -1.462298 -7.493341 + 2207 1 1 0.236369 -12.751414 -2.439149 -7.498793 + 2208 1 1 0.236369 -12.527513 -3.393849 -7.492863 + 2209 1 1 0.236369 -12.239458 -4.335915 -7.495528 + 2210 1 1 0.236369 -11.879744 -5.244264 -7.493590 + 2211 1 1 0.236369 -11.448669 -6.137157 -7.493511 + 2212 1 1 0.236369 -10.946011 -6.975673 -7.493216 + 2213 1 1 0.236369 -10.384673 -7.788086 -7.499412 + 2214 1 1 0.236369 -9.766525 -8.553984 -7.497760 + 2215 1 1 0.236369 -9.094804 -9.266519 -7.498320 + 2216 1 1 0.236369 -8.361495 -9.930631 -7.490715 + 2217 1 1 0.236369 -7.590519 -10.536674 -7.494848 + 2218 1 1 0.236369 -6.767433 -11.075886 -7.493266 + 2219 1 1 0.236369 -5.918668 -11.556490 -7.493322 + 2220 1 1 0.236369 -5.025861 -11.969969 -7.499185 + 2221 1 1 0.236369 -4.099908 -12.320358 -7.497749 + 2222 1 1 0.236369 -3.154715 -12.596706 -7.497158 + 2223 1 1 0.236369 -2.194108 -12.798952 -7.490862 + 2224 1 1 0.236369 -1.224443 -12.928979 -7.497709 + 2225 1 1 0.236369 -0.244313 -12.978780 -7.497514 + 2226 1 1 0.236369 0.745622 -12.961889 -7.493237 + 2227 1 1 0.236369 1.723743 -12.873674 -7.493515 + 2228 1 1 0.236369 2.687527 -12.703846 -7.492963 + 2229 1 1 0.236369 3.640642 -12.462797 -7.491629 + 2230 1 1 0.236369 4.574279 -12.151116 -7.492727 + 2231 1 1 0.236369 5.485886 -11.770029 -7.499806 + 2232 1 1 0.236369 6.360960 -11.325094 -7.494163 + 2233 1 1 0.236369 7.197204 -10.817465 -7.490791 + 2234 1 1 0.236369 7.994782 -10.241103 -7.499083 + 2235 1 1 0.236369 8.743731 -9.601050 -7.494454 + 2236 1 1 0.236369 9.449601 -8.917019 -7.490692 + 2237 1 1 0.236369 10.098226 -8.174867 -7.498005 + 2238 1 1 0.236369 10.684536 -7.387099 -7.494747 + 2239 1 1 0.236369 11.213264 -6.563552 -7.498733 + 2240 1 1 0.236369 11.677938 -5.693974 -7.492513 + 2241 1 1 0.236369 12.073687 -4.798063 -7.496853 + 2242 1 1 0.236369 12.406125 -3.873635 -7.498128 + 2243 1 1 0.236369 12.665860 -2.917195 -7.490196 + 2244 1 1 0.236369 12.850864 -1.959047 -7.492872 + 2245 1 1 0.236369 12.960649 -0.978515 -7.491744 + 2246 1 1 0.236369 12.474649 0.002525 -8.326721 + 2247 1 1 0.236369 12.440493 0.980587 -8.326659 + 2248 1 1 0.236369 12.319811 1.957680 -8.328245 + 2249 1 1 0.236369 12.128676 2.920688 -8.331665 + 2250 1 1 0.236369 11.863528 3.854143 -8.328623 + 2251 1 1 0.236369 11.524124 4.780309 -8.327958 + 2252 1 1 0.236369 11.118523 5.670186 -8.325271 + 2253 1 1 0.236369 10.634899 6.525703 -8.331525 + 2254 1 1 0.236369 10.098319 7.340629 -8.328276 + 2255 1 1 0.236369 9.491046 8.101143 -8.325475 + 2256 1 1 0.236369 8.828326 8.824257 -8.330002 + 2257 1 1 0.236369 8.104871 9.492037 -8.328076 + 2258 1 1 0.236369 7.337432 10.096466 -8.326379 + 2259 1 1 0.236369 6.525526 10.643705 -8.331528 + 2260 1 1 0.236369 5.667575 11.122142 -8.327116 + 2261 1 1 0.236369 4.775667 11.532332 -8.333553 + 2262 1 1 0.236369 3.863833 11.862292 -8.328422 + 2263 1 1 0.236369 2.911905 12.131816 -8.327855 + 2264 1 1 0.236369 1.954320 12.321701 -8.333483 + 2265 1 1 0.236369 0.988275 12.434938 -8.324629 + 2266 1 1 0.236369 0.003650 12.473390 -8.325222 + 2267 1 1 0.236369 -0.975454 12.441657 -8.325802 + 2268 1 1 0.236369 -1.949848 12.323740 -8.325672 + 2269 1 1 0.236369 -2.902383 12.136883 -8.329817 + 2270 1 1 0.236369 -3.852719 11.871502 -8.332030 + 2271 1 1 0.236369 -4.769523 11.526765 -8.330031 + 2272 1 1 0.236369 -5.653215 11.116385 -8.327103 + 2273 1 1 0.236369 -6.511629 10.636434 -8.324234 + 2274 1 1 0.236369 -7.324731 10.094556 -8.332620 + 2275 1 1 0.236369 -8.094113 9.486479 -8.326166 + 2276 1 1 0.236369 -8.812084 8.823658 -8.333001 + 2277 1 1 0.236369 -9.483523 8.104274 -8.325982 + 2278 1 1 0.236369 -10.084817 7.333480 -8.328919 + 2279 1 1 0.236369 -10.633845 6.517962 -8.333103 + 2280 1 1 0.236369 -11.104401 5.666382 -8.325133 + 2281 1 1 0.236369 -11.519266 4.777913 -8.331906 + 2282 1 1 0.236369 -11.853152 3.857317 -8.332403 + 2283 1 1 0.236369 -12.124980 2.918388 -8.330838 + 2284 1 1 0.236369 -12.312678 1.955488 -8.330410 + 2285 1 1 0.236369 -12.424220 0.982902 -8.327493 + 2286 1 1 0.236369 -12.471566 0.007930 -8.326779 + 2287 1 1 0.236369 -12.433057 -0.970390 -8.323677 + 2288 1 1 0.236369 -12.318286 -1.943536 -8.323621 + 2289 1 1 0.236369 -12.120626 -2.903648 -8.325978 + 2290 1 1 0.236369 -11.855633 -3.849061 -8.330803 + 2291 1 1 0.236369 -11.521526 -4.767293 -8.324013 + 2292 1 1 0.236369 -11.104710 -5.655882 -8.329443 + 2293 1 1 0.236369 -10.627987 -6.515645 -8.331387 + 2294 1 1 0.236369 -10.089394 -7.328427 -8.327262 + 2295 1 1 0.236369 -9.483124 -8.093788 -8.333405 + 2296 1 1 0.236369 -8.817707 -8.816017 -8.333120 + 2297 1 1 0.236369 -8.092056 -9.476147 -8.331751 + 2298 1 1 0.236369 -7.329960 -10.087423 -8.331549 + 2299 1 1 0.236369 -6.514246 -10.633771 -8.326360 + 2300 1 1 0.236369 -5.659753 -11.109707 -8.329125 + 2301 1 1 0.236369 -4.771796 -11.517103 -8.325099 + 2302 1 1 0.236369 -3.845490 -11.851928 -8.329656 + 2303 1 1 0.236369 -2.904559 -12.120549 -8.325178 + 2304 1 1 0.236369 -1.943720 -12.311314 -8.326069 + 2305 1 1 0.236369 -0.972040 -12.428007 -8.327715 + 2306 1 1 0.236369 0.005163 -12.466711 -8.331948 + 2307 1 1 0.236369 0.981809 -12.424840 -8.328265 + 2308 1 1 0.236369 1.957675 -12.314562 -8.328927 + 2309 1 1 0.236369 2.912717 -12.122860 -8.329758 + 2310 1 1 0.236369 3.855552 -11.859536 -8.332621 + 2311 1 1 0.236369 4.773042 -11.515094 -8.330962 + 2312 1 1 0.236369 5.671832 -11.107206 -8.330195 + 2313 1 1 0.236369 6.526329 -10.630592 -8.329802 + 2314 1 1 0.236369 7.332122 -10.083086 -8.332091 + 2315 1 1 0.236369 8.104619 -9.482725 -8.330386 + 2316 1 1 0.236369 8.825634 -8.819001 -8.330741 + 2317 1 1 0.236369 9.486719 -8.093972 -8.325352 + 2318 1 1 0.236369 10.097641 -7.324292 -8.330133 + 2319 1 1 0.236369 10.639747 -6.510825 -8.324833 + 2320 1 1 0.236369 11.116951 -5.653090 -8.330873 + 2321 1 1 0.236369 11.525338 -4.766485 -8.325799 + 2322 1 1 0.236369 11.869156 -3.848818 -8.327461 + 2323 1 1 0.236369 12.136424 -2.908945 -8.333374 + 2324 1 1 0.236369 12.325777 -1.950546 -8.326538 + 2325 1 1 0.236369 12.437665 -0.971226 -8.333396 + 2326 1 1 0.236369 11.909683 0.001643 -9.124583 + 2327 1 1 0.236369 11.862209 0.985523 -9.122642 + 2328 1 1 0.236369 11.743327 1.961319 -9.127103 + 2329 1 1 0.236369 11.545702 2.926822 -9.125108 + 2330 1 1 0.236369 11.258186 3.869434 -9.125561 + 2331 1 1 0.236369 10.900478 4.788177 -9.129147 + 2332 1 1 0.236369 10.475278 5.672613 -9.123575 + 2333 1 1 0.236369 9.963218 6.516723 -9.128545 + 2334 1 1 0.236369 9.394003 7.319010 -9.122178 + 2335 1 1 0.236369 8.761251 8.061659 -9.128437 + 2336 1 1 0.236369 8.061887 8.764641 -9.126058 + 2337 1 1 0.236369 7.315674 9.391460 -9.128085 + 2338 1 1 0.236369 6.516831 9.964939 -9.129048 + 2339 1 1 0.236369 5.668934 10.466090 -9.125969 + 2340 1 1 0.236369 4.786804 10.904693 -9.130345 + 2341 1 1 0.236369 3.871981 11.264557 -9.130050 + 2342 1 1 0.236369 2.923685 11.541878 -9.130477 + 2343 1 1 0.236369 1.964733 11.739550 -9.128313 + 2344 1 1 0.236369 0.983844 11.864678 -9.123295 + 2345 1 1 0.236369 0.005158 11.905977 -9.126286 + 2346 1 1 0.236369 -0.974341 11.861537 -9.122757 + 2347 1 1 0.236369 -1.949517 11.741237 -9.121617 + 2348 1 1 0.236369 -2.916369 11.543314 -9.128155 + 2349 1 1 0.236369 -3.861245 11.261038 -9.129225 + 2350 1 1 0.236369 -4.773771 10.899400 -9.126239 + 2351 1 1 0.236369 -5.654744 10.469805 -9.127891 + 2352 1 1 0.236369 -6.503749 9.966498 -9.122827 + 2353 1 1 0.236369 -7.299574 9.396776 -9.128821 + 2354 1 1 0.236369 -8.057881 8.755529 -9.122984 + 2355 1 1 0.236369 -8.754223 8.065630 -9.125593 + 2356 1 1 0.236369 -9.388035 7.318638 -9.124227 + 2357 1 1 0.236369 -9.958568 6.509916 -9.127986 + 2358 1 1 0.236369 -10.461794 5.671238 -9.131329 + 2359 1 1 0.236369 -10.894863 4.790001 -9.129497 + 2360 1 1 0.236369 -11.248571 3.870110 -9.126348 + 2361 1 1 0.236369 -11.535235 2.928548 -9.131179 + 2362 1 1 0.236369 -11.733975 1.961753 -9.125921 + 2363 1 1 0.236369 -11.856703 0.987309 -9.128660 + 2364 1 1 0.236369 -11.897235 0.000480 -9.124459 + 2365 1 1 0.236369 -11.858599 -0.978865 -9.122608 + 2366 1 1 0.236369 -11.732057 -1.955108 -9.131175 + 2367 1 1 0.236369 -11.533327 -2.918475 -9.128009 + 2368 1 1 0.236369 -11.253957 -3.855854 -9.127207 + 2369 1 1 0.236369 -10.897971 -4.775791 -9.130621 + 2370 1 1 0.236369 -10.463166 -5.655850 -9.130628 + 2371 1 1 0.236369 -9.957024 -6.500945 -9.130698 + 2372 1 1 0.236369 -9.382300 -7.306486 -9.122418 + 2373 1 1 0.236369 -8.754913 -8.059171 -9.121728 + 2374 1 1 0.236369 -8.050807 -8.754786 -9.127508 + 2375 1 1 0.236369 -7.308006 -9.384634 -9.128286 + 2376 1 1 0.236369 -6.500510 -9.958289 -9.125888 + 2377 1 1 0.236369 -5.655912 -10.456946 -9.123501 + 2378 1 1 0.236369 -4.771117 -10.893804 -9.123438 + 2379 1 1 0.236369 -3.862648 -11.253968 -9.122789 + 2380 1 1 0.236369 -2.916304 -11.530754 -9.123442 + 2381 1 1 0.236369 -1.954675 -11.728625 -9.131358 + 2382 1 1 0.236369 -0.980983 -11.853045 -9.122222 + 2383 1 1 0.236369 0.005752 -11.896354 -9.131242 + 2384 1 1 0.236369 0.988781 -11.857065 -9.131127 + 2385 1 1 0.236369 1.960869 -11.729516 -9.124307 + 2386 1 1 0.236369 2.926550 -11.526704 -9.126037 + 2387 1 1 0.236369 3.873913 -11.251739 -9.126176 + 2388 1 1 0.236369 4.785195 -10.897305 -9.126399 + 2389 1 1 0.236369 5.670866 -10.464186 -9.130765 + 2390 1 1 0.236369 6.512961 -9.956775 -9.129121 + 2391 1 1 0.236369 7.309663 -9.389150 -9.130251 + 2392 1 1 0.236369 8.062782 -8.752421 -9.121524 + 2393 1 1 0.236369 8.763350 -8.055237 -9.130716 + 2394 1 1 0.236369 9.394474 -7.305846 -9.130821 + 2395 1 1 0.236369 9.963365 -6.505666 -9.124806 + 2396 1 1 0.236369 10.471113 -5.659318 -9.127981 + 2397 1 1 0.236369 10.901646 -4.777937 -9.130136 + 2398 1 1 0.236369 11.262904 -3.863744 -9.125050 + 2399 1 1 0.236369 11.541401 -2.914766 -9.123957 + 2400 1 1 0.236369 11.746041 -1.957137 -9.123369 + 2401 1 1 0.236369 11.867824 -0.974692 -9.128731 + 2402 1 1 0.236369 11.279492 0.004086 -9.885847 + 2403 1 1 0.236369 11.235919 0.986181 -9.886169 + 2404 1 1 0.236369 11.114475 1.965794 -9.884106 + 2405 1 1 0.236369 10.899701 2.926320 -9.882486 + 2406 1 1 0.236369 10.597636 3.858905 -9.880776 + 2407 1 1 0.236369 10.229934 4.767294 -9.888873 + 2408 1 1 0.236369 9.771839 5.640539 -9.887630 + 2409 1 1 0.236369 9.243512 6.474838 -9.886404 + 2410 1 1 0.236369 8.645205 7.257519 -9.880250 + 2411 1 1 0.236369 7.982070 7.979566 -9.886778 + 2412 1 1 0.236369 7.257653 8.640798 -9.881192 + 2413 1 1 0.236369 6.472393 9.245210 -9.887812 + 2414 1 1 0.236369 5.639645 9.775756 -9.887987 + 2415 1 1 0.236369 4.773457 10.223159 -9.880276 + 2416 1 1 0.236369 3.860485 10.606184 -9.880676 + 2417 1 1 0.236369 2.927254 10.895441 -9.883805 + 2418 1 1 0.236369 1.962051 11.114632 -9.885146 + 2419 1 1 0.236369 0.991190 11.243275 -9.886606 + 2420 1 1 0.236369 0.001765 11.282831 -9.882503 + 2421 1 1 0.236369 -0.981612 11.239456 -9.882344 + 2422 1 1 0.236369 -1.949535 11.115164 -9.889898 + 2423 1 1 0.236369 -2.918416 10.893973 -9.889663 + 2424 1 1 0.236369 -3.850298 10.602569 -9.886953 + 2425 1 1 0.236369 -4.758781 10.227182 -9.882190 + 2426 1 1 0.236369 -5.634427 9.774021 -9.883885 + 2427 1 1 0.236369 -6.464766 9.240367 -9.880359 + 2428 1 1 0.236369 -7.239303 8.639359 -9.888605 + 2429 1 1 0.236369 -7.970475 7.975855 -9.884020 + 2430 1 1 0.236369 -8.634739 7.256795 -9.887100 + 2431 1 1 0.236369 -9.236499 6.478262 -9.889336 + 2432 1 1 0.236369 -9.763425 5.642667 -9.881419 + 2433 1 1 0.236369 -10.217833 4.776053 -9.884280 + 2434 1 1 0.236369 -10.588530 3.860429 -9.887156 + 2435 1 1 0.236369 -10.890852 2.920229 -9.888507 + 2436 1 1 0.236369 -11.103158 1.962182 -9.886788 + 2437 1 1 0.236369 -11.230594 0.988534 -9.889513 + 2438 1 1 0.236369 -11.270517 0.006338 -9.883652 + 2439 1 1 0.236369 -11.233246 -0.977491 -9.887744 + 2440 1 1 0.236369 -11.097552 -1.955184 -9.882608 + 2441 1 1 0.236369 -10.892491 -2.917264 -9.887197 + 2442 1 1 0.236369 -10.592857 -3.855639 -9.885999 + 2443 1 1 0.236369 -10.220670 -4.764749 -9.889629 + 2444 1 1 0.236369 -9.759154 -5.631701 -9.889879 + 2445 1 1 0.236369 -9.231066 -6.463915 -9.888321 + 2446 1 1 0.236369 -8.636995 -7.247967 -9.887478 + 2447 1 1 0.236369 -7.967666 -7.967457 -9.889525 + 2448 1 1 0.236369 -7.243527 -8.637341 -9.886852 + 2449 1 1 0.236369 -6.460057 -9.230030 -9.889688 + 2450 1 1 0.236369 -5.633213 -9.761546 -9.889174 + 2451 1 1 0.236369 -4.757101 -10.215490 -9.889469 + 2452 1 1 0.236369 -3.852970 -10.595396 -9.881142 + 2453 1 1 0.236369 -2.915276 -10.885476 -9.887069 + 2454 1 1 0.236369 -1.953444 -11.101000 -9.884270 + 2455 1 1 0.236369 -0.980348 -11.228972 -9.886411 + 2456 1 1 0.236369 0.009292 -11.273377 -9.880672 + 2457 1 1 0.236369 0.987575 -11.227471 -9.882763 + 2458 1 1 0.236369 1.960874 -11.105534 -9.881316 + 2459 1 1 0.236369 2.923169 -10.887374 -9.884198 + 2460 1 1 0.236369 3.864191 -10.588855 -9.883291 + 2461 1 1 0.236369 4.770142 -10.216486 -9.886276 + 2462 1 1 0.236369 5.640617 -9.760160 -9.887954 + 2463 1 1 0.236369 6.477126 -9.235032 -9.888875 + 2464 1 1 0.236369 7.254942 -8.633066 -9.888462 + 2465 1 1 0.236369 7.978201 -7.971676 -9.880801 + 2466 1 1 0.236369 8.641358 -7.241104 -9.889842 + 2467 1 1 0.236369 9.240257 -6.460602 -9.881392 + 2468 1 1 0.236369 9.771908 -5.629258 -9.884964 + 2469 1 1 0.236369 10.225308 -4.761675 -9.882105 + 2470 1 1 0.236369 10.604888 -3.852597 -9.885711 + 2471 1 1 0.236369 10.894027 -2.912859 -9.886722 + 2472 1 1 0.236369 11.114738 -1.949908 -9.882616 + 2473 1 1 0.236369 11.241481 -0.982595 -9.886585 + 2474 1 1 0.236369 10.607968 0.001873 -10.601036 + 2475 1 1 0.236369 10.569940 0.988090 -10.597715 + 2476 1 1 0.236369 10.428003 1.958437 -10.598200 + 2477 1 1 0.236369 10.207775 2.907164 -10.604161 + 2478 1 1 0.236369 9.895792 3.839655 -10.602246 + 2479 1 1 0.236369 9.496264 4.737058 -10.598316 + 2480 1 1 0.236369 9.017971 5.590383 -10.605075 + 2481 1 1 0.236369 8.471966 6.395629 -10.599022 + 2482 1 1 0.236369 7.846021 7.149678 -10.597837 + 2483 1 1 0.236369 7.149832 7.842761 -10.601580 + 2484 1 1 0.236369 6.392474 8.471037 -10.600899 + 2485 1 1 0.236369 5.589514 9.022565 -10.598087 + 2486 1 1 0.236369 4.729511 9.504173 -10.596755 + 2487 1 1 0.236369 3.838833 9.893909 -10.598700 + 2488 1 1 0.236369 2.907977 10.205092 -10.603095 + 2489 1 1 0.236369 1.951489 10.434963 -10.601583 + 2490 1 1 0.236369 0.987824 10.566810 -10.604050 + 2491 1 1 0.236369 0.007582 10.614095 -10.601503 + 2492 1 1 0.236369 -0.969783 10.562605 -10.605816 + 2493 1 1 0.236369 -1.948270 10.430537 -10.606043 + 2494 1 1 0.236369 -2.900799 10.202449 -10.600252 + 2495 1 1 0.236369 -3.824176 9.896995 -10.600433 + 2496 1 1 0.236369 -4.720802 9.501677 -10.605787 + 2497 1 1 0.236369 -5.575886 9.027104 -10.600507 + 2498 1 1 0.236369 -6.386887 8.470852 -10.601155 + 2499 1 1 0.236369 -7.141366 7.845274 -10.598043 + 2500 1 1 0.236369 -7.832261 7.154159 -10.600175 + 2501 1 1 0.236369 -8.455693 6.396585 -10.603885 + 2502 1 1 0.236369 -9.011207 5.588241 -10.605534 + 2503 1 1 0.236369 -9.489405 4.735830 -10.605997 + 2504 1 1 0.236369 -9.887373 3.839794 -10.600383 + 2505 1 1 0.236369 -10.194662 2.904539 -10.599611 + 2506 1 1 0.236369 -10.422188 1.949215 -10.603852 + 2507 1 1 0.236369 -10.555679 0.979222 -10.602382 + 2508 1 1 0.236369 -10.597723 0.001429 -10.602943 + 2509 1 1 0.236369 -10.552926 -0.976940 -10.605780 + 2510 1 1 0.236369 -10.417016 -1.942700 -10.605904 + 2511 1 1 0.236369 -10.192311 -2.902339 -10.605393 + 2512 1 1 0.236369 -9.882207 -3.826823 -10.599823 + 2513 1 1 0.236369 -9.494627 -4.720985 -10.604412 + 2514 1 1 0.236369 -9.017884 -5.582508 -10.604229 + 2515 1 1 0.236369 -8.463376 -6.389545 -10.606515 + 2516 1 1 0.236369 -7.835766 -7.142731 -10.599331 + 2517 1 1 0.236369 -7.145393 -7.836646 -10.600991 + 2518 1 1 0.236369 -6.387665 -8.461014 -10.601082 + 2519 1 1 0.236369 -5.580246 -9.009903 -10.599179 + 2520 1 1 0.236369 -4.722356 -9.491644 -10.598355 + 2521 1 1 0.236369 -3.822285 -9.882605 -10.602668 + 2522 1 1 0.236369 -2.899649 -10.196174 -10.605242 + 2523 1 1 0.236369 -1.945577 -10.420457 -10.604644 + 2524 1 1 0.236369 -0.970059 -10.554049 -10.599399 + 2525 1 1 0.236369 0.003405 -10.598865 -10.599905 + 2526 1 1 0.236369 0.980035 -10.552347 -10.606003 + 2527 1 1 0.236369 1.954036 -10.424622 -10.602759 + 2528 1 1 0.236369 2.911201 -10.193761 -10.601689 + 2529 1 1 0.236369 3.835390 -9.888467 -10.598860 + 2530 1 1 0.236369 4.734726 -9.494351 -10.605124 + 2531 1 1 0.236369 5.589935 -9.016641 -10.601746 + 2532 1 1 0.236369 6.396409 -8.462914 -10.605883 + 2533 1 1 0.236369 7.150358 -7.837090 -10.598727 + 2534 1 1 0.236369 7.847870 -7.136269 -10.602664 + 2535 1 1 0.236369 8.465086 -6.389173 -10.604240 + 2536 1 1 0.236369 9.020713 -5.574229 -10.605796 + 2537 1 1 0.236369 9.499111 -4.721388 -10.605812 + 2538 1 1 0.236369 9.896237 -3.822821 -10.597327 + 2539 1 1 0.236369 10.210478 -2.898964 -10.604555 + 2540 1 1 0.236369 10.430695 -1.946596 -10.597036 + 2541 1 1 0.236369 10.565730 -0.976781 -10.603204 + 2542 1 1 0.236369 9.897649 0.005456 -11.267997 + 2543 1 1 0.236369 9.845720 0.987296 -11.274166 + 2544 1 1 0.236369 9.702698 1.962761 -11.276963 + 2545 1 1 0.236369 9.455459 2.915339 -11.271472 + 2546 1 1 0.236369 9.118553 3.847568 -11.272041 + 2547 1 1 0.236369 8.690650 4.739647 -11.268533 + 2548 1 1 0.236369 8.173951 5.579839 -11.275585 + 2549 1 1 0.236369 7.577178 6.357369 -11.269720 + 2550 1 1 0.236369 6.906367 7.086397 -11.274120 + 2551 1 1 0.236369 6.175315 7.736053 -11.267876 + 2552 1 1 0.236369 5.368216 8.309154 -11.269237 + 2553 1 1 0.236369 4.520625 8.806407 -11.270479 + 2554 1 1 0.236369 3.620408 9.210680 -11.275448 + 2555 1 1 0.236369 2.687391 9.525705 -11.277443 + 2556 1 1 0.236369 1.726793 9.748794 -11.275497 + 2557 1 1 0.236369 0.740492 9.864026 -11.272232 + 2558 1 1 0.236369 -0.242630 9.891460 -11.276513 + 2559 1 1 0.236369 -1.219977 9.814022 -11.269059 + 2560 1 1 0.236369 -2.194326 9.646030 -11.268489 + 2561 1 1 0.236369 -3.140929 9.382403 -11.274260 + 2562 1 1 0.236369 -4.062884 9.015915 -11.272906 + 2563 1 1 0.236369 -4.944953 8.571825 -11.277568 + 2564 1 1 0.236369 -5.767105 8.033183 -11.274488 + 2565 1 1 0.236369 -6.541886 7.421462 -11.272745 + 2566 1 1 0.236369 -7.244746 6.728554 -11.274975 + 2567 1 1 0.236369 -7.876540 5.976102 -11.270766 + 2568 1 1 0.236369 -8.433132 5.157219 -11.268485 + 2569 1 1 0.236369 -8.904867 4.293482 -11.271892 + 2570 1 1 0.236369 -9.289402 3.385280 -11.274944 + 2571 1 1 0.236369 -9.581914 2.445591 -11.268312 + 2572 1 1 0.236369 -9.775432 1.476207 -11.276955 + 2573 1 1 0.236369 -9.877791 0.496446 -11.271334 + 2574 1 1 0.236369 -9.871805 -0.485507 -11.268114 + 2575 1 1 0.236369 -9.770142 -1.469920 -11.272433 + 2576 1 1 0.236369 -9.583401 -2.439919 -11.268030 + 2577 1 1 0.236369 -9.293380 -3.378743 -11.274877 + 2578 1 1 0.236369 -8.901888 -4.286447 -11.272327 + 2579 1 1 0.236369 -8.436737 -5.148839 -11.268485 + 2580 1 1 0.236369 -7.883701 -5.968702 -11.275450 + 2581 1 1 0.236369 -7.241871 -6.718818 -11.269329 + 2582 1 1 0.236369 -6.542792 -7.409820 -11.276214 + 2583 1 1 0.236369 -5.764536 -8.029675 -11.273220 + 2584 1 1 0.236369 -4.944140 -8.562553 -11.268844 + 2585 1 1 0.236369 -4.064181 -9.009073 -11.270554 + 2586 1 1 0.236369 -3.143958 -9.370382 -11.272627 + 2587 1 1 0.236369 -2.194922 -9.640233 -11.271501 + 2588 1 1 0.236369 -1.223106 -9.811041 -11.276819 + 2589 1 1 0.236369 -0.240089 -9.879311 -11.275183 + 2590 1 1 0.236369 0.743428 -9.856359 -11.277339 + 2591 1 1 0.236369 1.718811 -9.738492 -11.269132 + 2592 1 1 0.236369 2.686182 -9.513373 -11.277448 + 2593 1 1 0.236369 3.615709 -9.202501 -11.272093 + 2594 1 1 0.236369 4.518513 -8.796375 -11.276400 + 2595 1 1 0.236369 5.374458 -8.300941 -11.271718 + 2596 1 1 0.236369 6.167275 -7.728448 -11.271375 + 2597 1 1 0.236369 6.915414 -7.079913 -11.270127 + 2598 1 1 0.236369 7.576638 -6.356543 -11.274498 + 2599 1 1 0.236369 8.180010 -5.565430 -11.268432 + 2600 1 1 0.236369 8.694133 -4.725561 -11.269774 + 2601 1 1 0.236369 9.114071 -3.832427 -11.276587 + 2602 1 1 0.236369 9.456253 -2.914235 -11.274786 + 2603 1 1 0.236369 9.703521 -1.955948 -11.268522 + 2604 1 1 0.236369 9.844255 -0.979285 -11.276486 + 2605 1 1 0.236369 9.139486 0.001117 -11.892402 + 2606 1 1 0.236369 9.085704 0.979655 -11.899277 + 2607 1 1 0.236369 8.932978 1.936557 -11.892621 + 2608 1 1 0.236369 8.677342 2.877021 -11.893680 + 2609 1 1 0.236369 8.315886 3.779520 -11.892569 + 2610 1 1 0.236369 7.870045 4.635853 -11.890980 + 2611 1 1 0.236369 7.336433 5.448846 -11.898531 + 2612 1 1 0.236369 6.714429 6.195070 -11.900096 + 2613 1 1 0.236369 6.022873 6.878335 -11.891964 + 2614 1 1 0.236369 5.256111 7.472875 -11.895568 + 2615 1 1 0.236369 4.430317 7.994570 -11.899214 + 2616 1 1 0.236369 3.553507 8.417662 -11.899410 + 2617 1 1 0.236369 2.638729 8.745680 -11.899149 + 2618 1 1 0.236369 1.700815 8.978466 -11.898620 + 2619 1 1 0.236369 0.733029 9.109381 -11.890575 + 2620 1 1 0.236369 -0.234923 9.136321 -11.897440 + 2621 1 1 0.236369 -1.210989 9.053792 -11.894310 + 2622 1 1 0.236369 -2.158534 8.873649 -11.891778 + 2623 1 1 0.236369 -3.097457 8.593380 -11.897852 + 2624 1 1 0.236369 -3.984246 8.218661 -11.893028 + 2625 1 1 0.236369 -4.834497 7.749631 -11.896292 + 2626 1 1 0.236369 -5.633636 7.189952 -11.897194 + 2627 1 1 0.236369 -6.369165 6.551027 -11.893762 + 2628 1 1 0.236369 -7.027901 5.836789 -11.896382 + 2629 1 1 0.236369 -7.602280 5.049578 -11.899107 + 2630 1 1 0.236369 -8.094472 4.218932 -11.890515 + 2631 1 1 0.236369 -8.504075 3.334900 -11.895118 + 2632 1 1 0.236369 -8.802124 2.410202 -11.895222 + 2633 1 1 0.236369 -9.005592 1.461226 -11.897050 + 2634 1 1 0.236369 -9.115051 0.486668 -11.898327 + 2635 1 1 0.236369 -9.112097 -0.479526 -11.891671 + 2636 1 1 0.236369 -9.011733 -1.449235 -11.897621 + 2637 1 1 0.236369 -8.807537 -2.396097 -11.894913 + 2638 1 1 0.236369 -8.496561 -3.316506 -11.894785 + 2639 1 1 0.236369 -8.095555 -4.206694 -11.890668 + 2640 1 1 0.236369 -7.606552 -5.040183 -11.897604 + 2641 1 1 0.236369 -7.023854 -5.826396 -11.897643 + 2642 1 1 0.236369 -6.366157 -6.537071 -11.897200 + 2643 1 1 0.236369 -5.637957 -7.176059 -11.894727 + 2644 1 1 0.236369 -4.843257 -7.733881 -11.896518 + 2645 1 1 0.236369 -3.988326 -8.208934 -11.897842 + 2646 1 1 0.236369 -3.094950 -8.587294 -11.893538 + 2647 1 1 0.236369 -2.163733 -8.861376 -11.897687 + 2648 1 1 0.236369 -1.209099 -9.044484 -11.890685 + 2649 1 1 0.236369 -0.241374 -9.127254 -11.895324 + 2650 1 1 0.236369 0.732553 -9.096034 -11.896022 + 2651 1 1 0.236369 1.698926 -8.971383 -11.894622 + 2652 1 1 0.236369 2.638205 -8.734854 -11.894170 + 2653 1 1 0.236369 3.557181 -8.404243 -11.892230 + 2654 1 1 0.236369 4.429069 -7.984495 -11.891492 + 2655 1 1 0.236369 5.252959 -7.470913 -11.898700 + 2656 1 1 0.236369 6.014897 -6.864386 -11.899408 + 2657 1 1 0.236369 6.711464 -6.190765 -11.897169 + 2658 1 1 0.236369 7.336062 -5.443158 -11.894227 + 2659 1 1 0.236369 7.869904 -4.633710 -11.896513 + 2660 1 1 0.236369 8.320987 -3.772525 -11.891045 + 2661 1 1 0.236369 8.678798 -2.862448 -11.899730 + 2662 1 1 0.236369 8.932227 -1.926186 -11.890360 + 2663 1 1 0.236369 9.086482 -0.963109 -11.893631 + 2664 1 1 0.236369 8.343147 0.004872 -12.465873 + 2665 1 1 0.236369 8.282814 0.989484 -12.470565 + 2666 1 1 0.236369 8.106482 1.958050 -12.471754 + 2667 1 1 0.236369 7.821517 2.903894 -12.466319 + 2668 1 1 0.236369 7.414601 3.810783 -12.471744 + 2669 1 1 0.236369 6.914584 4.659619 -12.464929 + 2670 1 1 0.236369 6.322627 5.449338 -12.469904 + 2671 1 1 0.236369 5.632729 6.149336 -12.469492 + 2672 1 1 0.236369 4.863044 6.775338 -12.462458 + 2673 1 1 0.236369 4.030184 7.303362 -12.470225 + 2674 1 1 0.236369 3.136149 7.723958 -12.464060 + 2675 1 1 0.236369 2.200419 8.044252 -12.471644 + 2676 1 1 0.236369 1.232553 8.250793 -12.468953 + 2677 1 1 0.236369 0.250780 8.331874 -12.462373 + 2678 1 1 0.236369 -0.739689 8.302191 -12.469374 + 2679 1 1 0.236369 -1.711811 8.155467 -12.470825 + 2680 1 1 0.236369 -2.665652 7.901206 -12.465970 + 2681 1 1 0.236369 -3.574213 7.523700 -12.465591 + 2682 1 1 0.236369 -4.443091 7.049731 -12.463300 + 2683 1 1 0.236369 -5.242408 6.480941 -12.463071 + 2684 1 1 0.236369 -5.975304 5.812392 -12.471512 + 2685 1 1 0.236369 -6.619342 5.059238 -12.464449 + 2686 1 1 0.236369 -7.167290 4.244692 -12.463455 + 2687 1 1 0.236369 -7.616503 3.360829 -12.467227 + 2688 1 1 0.236369 -7.964979 2.440169 -12.471293 + 2689 1 1 0.236369 -8.192884 1.482695 -12.471137 + 2690 1 1 0.236369 -8.311527 0.502683 -12.470042 + 2691 1 1 0.236369 -8.313243 -0.490201 -12.464261 + 2692 1 1 0.236369 -8.192450 -1.469261 -12.467971 + 2693 1 1 0.236369 -7.961974 -2.427076 -12.463774 + 2694 1 1 0.236369 -7.616819 -3.352409 -12.470565 + 2695 1 1 0.236369 -7.169090 -4.233262 -12.464715 + 2696 1 1 0.236369 -6.620166 -5.053159 -12.470545 + 2697 1 1 0.236369 -5.974619 -5.801943 -12.463660 + 2698 1 1 0.236369 -5.241752 -6.470441 -12.466591 + 2699 1 1 0.236369 -4.448497 -7.042373 -12.462433 + 2700 1 1 0.236369 -3.582404 -7.521857 -12.471289 + 2701 1 1 0.236369 -2.664270 -7.890607 -12.462706 + 2702 1 1 0.236369 -1.711104 -8.145647 -12.468450 + 2703 1 1 0.236369 -0.739388 -8.295521 -12.471375 + 2704 1 1 0.236369 0.253531 -8.320752 -12.462385 + 2705 1 1 0.236369 1.239317 -8.241300 -12.465550 + 2706 1 1 0.236369 2.197714 -8.028912 -12.467838 + 2707 1 1 0.236369 3.136357 -7.721653 -12.466080 + 2708 1 1 0.236369 4.026177 -7.294853 -12.468573 + 2709 1 1 0.236369 4.868143 -6.763049 -12.469868 + 2710 1 1 0.236369 5.631095 -6.142749 -12.471666 + 2711 1 1 0.236369 6.315298 -5.435669 -12.470510 + 2712 1 1 0.236369 6.913223 -4.652531 -12.468310 + 2713 1 1 0.236369 7.419455 -3.804012 -12.463276 + 2714 1 1 0.236369 7.820315 -2.898807 -12.467633 + 2715 1 1 0.236369 8.108775 -1.955769 -12.465666 + 2716 1 1 0.236369 8.283395 -0.982465 -12.468166 + 2717 1 1 0.236369 7.502037 0.001098 -12.982009 + 2718 1 1 0.236369 7.441281 0.987267 -12.982718 + 2719 1 1 0.236369 7.253193 1.950859 -12.989125 + 2720 1 1 0.236369 6.930306 2.872308 -12.989454 + 2721 1 1 0.236369 6.503754 3.757061 -12.983778 + 2722 1 1 0.236369 5.959148 4.566101 -12.986604 + 2723 1 1 0.236369 5.305480 5.309464 -12.989303 + 2724 1 1 0.236369 4.566481 5.956844 -12.984143 + 2725 1 1 0.236369 3.754742 6.495563 -12.984165 + 2726 1 1 0.236369 2.878476 6.929130 -12.981265 + 2727 1 1 0.236369 1.945837 7.245868 -12.984320 + 2728 1 1 0.236369 0.983084 7.444461 -12.985528 + 2729 1 1 0.236369 0.005027 7.502760 -12.984614 + 2730 1 1 0.236369 -0.977692 7.441153 -12.980560 + 2731 1 1 0.236369 -1.939820 7.249666 -12.985195 + 2732 1 1 0.236369 -2.861421 6.934773 -12.986894 + 2733 1 1 0.236369 -3.743970 6.498521 -12.980552 + 2734 1 1 0.236369 -4.563058 5.954284 -12.980461 + 2735 1 1 0.236369 -5.294653 5.307444 -12.981419 + 2736 1 1 0.236369 -5.949569 4.575550 -12.982965 + 2737 1 1 0.236369 -6.490613 3.750577 -12.983734 + 2738 1 1 0.236369 -6.921874 2.874091 -12.983047 + 2739 1 1 0.236369 -7.241054 1.949056 -12.986022 + 2740 1 1 0.236369 -7.431824 0.984888 -12.986385 + 2741 1 1 0.236369 -7.494730 0.003096 -12.988202 + 2742 1 1 0.236369 -7.426894 -0.969928 -12.981565 + 2743 1 1 0.236369 -7.236660 -1.940212 -12.980960 + 2744 1 1 0.236369 -6.928403 -2.866935 -12.980892 + 2745 1 1 0.236369 -6.492403 -3.741130 -12.989317 + 2746 1 1 0.236369 -5.946356 -4.559136 -12.989801 + 2747 1 1 0.236369 -5.294654 -5.296456 -12.988744 + 2748 1 1 0.236369 -4.561511 -5.945411 -12.985106 + 2749 1 1 0.236369 -3.747601 -6.493778 -12.989684 + 2750 1 1 0.236369 -2.864149 -6.919587 -12.990280 + 2751 1 1 0.236369 -1.936349 -7.235617 -12.989464 + 2752 1 1 0.236369 -0.969961 -7.431462 -12.984307 + 2753 1 1 0.236369 0.009347 -7.491650 -12.989820 + 2754 1 1 0.236369 0.987125 -7.432585 -12.983800 + 2755 1 1 0.236369 1.948232 -7.240767 -12.984623 + 2756 1 1 0.236369 2.877558 -6.921148 -12.989643 + 2757 1 1 0.236369 3.758997 -6.494197 -12.987965 + 2758 1 1 0.236369 4.566363 -5.940632 -12.986869 + 2759 1 1 0.236369 5.306660 -5.303286 -12.989114 + 2760 1 1 0.236369 5.950193 -4.562757 -12.982987 + 2761 1 1 0.236369 6.503471 -3.749515 -12.985924 + 2762 1 1 0.236369 6.934171 -2.865698 -12.990205 + 2763 1 1 0.236369 7.248105 -1.933244 -12.983564 + 2764 1 1 0.236369 7.438103 -0.969811 -12.981573 + 2765 1 1 0.236369 6.639679 0.005333 -13.451693 + 2766 1 1 0.236369 6.566526 0.974007 -13.444983 + 2767 1 1 0.236369 6.353722 1.916971 -13.450563 + 2768 1 1 0.236369 6.007892 2.823495 -13.452847 + 2769 1 1 0.236369 5.533700 3.660702 -13.447784 + 2770 1 1 0.236369 4.945163 4.431981 -13.443743 + 2771 1 1 0.236369 4.245036 5.101962 -13.445398 + 2772 1 1 0.236369 3.460520 5.666098 -13.449044 + 2773 1 1 0.236369 2.603707 6.115550 -13.445913 + 2774 1 1 0.236369 1.681580 6.420695 -13.448278 + 2775 1 1 0.236369 0.726807 6.599736 -13.448679 + 2776 1 1 0.236369 -0.236608 6.632160 -13.443668 + 2777 1 1 0.236369 -1.196289 6.529645 -13.447303 + 2778 1 1 0.236369 -2.138610 6.288976 -13.445255 + 2779 1 1 0.236369 -3.033077 5.901508 -13.445943 + 2780 1 1 0.236369 -3.858821 5.405180 -13.451669 + 2781 1 1 0.236369 -4.603952 4.777316 -13.446162 + 2782 1 1 0.236369 -5.243644 4.056591 -13.449155 + 2783 1 1 0.236369 -5.780899 3.253425 -13.451813 + 2784 1 1 0.236369 -6.189889 2.371269 -13.446682 + 2785 1 1 0.236369 -6.468617 1.443317 -13.448116 + 2786 1 1 0.236369 -6.610918 0.490867 -13.452451 + 2787 1 1 0.236369 -6.610345 -0.484001 -13.447856 + 2788 1 1 0.236369 -6.466832 -1.432652 -13.449946 + 2789 1 1 0.236369 -6.189948 -2.364594 -13.444542 + 2790 1 1 0.236369 -5.776710 -3.243221 -13.453001 + 2791 1 1 0.236369 -5.246374 -4.047661 -13.451065 + 2792 1 1 0.236369 -4.603304 -4.766603 -13.444285 + 2793 1 1 0.236369 -3.859563 -5.391810 -13.450911 + 2794 1 1 0.236369 -3.026354 -5.893261 -13.449914 + 2795 1 1 0.236369 -2.139015 -6.272973 -13.449651 + 2796 1 1 0.236369 -1.198327 -6.516220 -13.445090 + 2797 1 1 0.236369 -0.235775 -6.623986 -13.447380 + 2798 1 1 0.236369 0.730915 -6.590769 -13.444959 + 2799 1 1 0.236369 1.685195 -6.410100 -13.452229 + 2800 1 1 0.236369 2.599766 -6.103623 -13.451170 + 2801 1 1 0.236369 3.460970 -5.655049 -13.446796 + 2802 1 1 0.236369 4.248781 -5.089490 -13.452452 + 2803 1 1 0.236369 4.950424 -4.424400 -13.445661 + 2804 1 1 0.236369 5.536910 -3.653506 -13.447057 + 2805 1 1 0.236369 6.008214 -2.809340 -13.445107 + 2806 1 1 0.236369 6.355443 -1.907196 -13.451485 + 2807 1 1 0.236369 6.570480 -0.960984 -13.445712 + 2808 1 1 0.236369 5.748644 0.009491 -13.850623 + 2809 1 1 0.236369 5.667385 0.979639 -13.849380 + 2810 1 1 0.236369 5.414505 1.919635 -13.853901 + 2811 1 1 0.236369 5.018924 2.803338 -13.856318 + 2812 1 1 0.236369 4.471962 3.606542 -13.855163 + 2813 1 1 0.236369 3.796469 4.314877 -13.854985 + 2814 1 1 0.236369 3.014756 4.893639 -13.853773 + 2815 1 1 0.236369 2.145246 5.329868 -13.854574 + 2816 1 1 0.236369 1.215866 5.620215 -13.851937 + 2817 1 1 0.236369 0.251060 5.741325 -13.848805 + 2818 1 1 0.236369 -0.726095 5.699998 -13.855324 + 2819 1 1 0.236369 -1.679980 5.491595 -13.855747 + 2820 1 1 0.236369 -2.576023 5.126366 -13.848984 + 2821 1 1 0.236369 -3.409448 4.618083 -13.848931 + 2822 1 1 0.236369 -4.136456 3.974251 -13.855094 + 2823 1 1 0.236369 -4.754060 3.217855 -13.857428 + 2824 1 1 0.236369 -5.229587 2.372902 -13.850384 + 2825 1 1 0.236369 -5.545979 1.448021 -13.856886 + 2826 1 1 0.236369 -5.710809 0.488386 -13.853578 + 2827 1 1 0.236369 -5.709574 -0.481721 -13.853791 + 2828 1 1 0.236369 -5.546388 -1.440384 -13.852143 + 2829 1 1 0.236369 -5.230312 -2.362803 -13.856923 + 2830 1 1 0.236369 -4.750407 -3.208042 -13.852203 + 2831 1 1 0.236369 -4.134233 -3.963464 -13.856872 + 2832 1 1 0.236369 -3.408234 -4.607323 -13.857040 + 2833 1 1 0.236369 -2.575548 -5.122973 -13.853782 + 2834 1 1 0.236369 -1.680174 -5.485491 -13.855482 + 2835 1 1 0.236369 -0.719239 -5.691926 -13.848752 + 2836 1 1 0.236369 0.252850 -5.730605 -13.853027 + 2837 1 1 0.236369 1.214995 -5.608146 -13.853740 + 2838 1 1 0.236369 2.144605 -5.323518 -13.855107 + 2839 1 1 0.236369 3.013034 -4.878674 -13.853497 + 2840 1 1 0.236369 3.799646 -4.305051 -13.850399 + 2841 1 1 0.236369 4.466257 -3.602347 -13.856505 + 2842 1 1 0.236369 5.015061 -2.793563 -13.857968 + 2843 1 1 0.236369 5.421581 -1.911621 -13.851106 + 2844 1 1 0.236369 5.663148 -0.968055 -13.852141 + 2845 1 1 0.236369 4.826331 0.007236 -14.199815 + 2846 1 1 0.236369 4.727859 0.976331 -14.194804 + 2847 1 1 0.236369 4.433929 1.903425 -14.199180 + 2848 1 1 0.236369 3.966895 2.762857 -14.194790 + 2849 1 1 0.236369 3.331737 3.498892 -14.198983 + 2850 1 1 0.236369 2.555584 4.097264 -14.194676 + 2851 1 1 0.236369 1.684490 4.526738 -14.196915 + 2852 1 1 0.236369 0.734681 4.767842 -14.197006 + 2853 1 1 0.236369 -0.239949 4.816220 -14.203906 + 2854 1 1 0.236369 -1.206412 4.672314 -14.198550 + 2855 1 1 0.236369 -2.121468 4.329153 -14.199822 + 2856 1 1 0.236369 -2.942998 3.817148 -14.197671 + 2857 1 1 0.236369 -3.651156 3.146231 -14.198517 + 2858 1 1 0.236369 -4.210445 2.346316 -14.201792 + 2859 1 1 0.236369 -4.592179 1.443749 -14.198431 + 2860 1 1 0.236369 -4.791735 0.494891 -14.195324 + 2861 1 1 0.236369 -4.791334 -0.486099 -14.203903 + 2862 1 1 0.236369 -4.598337 -1.437473 -14.202701 + 2863 1 1 0.236369 -4.209864 -2.333847 -14.196201 + 2864 1 1 0.236369 -3.656994 -3.132929 -14.203748 + 2865 1 1 0.236369 -2.950803 -3.812235 -14.202526 + 2866 1 1 0.236369 -2.116568 -4.320300 -14.200748 + 2867 1 1 0.236369 -1.202459 -4.663830 -14.194904 + 2868 1 1 0.236369 -0.242013 -4.811407 -14.197810 + 2869 1 1 0.236369 0.734186 -4.762737 -14.203793 + 2870 1 1 0.236369 1.680863 -4.515904 -14.200838 + 2871 1 1 0.236369 2.556002 -4.088862 -14.202024 + 2872 1 1 0.236369 3.323193 -3.490994 -14.201197 + 2873 1 1 0.236369 3.959078 -2.750932 -14.203685 + 2874 1 1 0.236369 4.430850 -1.895121 -14.195646 + 2875 1 1 0.236369 4.727075 -0.963935 -14.196309 + 2876 1 1 0.236369 3.887171 0.009921 -14.481676 + 2877 1 1 0.236369 3.761915 0.974929 -14.480660 + 2878 1 1 0.236369 3.408741 1.873809 -14.481242 + 2879 1 1 0.236369 2.830244 2.659537 -14.487682 + 2880 1 1 0.236369 2.081429 3.287118 -14.485044 + 2881 1 1 0.236369 1.209214 3.695160 -14.488608 + 2882 1 1 0.236369 0.253529 3.880133 -14.488874 + 2883 1 1 0.236369 -0.727159 3.822713 -14.488817 + 2884 1 1 0.236369 -1.648058 3.513698 -14.487210 + 2885 1 1 0.236369 -2.466035 2.993929 -14.487383 + 2886 1 1 0.236369 -3.138406 2.286221 -14.483732 + 2887 1 1 0.236369 -3.601315 1.434942 -14.484699 + 2888 1 1 0.236369 -3.843537 0.495575 -14.482949 + 2889 1 1 0.236369 -3.845383 -0.484397 -14.486118 + 2890 1 1 0.236369 -3.609636 -1.419494 -14.482959 + 2891 1 1 0.236369 -3.137038 -2.277610 -14.483036 + 2892 1 1 0.236369 -2.465618 -2.983504 -14.487671 + 2893 1 1 0.236369 -1.646193 -3.507545 -14.488101 + 2894 1 1 0.236369 -0.723680 -3.810207 -14.488567 + 2895 1 1 0.236369 0.250090 -3.870309 -14.487206 + 2896 1 1 0.236369 1.202125 -3.685094 -14.483646 + 2897 1 1 0.236369 2.085947 -3.268760 -14.480474 + 2898 1 1 0.236369 2.839882 -2.648707 -14.485823 + 2899 1 1 0.236369 3.410570 -1.868958 -14.486976 + 2900 1 1 0.236369 3.763151 -0.964286 -14.488236 + 2901 1 1 0.236369 2.933179 0.008935 -14.702319 + 2902 1 1 0.236369 2.771378 0.956717 -14.709332 + 2903 1 1 0.236369 2.319174 1.797807 -14.705525 + 2904 1 1 0.236369 1.601404 2.454893 -14.709712 + 2905 1 1 0.236369 0.720881 2.845754 -14.709362 + 2906 1 1 0.236369 -0.233543 2.920217 -14.704345 + 2907 1 1 0.236369 -1.174659 2.682798 -14.710219 + 2908 1 1 0.236369 -1.976654 2.155330 -14.703547 + 2909 1 1 0.236369 -2.565646 1.394800 -14.710839 + 2910 1 1 0.236369 -2.879055 0.485465 -14.701981 + 2911 1 1 0.236369 -2.885027 -0.475714 -14.705247 + 2912 1 1 0.236369 -2.569273 -1.390107 -14.708938 + 2913 1 1 0.236369 -1.978462 -2.146765 -14.703107 + 2914 1 1 0.236369 -1.170718 -2.671832 -14.711478 + 2915 1 1 0.236369 -0.235782 -2.915320 -14.704170 + 2916 1 1 0.236369 0.719836 -2.829517 -14.702817 + 2917 1 1 0.236369 1.609618 -2.443360 -14.705590 + 2918 1 1 0.236369 2.315707 -1.792658 -14.704572 + 2919 1 1 0.236369 2.769426 -0.940857 -14.707141 + 2920 1 1 0.236369 1.963552 0.000964 -14.864084 + 2921 1 1 0.236369 1.742944 0.915869 -14.871602 + 2922 1 1 0.236369 1.120041 1.613650 -14.869738 + 2923 1 1 0.236369 0.242855 1.943941 -14.870758 + 2924 1 1 0.236369 -0.689616 1.836460 -14.869994 + 2925 1 1 0.236369 -1.462901 1.306745 -14.862250 + 2926 1 1 0.236369 -1.895307 0.474123 -14.863179 + 2927 1 1 0.236369 -1.898512 -0.460156 -14.870300 + 2928 1 1 0.236369 -1.462311 -1.296274 -14.865066 + 2929 1 1 0.236369 -0.685170 -1.824449 -14.871288 + 2930 1 1 0.236369 0.244850 -1.941877 -14.870191 + 2931 1 1 0.236369 1.120156 -1.608419 -14.869825 + 2932 1 1 0.236369 1.742886 -0.909693 -14.865219 + 2933 1 1 0.236369 0.982835 0.007015 -14.959318 + 2934 1 1 0.236369 0.495699 0.859132 -14.959350 + 2935 1 1 0.236369 -0.484253 0.857102 -14.962943 + 2936 1 1 0.236369 -0.971915 0.007567 -14.960075 + 2937 1 1 0.236369 -0.483884 -0.844191 -14.965137 + 2938 1 1 0.236369 0.494415 -0.846791 -14.958210 + +Ellipsoids + + 1 1.000000 1.000000 1.010000 0.707299 0.000000 -0.706915 0.000349 + 2 1.000000 1.000000 1.010000 0.707320 -0.000000 0.706893 0.000385 + 3 1.000000 1.000000 1.010000 0.729879 0.000000 -0.683577 0.000274 + 4 1.000000 1.000000 1.010000 0.718785 0.000000 -0.694113 0.039433 + 5 1.000000 1.000000 1.010000 0.695605 0.000000 -0.717246 0.041140 + 6 1.000000 1.000000 1.010000 0.683619 0.000000 -0.729839 0.000026 + 7 1.000000 1.000000 1.010000 0.695519 0.000000 -0.717368 -0.040455 + 8 1.000000 1.000000 1.010000 0.718701 0.000000 -0.694205 -0.039346 + 9 1.000000 1.000000 1.010000 0.752038 0.000000 -0.659120 0.000168 + 10 1.000000 1.000000 1.010000 0.747043 0.000000 -0.663515 0.040936 + 11 1.000000 1.000000 1.010000 0.732875 0.000000 -0.676397 0.073357 + 12 1.000000 1.000000 1.010000 0.712871 0.000000 -0.695336 0.091233 + 13 1.000000 1.000000 1.010000 0.690786 0.000000 -0.717605 0.088647 + 14 1.000000 1.000000 1.010000 0.671817 0.000000 -0.737898 0.064572 + 15 1.000000 1.000000 1.010000 0.661004 0.000000 -0.750007 0.023744 + 16 1.000000 1.000000 1.010000 0.660819 0.000000 -0.750177 -0.023507 + 17 1.000000 1.000000 1.010000 0.671782 0.000000 -0.737975 -0.064040 + 18 1.000000 1.000000 1.010000 0.690772 0.000000 -0.717661 -0.088304 + 19 1.000000 1.000000 1.010000 0.712832 0.000000 -0.695464 -0.090556 + 20 1.000000 1.000000 1.010000 0.733068 0.000000 -0.676229 -0.072978 + 21 1.000000 1.000000 1.010000 0.746991 0.000000 -0.663614 -0.040262 + 22 1.000000 1.000000 1.010000 0.773006 0.000000 -0.634398 0.000421 + 23 1.000000 1.000000 1.010000 0.769723 0.000000 -0.637041 0.041284 + 24 1.000000 1.000000 1.010000 0.759777 0.000000 -0.645373 0.078944 + 25 1.000000 1.000000 1.010000 0.744016 0.000000 -0.659026 0.110114 + 26 1.000000 1.000000 1.010000 0.724009 0.000000 -0.677251 0.130927 + 27 1.000000 1.000000 1.010000 0.701566 0.000000 -0.698967 0.138749 + 28 1.000000 1.000000 1.010000 0.678945 0.000000 -0.722307 0.131551 + 29 1.000000 1.000000 1.010000 0.658914 0.000000 -0.744253 0.109176 + 30 1.000000 1.000000 1.010000 0.643642 0.000000 -0.761911 0.072222 + 31 1.000000 1.000000 1.010000 0.635651 0.000000 -0.771555 0.025529 + 32 1.000000 1.000000 1.010000 0.635466 0.000000 -0.771722 -0.025074 + 33 1.000000 1.000000 1.010000 0.643677 0.000000 -0.761908 -0.071950 + 34 1.000000 1.000000 1.010000 0.658747 0.000000 -0.744488 -0.108579 + 35 1.000000 1.000000 1.010000 0.678873 0.000000 -0.722427 -0.131266 + 36 1.000000 1.000000 1.010000 0.701584 0.000000 -0.699065 -0.138159 + 37 1.000000 1.000000 1.010000 0.724000 0.000000 -0.677341 -0.130508 + 38 1.000000 1.000000 1.010000 0.743928 0.000000 -0.659243 -0.109408 + 39 1.000000 1.000000 1.010000 0.759784 0.000000 -0.645381 -0.078811 + 40 1.000000 1.000000 1.010000 0.769569 0.000000 -0.637259 -0.040794 + 41 1.000000 1.000000 1.010000 0.793405 0.000000 -0.608695 0.000285 + 42 1.000000 1.000000 1.010000 0.790849 0.000000 -0.610631 0.041083 + 43 1.000000 1.000000 1.010000 0.783309 0.000000 -0.616519 0.079570 + 44 1.000000 1.000000 1.010000 0.771064 0.000000 -0.626248 0.115209 + 45 1.000000 1.000000 1.010000 0.754568 0.000000 -0.640010 0.144965 + 46 1.000000 1.000000 1.010000 0.734932 0.000000 -0.657096 0.167629 + 47 1.000000 1.000000 1.010000 0.712931 0.000000 -0.677410 0.181231 + 48 1.000000 1.000000 1.010000 0.689903 0.000000 -0.700050 0.184290 + 49 1.000000 1.000000 1.010000 0.667202 0.000000 -0.723821 0.175855 + 50 1.000000 1.000000 1.010000 0.646375 0.000000 -0.747263 0.154267 + 51 1.000000 1.000000 1.010000 0.628846 0.000000 -0.768042 0.121099 + 52 1.000000 1.000000 1.010000 0.616393 0.000000 -0.783606 0.077600 + 53 1.000000 1.000000 1.010000 0.609769 0.000000 -0.792114 0.027147 + 54 1.000000 1.000000 1.010000 0.609688 0.000000 -0.792205 -0.026309 + 55 1.000000 1.000000 1.010000 0.616233 0.000000 -0.783815 -0.076755 + 56 1.000000 1.000000 1.010000 0.628893 0.000000 -0.768052 -0.120790 + 57 1.000000 1.000000 1.010000 0.646419 0.000000 -0.747280 -0.153997 + 58 1.000000 1.000000 1.010000 0.667109 0.000000 -0.724087 -0.175108 + 59 1.000000 1.000000 1.010000 0.689888 0.000000 -0.700081 -0.184229 + 60 1.000000 1.000000 1.010000 0.712880 0.000000 -0.677592 -0.180755 + 61 1.000000 1.000000 1.010000 0.735001 0.000000 -0.657128 -0.167203 + 62 1.000000 1.000000 1.010000 0.754605 0.000000 -0.640083 -0.144444 + 63 1.000000 1.000000 1.010000 0.771030 0.000000 -0.626382 -0.114709 + 64 1.000000 1.000000 1.010000 0.783337 0.000000 -0.616501 -0.079438 + 65 1.000000 1.000000 1.010000 0.790937 0.000000 -0.610572 -0.040255 + 66 1.000000 1.000000 1.010000 0.812989 0.000000 -0.582279 0.000294 + 67 1.000000 1.000000 1.010000 0.810916 0.000000 -0.583790 0.040059 + 68 1.000000 1.000000 1.010000 0.804763 0.000000 -0.588350 0.078746 + 69 1.000000 1.000000 1.010000 0.794938 0.000000 -0.595542 0.115775 + 70 1.000000 1.000000 1.010000 0.781524 0.000000 -0.605754 0.149275 + 71 1.000000 1.000000 1.010000 0.765029 0.000000 -0.618831 0.178265 + 72 1.000000 1.000000 1.010000 0.745587 0.000000 -0.634998 0.202183 + 73 1.000000 1.000000 1.010000 0.724289 0.000000 -0.653568 0.219668 + 74 1.000000 1.000000 1.010000 0.701386 0.000000 -0.674984 0.229027 + 75 1.000000 1.000000 1.010000 0.678258 0.000000 -0.698113 0.229357 + 76 1.000000 1.000000 1.010000 0.655269 0.000000 -0.722617 0.220108 + 77 1.000000 1.000000 1.010000 0.633833 0.000000 -0.747038 0.200473 + 78 1.000000 1.000000 1.010000 0.614944 0.000000 -0.769874 0.170698 + 79 1.000000 1.000000 1.010000 0.599770 0.000000 -0.789498 0.130265 + 80 1.000000 1.000000 1.010000 0.588926 0.000000 -0.804016 0.082001 + 81 1.000000 1.000000 1.010000 0.583339 0.000000 -0.811741 0.028145 + 82 1.000000 1.000000 1.010000 0.583443 0.000000 -0.811677 -0.027826 + 83 1.000000 1.000000 1.010000 0.588935 0.000000 -0.804092 -0.081189 + 84 1.000000 1.000000 1.010000 0.599736 0.000000 -0.789589 -0.129870 + 85 1.000000 1.000000 1.010000 0.615143 0.000000 -0.769874 -0.169979 + 86 1.000000 1.000000 1.010000 0.633837 0.000000 -0.747125 -0.200138 + 87 1.000000 1.000000 1.010000 0.655339 0.000000 -0.722601 -0.219950 + 88 1.000000 1.000000 1.010000 0.678208 0.000000 -0.698202 -0.229235 + 89 1.000000 1.000000 1.010000 0.701418 0.000000 -0.675127 -0.228509 + 90 1.000000 1.000000 1.010000 0.724236 0.000000 -0.653903 -0.218846 + 91 1.000000 1.000000 1.010000 0.745538 0.000000 -0.635172 -0.201816 + 92 1.000000 1.000000 1.010000 0.764855 0.000000 -0.619083 -0.178140 + 93 1.000000 1.000000 1.010000 0.781596 0.000000 -0.605745 -0.148932 + 94 1.000000 1.000000 1.010000 0.795082 0.000000 -0.595446 -0.115278 + 95 1.000000 1.000000 1.010000 0.804921 0.000000 -0.588144 -0.078673 + 96 1.000000 1.000000 1.010000 0.810822 0.000000 -0.583956 -0.039531 + 97 1.000000 1.000000 1.010000 0.831532 0.000000 -0.555476 0.000244 + 98 1.000000 1.000000 1.010000 0.829861 0.000000 -0.556604 0.039032 + 99 1.000000 1.000000 1.010000 0.824833 0.000000 -0.560044 0.077462 + 100 1.000000 1.000000 1.010000 0.816771 0.000000 -0.565538 0.114244 + 101 1.000000 1.000000 1.010000 0.805530 0.000000 -0.573377 0.149534 + 102 1.000000 1.000000 1.010000 0.791569 0.000000 -0.583503 0.181502 + 103 1.000000 1.000000 1.010000 0.774825 0.000000 -0.596148 0.210368 + 104 1.000000 1.000000 1.010000 0.755963 0.000000 -0.610988 0.234977 + 105 1.000000 1.000000 1.010000 0.735085 0.000000 -0.628328 0.254662 + 106 1.000000 1.000000 1.010000 0.712964 0.000000 -0.647890 0.268181 + 107 1.000000 1.000000 1.010000 0.689778 0.000000 -0.669733 0.275071 + 108 1.000000 1.000000 1.010000 0.666501 0.000000 -0.693104 0.274560 + 109 1.000000 1.000000 1.010000 0.643495 0.000000 -0.717916 0.265538 + 110 1.000000 1.000000 1.010000 0.621702 0.000000 -0.743038 0.247751 + 111 1.000000 1.000000 1.010000 0.601694 0.000000 -0.767825 0.220020 + 112 1.000000 1.000000 1.010000 0.584447 0.000000 -0.790345 0.183782 + 113 1.000000 1.000000 1.010000 0.570775 0.000000 -0.809347 0.138465 + 114 1.000000 1.000000 1.010000 0.561366 0.000000 -0.823040 0.086446 + 115 1.000000 1.000000 1.010000 0.556242 0.000000 -0.830497 0.029479 + 116 1.000000 1.000000 1.010000 0.556402 0.000000 -0.830406 -0.029026 + 117 1.000000 1.000000 1.010000 0.561240 0.000000 -0.823198 -0.085761 + 118 1.000000 1.000000 1.010000 0.570926 0.000000 -0.809385 -0.137618 + 119 1.000000 1.000000 1.010000 0.584422 0.000000 -0.790612 -0.182712 + 120 1.000000 1.000000 1.010000 0.601678 0.000000 -0.767891 -0.219835 + 121 1.000000 1.000000 1.010000 0.621515 0.000000 -0.743423 -0.247065 + 122 1.000000 1.000000 1.010000 0.643598 0.000000 -0.717918 -0.265283 + 123 1.000000 1.000000 1.010000 0.666323 0.000000 -0.693415 -0.274205 + 124 1.000000 1.000000 1.010000 0.689898 0.000000 -0.669705 -0.274839 + 125 1.000000 1.000000 1.010000 0.713017 0.000000 -0.647997 -0.267781 + 126 1.000000 1.000000 1.010000 0.735244 0.000000 -0.628342 -0.254172 + 127 1.000000 1.000000 1.010000 0.755866 0.000000 -0.611206 -0.234721 + 128 1.000000 1.000000 1.010000 0.774859 0.000000 -0.596240 -0.209979 + 129 1.000000 1.000000 1.010000 0.791495 0.000000 -0.583712 -0.181151 + 130 1.000000 1.000000 1.010000 0.805641 0.000000 -0.573343 -0.149069 + 131 1.000000 1.000000 1.010000 0.816754 0.000000 -0.565612 -0.113999 + 132 1.000000 1.000000 1.010000 0.825008 0.000000 -0.559856 -0.076968 + 133 1.000000 1.000000 1.010000 0.829828 0.000000 -0.556681 -0.038629 + 134 1.000000 1.000000 1.010000 0.849195 0.000000 -0.528080 0.000121 + 135 1.000000 1.000000 1.010000 0.847812 0.000000 -0.528925 0.038128 + 136 1.000000 1.000000 1.010000 0.843629 0.000000 -0.531544 0.075833 + 137 1.000000 1.000000 1.010000 0.836932 0.000000 -0.535642 0.112395 + 138 1.000000 1.000000 1.010000 0.827335 0.000000 -0.542005 0.147469 + 139 1.000000 1.000000 1.010000 0.815365 0.000000 -0.549850 0.181230 + 140 1.000000 1.000000 1.010000 0.800902 0.000000 -0.559911 0.212262 + 141 1.000000 1.000000 1.010000 0.784500 0.000000 -0.571535 0.240641 + 142 1.000000 1.000000 1.010000 0.765934 0.000000 -0.585495 0.265596 + 143 1.000000 1.000000 1.010000 0.745683 0.000000 -0.601299 0.287047 + 144 1.000000 1.000000 1.010000 0.724123 0.000000 -0.619199 0.303709 + 145 1.000000 1.000000 1.010000 0.701472 0.000000 -0.639311 0.314991 + 146 1.000000 1.000000 1.010000 0.678132 0.000000 -0.661237 0.320784 + 147 1.000000 1.000000 1.010000 0.654747 0.000000 -0.684902 0.319711 + 148 1.000000 1.000000 1.010000 0.631648 0.000000 -0.709838 0.311690 + 149 1.000000 1.000000 1.010000 0.609449 0.000000 -0.735704 0.295485 + 150 1.000000 1.000000 1.010000 0.588765 0.000000 -0.761689 0.270528 + 151 1.000000 1.000000 1.010000 0.570249 0.000000 -0.786485 0.237187 + 152 1.000000 1.000000 1.010000 0.554293 0.000000 -0.809029 0.195526 + 153 1.000000 1.000000 1.010000 0.542054 0.000000 -0.827565 0.145990 + 154 1.000000 1.000000 1.010000 0.533315 0.000000 -0.841078 0.090343 + 155 1.000000 1.000000 1.010000 0.528807 0.000000 -0.848170 0.031146 + 156 1.000000 1.000000 1.010000 0.528785 0.000000 -0.848211 -0.030411 + 157 1.000000 1.000000 1.010000 0.533201 0.000000 -0.841228 -0.089622 + 158 1.000000 1.000000 1.010000 0.541941 0.000000 -0.827675 -0.145785 + 159 1.000000 1.000000 1.010000 0.554305 0.000000 -0.809129 -0.195078 + 160 1.000000 1.000000 1.010000 0.570095 0.000000 -0.786763 -0.236634 + 161 1.000000 1.000000 1.010000 0.588840 0.000000 -0.761795 -0.270066 + 162 1.000000 1.000000 1.010000 0.609471 0.000000 -0.735877 -0.295009 + 163 1.000000 1.000000 1.010000 0.631631 0.000000 -0.710204 -0.310889 + 164 1.000000 1.000000 1.010000 0.654767 0.000000 -0.685014 -0.319432 + 165 1.000000 1.000000 1.010000 0.678143 0.000000 -0.661391 -0.320444 + 166 1.000000 1.000000 1.010000 0.701405 0.000000 -0.639509 -0.314736 + 167 1.000000 1.000000 1.010000 0.724227 0.000000 -0.619356 -0.303140 + 168 1.000000 1.000000 1.010000 0.745830 0.000000 -0.601374 -0.286508 + 169 1.000000 1.000000 1.010000 0.765942 0.000000 -0.585543 -0.265467 + 170 1.000000 1.000000 1.010000 0.784349 0.000000 -0.571828 -0.240437 + 171 1.000000 1.000000 1.010000 0.800953 0.000000 -0.559910 -0.212075 + 172 1.000000 1.000000 1.010000 0.815306 0.000000 -0.550055 -0.180876 + 173 1.000000 1.000000 1.010000 0.827422 0.000000 -0.541972 -0.147103 + 174 1.000000 1.000000 1.010000 0.836803 0.000000 -0.535901 -0.112120 + 175 1.000000 1.000000 1.010000 0.843607 0.000000 -0.531649 -0.075343 + 176 1.000000 1.000000 1.010000 0.847808 0.000000 -0.528954 -0.037812 + 177 1.000000 1.000000 1.010000 0.866114 0.000000 -0.499846 0.000341 + 178 1.000000 1.000000 1.010000 0.864887 0.000000 -0.500547 0.037726 + 179 1.000000 1.000000 1.010000 0.861098 0.000000 -0.502816 0.075404 + 180 1.000000 1.000000 1.010000 0.854964 0.000000 -0.506464 0.111937 + 181 1.000000 1.000000 1.010000 0.846504 0.000000 -0.511489 0.147683 + 182 1.000000 1.000000 1.010000 0.835703 0.000000 -0.518053 0.182270 + 183 1.000000 1.000000 1.010000 0.822758 0.000000 -0.526144 0.215039 + 184 1.000000 1.000000 1.010000 0.807588 0.000000 -0.536179 0.245589 + 185 1.000000 1.000000 1.010000 0.790696 0.000000 -0.547549 0.273845 + 186 1.000000 1.000000 1.010000 0.771796 0.000000 -0.560925 0.299489 + 187 1.000000 1.000000 1.010000 0.751532 0.000000 -0.576081 0.321450 + 188 1.000000 1.000000 1.010000 0.729950 0.000000 -0.593184 0.339566 + 189 1.000000 1.000000 1.010000 0.707291 0.000000 -0.612084 0.353685 + 190 1.000000 1.000000 1.010000 0.683671 0.000000 -0.633188 0.362859 + 191 1.000000 1.000000 1.010000 0.660005 0.000000 -0.656095 0.365969 + 192 1.000000 1.000000 1.010000 0.636078 0.000000 -0.680861 0.363089 + 193 1.000000 1.000000 1.010000 0.612548 0.000000 -0.706887 0.353689 + 194 1.000000 1.000000 1.010000 0.589937 0.000000 -0.733974 0.336536 + 195 1.000000 1.000000 1.010000 0.568668 0.000000 -0.761545 0.310911 + 196 1.000000 1.000000 1.010000 0.549412 0.000000 -0.788334 0.276904 + 197 1.000000 1.000000 1.010000 0.532688 0.000000 -0.813050 0.234932 + 198 1.000000 1.000000 1.010000 0.518885 0.000000 -0.834645 0.184734 + 199 1.000000 1.000000 1.010000 0.508798 0.000000 -0.851397 0.127466 + 200 1.000000 1.000000 1.010000 0.502416 0.000000 -0.862183 0.064950 + 201 1.000000 1.000000 1.010000 0.500195 0.000000 -0.865913 0.000459 + 202 1.000000 1.000000 1.010000 0.502334 0.000000 -0.862278 -0.064313 + 203 1.000000 1.000000 1.010000 0.508695 0.000000 -0.851583 -0.126635 + 204 1.000000 1.000000 1.010000 0.518845 0.000000 -0.834760 -0.184326 + 205 1.000000 1.000000 1.010000 0.532630 0.000000 -0.813250 -0.234371 + 206 1.000000 1.000000 1.010000 0.549483 0.000000 -0.788292 -0.276883 + 207 1.000000 1.000000 1.010000 0.568777 0.000000 -0.761637 -0.310486 + 208 1.000000 1.000000 1.010000 0.589946 0.000000 -0.734324 -0.335754 + 209 1.000000 1.000000 1.010000 0.612561 0.000000 -0.707112 -0.353216 + 210 1.000000 1.000000 1.010000 0.636025 0.000000 -0.681109 -0.362715 + 211 1.000000 1.000000 1.010000 0.659821 0.000000 -0.656496 -0.365579 + 212 1.000000 1.000000 1.010000 0.683718 0.000000 -0.633562 -0.362116 + 213 1.000000 1.000000 1.010000 0.707218 0.000000 -0.612455 -0.353188 + 214 1.000000 1.000000 1.010000 0.729864 0.000000 -0.593326 -0.339503 + 215 1.000000 1.000000 1.010000 0.751657 0.000000 -0.576192 -0.320959 + 216 1.000000 1.000000 1.010000 0.771841 0.000000 -0.561216 -0.298827 + 217 1.000000 1.000000 1.010000 0.790605 0.000000 -0.547732 -0.273740 + 218 1.000000 1.000000 1.010000 0.807594 0.000000 -0.536220 -0.245481 + 219 1.000000 1.000000 1.010000 0.822689 0.000000 -0.526487 -0.214464 + 220 1.000000 1.000000 1.010000 0.835715 0.000000 -0.518179 -0.181857 + 221 1.000000 1.000000 1.010000 0.846506 0.000000 -0.511594 -0.147305 + 222 1.000000 1.000000 1.010000 0.855055 0.000000 -0.506408 -0.111496 + 223 1.000000 1.000000 1.010000 0.861135 0.000000 -0.502807 -0.075044 + 224 1.000000 1.000000 1.010000 0.864785 0.000000 -0.500731 -0.037628 + 225 1.000000 1.000000 1.010000 0.881994 0.000000 -0.471260 0.000020 + 226 1.000000 1.000000 1.010000 0.880935 0.000000 -0.471749 0.037510 + 227 1.000000 1.000000 1.010000 0.877533 0.000000 -0.473674 0.074623 + 228 1.000000 1.000000 1.010000 0.872006 0.000000 -0.476721 0.111099 + 229 1.000000 1.000000 1.010000 0.864398 0.000000 -0.480922 0.146733 + 230 1.000000 1.000000 1.010000 0.854601 0.000000 -0.486413 0.181823 + 231 1.000000 1.000000 1.010000 0.842947 0.000000 -0.493054 0.215263 + 232 1.000000 1.000000 1.010000 0.829139 0.000000 -0.501431 0.247175 + 233 1.000000 1.000000 1.010000 0.813676 0.000000 -0.510905 0.277322 + 234 1.000000 1.000000 1.010000 0.796427 0.000000 -0.521842 0.305588 + 235 1.000000 1.000000 1.010000 0.777445 0.000000 -0.534688 0.331192 + 236 1.000000 1.000000 1.010000 0.757110 0.000000 -0.549036 0.354041 + 237 1.000000 1.000000 1.010000 0.735600 0.000000 -0.565136 0.373516 + 238 1.000000 1.000000 1.010000 0.712974 0.000000 -0.583161 0.389346 + 239 1.000000 1.000000 1.010000 0.689554 0.000000 -0.602977 0.401165 + 240 1.000000 1.000000 1.010000 0.665569 0.000000 -0.624534 0.408627 + 241 1.000000 1.000000 1.010000 0.641182 0.000000 -0.648456 0.410353 + 242 1.000000 1.000000 1.010000 0.616964 0.000000 -0.673849 0.406549 + 243 1.000000 1.000000 1.010000 0.593315 0.000000 -0.700950 0.395785 + 244 1.000000 1.000000 1.010000 0.570133 0.000000 -0.729085 0.378660 + 245 1.000000 1.000000 1.010000 0.548705 0.000000 -0.757931 0.352793 + 246 1.000000 1.000000 1.010000 0.528634 0.000000 -0.786554 0.319186 + 247 1.000000 1.000000 1.010000 0.510986 0.000000 -0.813779 0.276870 + 248 1.000000 1.000000 1.010000 0.496013 0.000000 -0.838333 0.226205 + 249 1.000000 1.000000 1.010000 0.484237 0.000000 -0.858666 0.167949 + 250 1.000000 1.000000 1.010000 0.476294 0.000000 -0.873203 0.103251 + 251 1.000000 1.000000 1.010000 0.472278 0.000000 -0.880745 0.035230 + 252 1.000000 1.000000 1.010000 0.472093 0.000000 -0.880886 -0.034182 + 253 1.000000 1.000000 1.010000 0.476146 0.000000 -0.873336 -0.102801 + 254 1.000000 1.000000 1.010000 0.484112 0.000000 -0.858912 -0.167051 + 255 1.000000 1.000000 1.010000 0.495968 0.000000 -0.838659 -0.225091 + 256 1.000000 1.000000 1.010000 0.510872 0.000000 -0.814156 -0.275972 + 257 1.000000 1.000000 1.010000 0.528602 0.000000 -0.786750 -0.318755 + 258 1.000000 1.000000 1.010000 0.548502 0.000000 -0.758131 -0.352681 + 259 1.000000 1.000000 1.010000 0.570212 0.000000 -0.729405 -0.377923 + 260 1.000000 1.000000 1.010000 0.593334 0.000000 -0.700886 -0.395871 + 261 1.000000 1.000000 1.010000 0.616901 0.000000 -0.674120 -0.406196 + 262 1.000000 1.000000 1.010000 0.641323 0.000000 -0.648546 -0.409993 + 263 1.000000 1.000000 1.010000 0.665649 0.000000 -0.624708 -0.408231 + 264 1.000000 1.000000 1.010000 0.689635 0.000000 -0.602956 -0.401057 + 265 1.000000 1.000000 1.010000 0.712927 0.000000 -0.583266 -0.389276 + 266 1.000000 1.000000 1.010000 0.735598 0.000000 -0.565383 -0.373146 + 267 1.000000 1.000000 1.010000 0.757193 0.000000 -0.549228 -0.353565 + 268 1.000000 1.000000 1.010000 0.777573 0.000000 -0.534718 -0.330843 + 269 1.000000 1.000000 1.010000 0.796319 0.000000 -0.522204 -0.305252 + 270 1.000000 1.000000 1.010000 0.813715 0.000000 -0.511074 -0.276898 + 271 1.000000 1.000000 1.010000 0.829185 0.000000 -0.501492 -0.246899 + 272 1.000000 1.000000 1.010000 0.842934 0.000000 -0.493306 -0.214735 + 273 1.000000 1.000000 1.010000 0.854679 0.000000 -0.486533 -0.181133 + 274 1.000000 1.000000 1.010000 0.864452 0.000000 -0.480905 -0.146469 + 275 1.000000 1.000000 1.010000 0.872044 0.000000 -0.476780 -0.110539 + 276 1.000000 1.000000 1.010000 0.877584 0.000000 -0.473657 -0.074133 + 277 1.000000 1.000000 1.010000 0.880919 0.000000 -0.471821 -0.036959 + 278 1.000000 1.000000 1.010000 0.896835 0.000000 -0.442365 0.000145 + 279 1.000000 1.000000 1.010000 0.895911 0.000000 -0.442743 0.036359 + 280 1.000000 1.000000 1.010000 0.893012 0.000000 -0.444172 0.072390 + 281 1.000000 1.000000 1.010000 0.888209 0.000000 -0.446613 0.107800 + 282 1.000000 1.000000 1.010000 0.881594 0.000000 -0.449915 0.142716 + 283 1.000000 1.000000 1.010000 0.873087 0.000000 -0.454309 0.176980 + 284 1.000000 1.000000 1.010000 0.862801 0.000000 -0.459654 0.210457 + 285 1.000000 1.000000 1.010000 0.850760 0.000000 -0.466234 0.242554 + 286 1.000000 1.000000 1.010000 0.836983 0.000000 -0.473868 0.273695 + 287 1.000000 1.000000 1.010000 0.821638 0.000000 -0.482707 0.303157 + 288 1.000000 1.000000 1.010000 0.804801 0.000000 -0.492796 0.330828 + 289 1.000000 1.000000 1.010000 0.786476 0.000000 -0.504212 0.356687 + 290 1.000000 1.000000 1.010000 0.766814 0.000000 -0.517291 0.380008 + 291 1.000000 1.000000 1.010000 0.745953 0.000000 -0.531660 0.401113 + 292 1.000000 1.000000 1.010000 0.724119 0.000000 -0.547754 0.419067 + 293 1.000000 1.000000 1.010000 0.701567 0.000000 -0.565546 0.433544 + 294 1.000000 1.000000 1.010000 0.677958 0.000000 -0.585011 0.445124 + 295 1.000000 1.000000 1.010000 0.654184 0.000000 -0.606438 0.451969 + 296 1.000000 1.000000 1.010000 0.629938 0.000000 -0.629687 0.454612 + 297 1.000000 1.000000 1.010000 0.606025 0.000000 -0.654657 0.451837 + 298 1.000000 1.000000 1.010000 0.582080 0.000000 -0.681399 0.443710 + 299 1.000000 1.000000 1.010000 0.558828 0.000000 -0.710094 0.428342 + 300 1.000000 1.000000 1.010000 0.536557 0.000000 -0.739395 0.406697 + 301 1.000000 1.000000 1.010000 0.515553 0.000000 -0.769346 0.377242 + 302 1.000000 1.000000 1.010000 0.496528 0.000000 -0.799058 0.339068 + 303 1.000000 1.000000 1.010000 0.479640 0.000000 -0.827217 0.292673 + 304 1.000000 1.000000 1.010000 0.465453 0.000000 -0.852358 0.238409 + 305 1.000000 1.000000 1.010000 0.454551 0.000000 -0.873003 0.176774 + 306 1.000000 1.000000 1.010000 0.446772 0.000000 -0.888018 0.108714 + 307 1.000000 1.000000 1.010000 0.442974 0.000000 -0.895779 0.036791 + 308 1.000000 1.000000 1.010000 0.443133 0.000000 -0.895727 -0.036151 + 309 1.000000 1.000000 1.010000 0.446881 0.000000 -0.888059 -0.107925 + 310 1.000000 1.000000 1.010000 0.454397 0.000000 -0.873262 -0.175888 + 311 1.000000 1.000000 1.010000 0.465500 0.000000 -0.852406 -0.238147 + 312 1.000000 1.000000 1.010000 0.479698 0.000000 -0.827402 -0.292053 + 313 1.000000 1.000000 1.010000 0.496678 0.000000 -0.799238 -0.338421 + 314 1.000000 1.000000 1.010000 0.515674 0.000000 -0.769658 -0.376441 + 315 1.000000 1.000000 1.010000 0.536614 0.000000 -0.739578 -0.406289 + 316 1.000000 1.000000 1.010000 0.558736 0.000000 -0.710205 -0.428279 + 317 1.000000 1.000000 1.010000 0.582002 0.000000 -0.681840 -0.443134 + 318 1.000000 1.000000 1.010000 0.605952 0.000000 -0.654894 -0.451594 + 319 1.000000 1.000000 1.010000 0.629896 0.000000 -0.630067 -0.454144 + 320 1.000000 1.000000 1.010000 0.654070 0.000000 -0.606641 -0.451861 + 321 1.000000 1.000000 1.010000 0.677992 0.000000 -0.585222 -0.444795 + 322 1.000000 1.000000 1.010000 0.701446 0.000000 -0.565629 -0.433632 + 323 1.000000 1.000000 1.010000 0.724272 0.000000 -0.547848 -0.418681 + 324 1.000000 1.000000 1.010000 0.746090 0.000000 -0.531770 -0.400713 + 325 1.000000 1.000000 1.010000 0.766745 0.000000 -0.517619 -0.379701 + 326 1.000000 1.000000 1.010000 0.786420 0.000000 -0.504523 -0.356371 + 327 1.000000 1.000000 1.010000 0.804743 0.000000 -0.493037 -0.330611 + 328 1.000000 1.000000 1.010000 0.821585 0.000000 -0.482944 -0.302924 + 329 1.000000 1.000000 1.010000 0.837000 0.000000 -0.474094 -0.273251 + 330 1.000000 1.000000 1.010000 0.850715 0.000000 -0.466339 -0.242512 + 331 1.000000 1.000000 1.010000 0.862776 0.000000 -0.459916 -0.209988 + 332 1.000000 1.000000 1.010000 0.873055 0.000000 -0.454432 -0.176824 + 333 1.000000 1.000000 1.010000 0.881578 0.000000 -0.449998 -0.142558 + 334 1.000000 1.000000 1.010000 0.888352 0.000000 -0.446448 -0.107305 + 335 1.000000 1.000000 1.010000 0.893049 0.000000 -0.444163 -0.071988 + 336 1.000000 1.000000 1.010000 0.895879 0.000000 -0.442844 -0.035912 + 337 1.000000 1.000000 1.010000 0.910835 0.000000 -0.412770 0.000264 + 338 1.000000 1.000000 1.010000 0.909961 0.000000 -0.413093 0.036405 + 339 1.000000 1.000000 1.010000 0.907272 0.000000 -0.414295 0.072234 + 340 1.000000 1.000000 1.010000 0.902800 0.000000 -0.416309 0.107881 + 341 1.000000 1.000000 1.010000 0.896615 0.000000 -0.419124 0.142887 + 342 1.000000 1.000000 1.010000 0.888595 0.000000 -0.423005 0.177383 + 343 1.000000 1.000000 1.010000 0.878802 0.000000 -0.427789 0.211433 + 344 1.000000 1.000000 1.010000 0.867533 0.000000 -0.433314 0.244181 + 345 1.000000 1.000000 1.010000 0.854474 0.000000 -0.439898 0.276340 + 346 1.000000 1.000000 1.010000 0.839956 0.000000 -0.447547 0.306880 + 347 1.000000 1.000000 1.010000 0.823992 0.000000 -0.456032 0.336263 + 348 1.000000 1.000000 1.010000 0.806614 0.000000 -0.465846 0.363816 + 349 1.000000 1.000000 1.010000 0.787735 0.000000 -0.477169 0.389594 + 350 1.000000 1.000000 1.010000 0.767829 0.000000 -0.489606 0.413188 + 351 1.000000 1.000000 1.010000 0.746528 0.000000 -0.503570 0.434872 + 352 1.000000 1.000000 1.010000 0.724471 0.000000 -0.518657 0.454022 + 353 1.000000 1.000000 1.010000 0.701432 0.000000 -0.535783 0.470032 + 354 1.000000 1.000000 1.010000 0.677650 0.000000 -0.554647 0.482864 + 355 1.000000 1.000000 1.010000 0.653390 0.000000 -0.575372 0.491964 + 356 1.000000 1.000000 1.010000 0.628705 0.000000 -0.597956 0.497171 + 357 1.000000 1.000000 1.010000 0.603785 0.000000 -0.622618 0.497785 + 358 1.000000 1.000000 1.010000 0.579005 0.000000 -0.649190 0.493261 + 359 1.000000 1.000000 1.010000 0.554945 0.000000 -0.677541 0.482675 + 360 1.000000 1.000000 1.010000 0.531017 0.000000 -0.708113 0.465400 + 361 1.000000 1.000000 1.010000 0.508342 0.000000 -0.739297 0.441620 + 362 1.000000 1.000000 1.010000 0.487285 0.000000 -0.771809 0.408490 + 363 1.000000 1.000000 1.010000 0.468048 0.000000 -0.803636 0.367559 + 364 1.000000 1.000000 1.010000 0.450734 0.000000 -0.834215 0.317686 + 365 1.000000 1.000000 1.010000 0.436244 0.000000 -0.861893 0.258518 + 366 1.000000 1.000000 1.010000 0.425029 0.000000 -0.884591 0.191961 + 367 1.000000 1.000000 1.010000 0.417406 0.000000 -0.901002 0.118182 + 368 1.000000 1.000000 1.010000 0.413470 0.000000 -0.909622 0.040388 + 369 1.000000 1.000000 1.010000 0.413431 0.000000 -0.909688 -0.039274 + 370 1.000000 1.000000 1.010000 0.417323 0.000000 -0.901177 -0.117140 + 371 1.000000 1.000000 1.010000 0.425012 0.000000 -0.884804 -0.191013 + 372 1.000000 1.000000 1.010000 0.436311 0.000000 -0.862110 -0.257679 + 373 1.000000 1.000000 1.010000 0.450660 0.000000 -0.834631 -0.316696 + 374 1.000000 1.000000 1.010000 0.467801 0.000000 -0.803987 -0.367106 + 375 1.000000 1.000000 1.010000 0.487204 0.000000 -0.772102 -0.408032 + 376 1.000000 1.000000 1.010000 0.508323 0.000000 -0.739811 -0.440781 + 377 1.000000 1.000000 1.010000 0.531059 0.000000 -0.708343 -0.465002 + 378 1.000000 1.000000 1.010000 0.554631 0.000000 -0.677950 -0.482460 + 379 1.000000 1.000000 1.010000 0.579015 0.000000 -0.649663 -0.492626 + 380 1.000000 1.000000 1.010000 0.603803 0.000000 -0.622734 -0.497618 + 381 1.000000 1.000000 1.010000 0.628557 0.000000 -0.598121 -0.497160 + 382 1.000000 1.000000 1.010000 0.653241 0.000000 -0.575745 -0.491725 + 383 1.000000 1.000000 1.010000 0.677650 0.000000 -0.555095 -0.482348 + 384 1.000000 1.000000 1.010000 0.701334 0.000000 -0.536410 -0.469462 + 385 1.000000 1.000000 1.010000 0.724504 0.000000 -0.519060 -0.453509 + 386 1.000000 1.000000 1.010000 0.746706 0.000000 -0.503708 -0.434406 + 387 1.000000 1.000000 1.010000 0.767798 0.000000 -0.489808 -0.413007 + 388 1.000000 1.000000 1.010000 0.787734 0.000000 -0.477428 -0.389278 + 389 1.000000 1.000000 1.010000 0.806583 0.000000 -0.466278 -0.363330 + 390 1.000000 1.000000 1.010000 0.823960 0.000000 -0.456476 -0.335738 + 391 1.000000 1.000000 1.010000 0.840101 0.000000 -0.447428 -0.306657 + 392 1.000000 1.000000 1.010000 0.854613 0.000000 -0.440009 -0.275732 + 393 1.000000 1.000000 1.010000 0.867602 0.000000 -0.433237 -0.244076 + 394 1.000000 1.000000 1.010000 0.878867 0.000000 -0.427819 -0.211103 + 395 1.000000 1.000000 1.010000 0.888575 0.000000 -0.423107 -0.177241 + 396 1.000000 1.000000 1.010000 0.896546 0.000000 -0.419395 -0.142524 + 397 1.000000 1.000000 1.010000 0.902784 0.000000 -0.416516 -0.107218 + 398 1.000000 1.000000 1.010000 0.907264 0.000000 -0.414398 -0.071737 + 399 1.000000 1.000000 1.010000 0.909904 0.000000 -0.413271 -0.035799 + 400 1.000000 1.000000 1.010000 0.923864 0.000000 -0.382721 0.000336 + 401 1.000000 1.000000 1.010000 0.923012 0.000000 -0.383125 0.035567 + 402 1.000000 1.000000 1.010000 0.920533 0.000000 -0.384207 0.070742 + 403 1.000000 1.000000 1.010000 0.916544 0.000000 -0.385729 0.105640 + 404 1.000000 1.000000 1.010000 0.910887 0.000000 -0.388038 0.140394 + 405 1.000000 1.000000 1.010000 0.903631 0.000000 -0.391182 0.174438 + 406 1.000000 1.000000 1.010000 0.894805 0.000000 -0.395018 0.208048 + 407 1.000000 1.000000 1.010000 0.884433 0.000000 -0.399664 0.240930 + 408 1.000000 1.000000 1.010000 0.872480 0.000000 -0.405207 0.273107 + 409 1.000000 1.000000 1.010000 0.859164 0.000000 -0.411428 0.304244 + 410 1.000000 1.000000 1.010000 0.844386 0.000000 -0.418705 0.334212 + 411 1.000000 1.000000 1.010000 0.828383 0.000000 -0.426799 0.362800 + 412 1.000000 1.000000 1.010000 0.811001 0.000000 -0.435943 0.390167 + 413 1.000000 1.000000 1.010000 0.792334 0.000000 -0.446140 0.416131 + 414 1.000000 1.000000 1.010000 0.772626 0.000000 -0.457665 0.439991 + 415 1.000000 1.000000 1.010000 0.751773 0.000000 -0.470424 0.462102 + 416 1.000000 1.000000 1.010000 0.730013 0.000000 -0.484379 0.482139 + 417 1.000000 1.000000 1.010000 0.707232 0.000000 -0.499862 0.499961 + 418 1.000000 1.000000 1.010000 0.683738 0.000000 -0.517258 0.514729 + 419 1.000000 1.000000 1.010000 0.659616 0.000000 -0.535979 0.526910 + 420 1.000000 1.000000 1.010000 0.635192 0.000000 -0.556768 0.535294 + 421 1.000000 1.000000 1.010000 0.610387 0.000000 -0.579236 0.540290 + 422 1.000000 1.000000 1.010000 0.585341 0.000000 -0.604133 0.540739 + 423 1.000000 1.000000 1.010000 0.560384 0.000000 -0.630965 0.536520 + 424 1.000000 1.000000 1.010000 0.535757 0.000000 -0.659930 0.526741 + 425 1.000000 1.000000 1.010000 0.511787 0.000000 -0.690786 0.510773 + 426 1.000000 1.000000 1.010000 0.488725 0.000000 -0.723455 0.487608 + 427 1.000000 1.000000 1.010000 0.467023 0.000000 -0.757199 0.456661 + 428 1.000000 1.000000 1.010000 0.446841 0.000000 -0.791536 0.416898 + 429 1.000000 1.000000 1.010000 0.428662 0.000000 -0.825205 0.367812 + 430 1.000000 1.000000 1.010000 0.412927 0.000000 -0.856499 0.309678 + 431 1.000000 1.000000 1.010000 0.400100 0.000000 -0.883926 0.242063 + 432 1.000000 1.000000 1.010000 0.390813 0.000000 -0.905182 0.167066 + 433 1.000000 1.000000 1.010000 0.384876 0.000000 -0.919044 0.085027 + 434 1.000000 1.000000 1.010000 0.382966 0.000000 -0.923762 0.000138 + 435 1.000000 1.000000 1.010000 0.384708 0.000000 -0.919163 -0.084491 + 436 1.000000 1.000000 1.010000 0.390750 0.000000 -0.905473 -0.165628 + 437 1.000000 1.000000 1.010000 0.400036 0.000000 -0.884168 -0.241284 + 438 1.000000 1.000000 1.010000 0.412933 0.000000 -0.856828 -0.308759 + 439 1.000000 1.000000 1.010000 0.428641 0.000000 -0.825282 -0.367664 + 440 1.000000 1.000000 1.010000 0.446539 0.000000 -0.791879 -0.416571 + 441 1.000000 1.000000 1.010000 0.466781 0.000000 -0.757804 -0.455903 + 442 1.000000 1.000000 1.010000 0.488741 0.000000 -0.723855 -0.486997 + 443 1.000000 1.000000 1.010000 0.511898 0.000000 -0.691264 -0.510013 + 444 1.000000 1.000000 1.010000 0.535893 0.000000 -0.660096 -0.526395 + 445 1.000000 1.000000 1.010000 0.560377 0.000000 -0.631190 -0.536262 + 446 1.000000 1.000000 1.010000 0.585370 0.000000 -0.604341 -0.540476 + 447 1.000000 1.000000 1.010000 0.610325 0.000000 -0.579789 -0.539767 + 448 1.000000 1.000000 1.010000 0.635018 0.000000 -0.557260 -0.534989 + 449 1.000000 1.000000 1.010000 0.659703 0.000000 -0.536189 -0.526586 + 450 1.000000 1.000000 1.010000 0.683754 0.000000 -0.517323 -0.514644 + 451 1.000000 1.000000 1.010000 0.707323 0.000000 -0.500059 -0.499635 + 452 1.000000 1.000000 1.010000 0.729810 0.000000 -0.484544 -0.482281 + 453 1.000000 1.000000 1.010000 0.751744 0.000000 -0.470410 -0.462163 + 454 1.000000 1.000000 1.010000 0.772594 0.000000 -0.457950 -0.439750 + 455 1.000000 1.000000 1.010000 0.792374 0.000000 -0.446393 -0.415784 + 456 1.000000 1.000000 1.010000 0.811067 0.000000 -0.436099 -0.389856 + 457 1.000000 1.000000 1.010000 0.828367 0.000000 -0.427112 -0.362468 + 458 1.000000 1.000000 1.010000 0.844531 0.000000 -0.418686 -0.333870 + 459 1.000000 1.000000 1.010000 0.859286 0.000000 -0.411537 -0.303751 + 460 1.000000 1.000000 1.010000 0.872511 0.000000 -0.405254 -0.272935 + 461 1.000000 1.000000 1.010000 0.884436 0.000000 -0.399827 -0.240646 + 462 1.000000 1.000000 1.010000 0.894866 0.000000 -0.395075 -0.207680 + 463 1.000000 1.000000 1.010000 0.903621 0.000000 -0.391368 -0.174073 + 464 1.000000 1.000000 1.010000 0.910832 0.000000 -0.388265 -0.140124 + 465 1.000000 1.000000 1.010000 0.916558 0.000000 -0.385771 -0.105372 + 466 1.000000 1.000000 1.010000 0.920666 0.000000 -0.383957 -0.070357 + 467 1.000000 1.000000 1.010000 0.923050 0.000000 -0.383072 -0.035141 + 468 1.000000 1.000000 1.010000 0.935892 0.000000 -0.352286 0.000306 + 469 1.000000 1.000000 1.010000 0.935119 0.000000 -0.352574 0.035267 + 470 1.000000 1.000000 1.010000 0.932844 0.000000 -0.353374 0.070205 + 471 1.000000 1.000000 1.010000 0.929022 0.000000 -0.354850 0.104885 + 472 1.000000 1.000000 1.010000 0.923699 0.000000 -0.356849 0.139425 + 473 1.000000 1.000000 1.010000 0.916840 0.000000 -0.359721 0.173220 + 474 1.000000 1.000000 1.010000 0.908591 0.000000 -0.362789 0.206995 + 475 1.000000 1.000000 1.010000 0.898813 0.000000 -0.366844 0.239918 + 476 1.000000 1.000000 1.010000 0.887717 0.000000 -0.371256 0.272265 + 477 1.000000 1.000000 1.010000 0.875156 0.000000 -0.376548 0.303831 + 478 1.000000 1.000000 1.010000 0.861249 0.000000 -0.382701 0.334350 + 479 1.000000 1.000000 1.010000 0.845975 0.000000 -0.389569 0.364092 + 480 1.000000 1.000000 1.010000 0.829497 0.000000 -0.397459 0.392378 + 481 1.000000 1.000000 1.010000 0.811771 0.000000 -0.405993 0.419759 + 482 1.000000 1.000000 1.010000 0.792931 0.000000 -0.415842 0.445349 + 483 1.000000 1.000000 1.010000 0.772954 0.000000 -0.426663 0.469576 + 484 1.000000 1.000000 1.010000 0.752020 0.000000 -0.438331 0.492272 + 485 1.000000 1.000000 1.010000 0.729943 0.000000 -0.451855 0.512845 + 486 1.000000 1.000000 1.010000 0.707274 0.000000 -0.466290 0.531354 + 487 1.000000 1.000000 1.010000 0.683616 0.000000 -0.482474 0.547620 + 488 1.000000 1.000000 1.010000 0.659383 0.000000 -0.500166 0.561292 + 489 1.000000 1.000000 1.010000 0.634769 0.000000 -0.519361 0.572130 + 490 1.000000 1.000000 1.010000 0.609630 0.000000 -0.540869 0.579493 + 491 1.000000 1.000000 1.010000 0.584273 0.000000 -0.564310 0.583249 + 492 1.000000 1.000000 1.010000 0.558890 0.000000 -0.590027 0.582675 + 493 1.000000 1.000000 1.010000 0.533595 0.000000 -0.618053 0.577310 + 494 1.000000 1.000000 1.010000 0.508459 0.000000 -0.648450 0.566553 + 495 1.000000 1.000000 1.010000 0.484220 0.000000 -0.681020 0.549311 + 496 1.000000 1.000000 1.010000 0.460769 0.000000 -0.715694 0.524857 + 497 1.000000 1.000000 1.010000 0.438590 0.000000 -0.752062 0.491977 + 498 1.000000 1.000000 1.010000 0.418049 0.000000 -0.789253 0.449795 + 499 1.000000 1.000000 1.010000 0.399286 0.000000 -0.825695 0.398496 + 500 1.000000 1.000000 1.010000 0.383417 0.000000 -0.860488 0.335488 + 501 1.000000 1.000000 1.010000 0.370287 0.000000 -0.890925 0.262947 + 502 1.000000 1.000000 1.010000 0.360464 0.000000 -0.914936 0.181542 + 503 1.000000 1.000000 1.010000 0.354615 0.000000 -0.930377 0.092987 + 504 1.000000 1.000000 1.010000 0.352413 0.000000 -0.935844 0.000582 + 505 1.000000 1.000000 1.010000 0.354368 0.000000 -0.930535 -0.092351 + 506 1.000000 1.000000 1.010000 0.360409 0.000000 -0.915070 -0.180976 + 507 1.000000 1.000000 1.010000 0.370377 0.000000 -0.891033 -0.262454 + 508 1.000000 1.000000 1.010000 0.383253 0.000000 -0.860784 -0.334915 + 509 1.000000 1.000000 1.010000 0.399306 0.000000 -0.826145 -0.397541 + 510 1.000000 1.000000 1.010000 0.417750 0.000000 -0.789597 -0.449469 + 511 1.000000 1.000000 1.010000 0.438317 0.000000 -0.752590 -0.491412 + 512 1.000000 1.000000 1.010000 0.460605 0.000000 -0.716076 -0.524479 + 513 1.000000 1.000000 1.010000 0.484060 0.000000 -0.681216 -0.549209 + 514 1.000000 1.000000 1.010000 0.508452 0.000000 -0.648779 -0.566182 + 515 1.000000 1.000000 1.010000 0.533365 0.000000 -0.618463 -0.577083 + 516 1.000000 1.000000 1.010000 0.558863 0.000000 -0.590249 -0.582476 + 517 1.000000 1.000000 1.010000 0.584097 0.000000 -0.564611 -0.583134 + 518 1.000000 1.000000 1.010000 0.609511 0.000000 -0.541256 -0.579257 + 519 1.000000 1.000000 1.010000 0.634600 0.000000 -0.519893 -0.571834 + 520 1.000000 1.000000 1.010000 0.659347 0.000000 -0.500232 -0.561275 + 521 1.000000 1.000000 1.010000 0.683641 0.000000 -0.482438 -0.547620 + 522 1.000000 1.000000 1.010000 0.707212 0.000000 -0.466307 -0.531421 + 523 1.000000 1.000000 1.010000 0.729987 0.000000 -0.451732 -0.512891 + 524 1.000000 1.000000 1.010000 0.751999 0.000000 -0.438611 -0.492054 + 525 1.000000 1.000000 1.010000 0.772990 0.000000 -0.426746 -0.469440 + 526 1.000000 1.000000 1.010000 0.792985 0.000000 -0.415977 -0.445127 + 527 1.000000 1.000000 1.010000 0.811889 0.000000 -0.406013 -0.419511 + 528 1.000000 1.000000 1.010000 0.829616 0.000000 -0.397571 -0.392014 + 529 1.000000 1.000000 1.010000 0.845966 0.000000 -0.389961 -0.363693 + 530 1.000000 1.000000 1.010000 0.861199 0.000000 -0.383030 -0.334103 + 531 1.000000 1.000000 1.010000 0.875222 0.000000 -0.376826 -0.303296 + 532 1.000000 1.000000 1.010000 0.887632 0.000000 -0.371573 -0.272108 + 533 1.000000 1.000000 1.010000 0.898861 0.000000 -0.366935 -0.239599 + 534 1.000000 1.000000 1.010000 0.908655 0.000000 -0.362840 -0.206625 + 535 1.000000 1.000000 1.010000 0.916938 0.000000 -0.359604 -0.172943 + 536 1.000000 1.000000 1.010000 0.923737 0.000000 -0.356872 -0.139110 + 537 1.000000 1.000000 1.010000 0.929086 0.000000 -0.354801 -0.104473 + 538 1.000000 1.000000 1.010000 0.932897 0.000000 -0.353290 -0.069929 + 539 1.000000 1.000000 1.010000 0.935175 0.000000 -0.352470 -0.034819 + 540 1.000000 1.000000 1.010000 0.946938 0.000000 -0.321416 0.000251 + 541 1.000000 1.000000 1.010000 0.946231 0.000000 -0.321615 0.034783 + 542 1.000000 1.000000 1.010000 0.944055 0.000000 -0.322412 0.069364 + 543 1.000000 1.000000 1.010000 0.940499 0.000000 -0.323630 0.103562 + 544 1.000000 1.000000 1.010000 0.935448 0.000000 -0.325478 0.137843 + 545 1.000000 1.000000 1.010000 0.929055 0.000000 -0.327744 0.171583 + 546 1.000000 1.000000 1.010000 0.921350 0.000000 -0.330402 0.204815 + 547 1.000000 1.000000 1.010000 0.912158 0.000000 -0.333727 0.237897 + 548 1.000000 1.000000 1.010000 0.901654 0.000000 -0.337703 0.270142 + 549 1.000000 1.000000 1.010000 0.889861 0.000000 -0.342166 0.301777 + 550 1.000000 1.000000 1.010000 0.876687 0.000000 -0.347289 0.332882 + 551 1.000000 1.000000 1.010000 0.862399 0.000000 -0.352897 0.362948 + 552 1.000000 1.000000 1.010000 0.846728 0.000000 -0.359596 0.392099 + 553 1.000000 1.000000 1.010000 0.830026 0.000000 -0.366710 0.420215 + 554 1.000000 1.000000 1.010000 0.812064 0.000000 -0.374767 0.447326 + 555 1.000000 1.000000 1.010000 0.793003 0.000000 -0.383787 0.473132 + 556 1.000000 1.000000 1.010000 0.772876 0.000000 -0.394000 0.497420 + 557 1.000000 1.000000 1.010000 0.751911 0.000000 -0.404747 0.520393 + 558 1.000000 1.000000 1.010000 0.729983 0.000000 -0.416981 0.541527 + 559 1.000000 1.000000 1.010000 0.707170 0.000000 -0.430382 0.560965 + 560 1.000000 1.000000 1.010000 0.683617 0.000000 -0.445240 0.578298 + 561 1.000000 1.000000 1.010000 0.659545 0.000000 -0.461540 0.593280 + 562 1.000000 1.000000 1.010000 0.634650 0.000000 -0.479700 0.605893 + 563 1.000000 1.000000 1.010000 0.609538 0.000000 -0.499305 0.615758 + 564 1.000000 1.000000 1.010000 0.583772 0.000000 -0.521455 0.622331 + 565 1.000000 1.000000 1.010000 0.558085 0.000000 -0.545575 0.625211 + 566 1.000000 1.000000 1.010000 0.532176 0.000000 -0.572070 0.624119 + 567 1.000000 1.000000 1.010000 0.506657 0.000000 -0.600930 0.618209 + 568 1.000000 1.000000 1.010000 0.481338 0.000000 -0.632823 0.606505 + 569 1.000000 1.000000 1.010000 0.456402 0.000000 -0.666884 0.589035 + 570 1.000000 1.000000 1.010000 0.432660 0.000000 -0.703706 0.563563 + 571 1.000000 1.000000 1.010000 0.410171 0.000000 -0.742682 0.529324 + 572 1.000000 1.000000 1.010000 0.389126 0.000000 -0.783026 0.485233 + 573 1.000000 1.000000 1.010000 0.369954 0.000000 -0.822810 0.431414 + 574 1.000000 1.000000 1.010000 0.353693 0.000000 -0.861343 0.364676 + 575 1.000000 1.000000 1.010000 0.340021 0.000000 -0.895600 0.286855 + 576 1.000000 1.000000 1.010000 0.330136 0.000000 -0.922923 0.198052 + 577 1.000000 1.000000 1.010000 0.323910 0.000000 -0.940638 0.101401 + 578 1.000000 1.000000 1.010000 0.321561 0.000000 -0.946889 0.000499 + 579 1.000000 1.000000 1.010000 0.323857 0.000000 -0.940707 -0.100934 + 580 1.000000 1.000000 1.010000 0.330147 0.000000 -0.922984 -0.197747 + 581 1.000000 1.000000 1.010000 0.339892 0.000000 -0.895791 -0.286412 + 582 1.000000 1.000000 1.010000 0.353469 0.000000 -0.861589 -0.364313 + 583 1.000000 1.000000 1.010000 0.369955 0.000000 -0.823232 -0.430606 + 584 1.000000 1.000000 1.010000 0.388751 0.000000 -0.783226 -0.485210 + 585 1.000000 1.000000 1.010000 0.409730 0.000000 -0.743142 -0.529019 + 586 1.000000 1.000000 1.010000 0.432511 0.000000 -0.704436 -0.562764 + 587 1.000000 1.000000 1.010000 0.456372 0.000000 -0.667495 -0.588367 + 588 1.000000 1.000000 1.010000 0.481196 0.000000 -0.633269 -0.606153 + 589 1.000000 1.000000 1.010000 0.506445 0.000000 -0.601456 -0.617871 + 590 1.000000 1.000000 1.010000 0.532080 0.000000 -0.572575 -0.623737 + 591 1.000000 1.000000 1.010000 0.558036 0.000000 -0.545904 -0.624968 + 592 1.000000 1.000000 1.010000 0.583658 0.000000 -0.522039 -0.621948 + 593 1.000000 1.000000 1.010000 0.609295 0.000000 -0.499674 -0.615699 + 594 1.000000 1.000000 1.010000 0.634545 0.000000 -0.479971 -0.605790 + 595 1.000000 1.000000 1.010000 0.659495 0.000000 -0.461730 -0.593187 + 596 1.000000 1.000000 1.010000 0.683671 0.000000 -0.445364 -0.578139 + 597 1.000000 1.000000 1.010000 0.707151 0.000000 -0.430610 -0.560814 + 598 1.000000 1.000000 1.010000 0.730016 0.000000 -0.417010 -0.541460 + 599 1.000000 1.000000 1.010000 0.751894 0.000000 -0.405046 -0.520185 + 600 1.000000 1.000000 1.010000 0.772933 0.000000 -0.394112 -0.497243 + 601 1.000000 1.000000 1.010000 0.793152 0.000000 -0.383788 -0.472882 + 602 1.000000 1.000000 1.010000 0.812105 0.000000 -0.375030 -0.447032 + 603 1.000000 1.000000 1.010000 0.830127 0.000000 -0.366700 -0.420023 + 604 1.000000 1.000000 1.010000 0.846879 0.000000 -0.359498 -0.391864 + 605 1.000000 1.000000 1.010000 0.862418 0.000000 -0.353097 -0.362708 + 606 1.000000 1.000000 1.010000 0.876860 0.000000 -0.347273 -0.332442 + 607 1.000000 1.000000 1.010000 0.890019 0.000000 -0.341991 -0.301512 + 608 1.000000 1.000000 1.010000 0.901817 0.000000 -0.337529 -0.269815 + 609 1.000000 1.000000 1.010000 0.912174 0.000000 -0.333801 -0.237730 + 610 1.000000 1.000000 1.010000 0.921447 0.000000 -0.330296 -0.204550 + 611 1.000000 1.000000 1.010000 0.929173 0.000000 -0.327512 -0.171387 + 612 1.000000 1.000000 1.010000 0.935569 0.000000 -0.325313 -0.137409 + 613 1.000000 1.000000 1.010000 0.940523 0.000000 -0.323650 -0.103285 + 614 1.000000 1.000000 1.010000 0.944045 0.000000 -0.322544 -0.068876 + 615 1.000000 1.000000 1.010000 0.946225 0.000000 -0.321668 -0.034462 + 616 1.000000 1.000000 1.010000 0.956887 0.000000 -0.290461 0.000254 + 617 1.000000 1.000000 1.010000 0.956252 0.000000 -0.290513 0.034403 + 618 1.000000 1.000000 1.010000 0.954311 0.000000 -0.290943 0.068134 + 619 1.000000 1.000000 1.010000 0.950950 0.000000 -0.292019 0.102072 + 620 1.000000 1.000000 1.010000 0.946261 0.000000 -0.293427 0.135980 + 621 1.000000 1.000000 1.010000 0.940268 0.000000 -0.295383 0.169249 + 622 1.000000 1.000000 1.010000 0.932938 0.000000 -0.297813 0.202320 + 623 1.000000 1.000000 1.010000 0.924334 0.000000 -0.300446 0.235242 + 624 1.000000 1.000000 1.010000 0.914517 0.000000 -0.303656 0.267305 + 625 1.000000 1.000000 1.010000 0.903303 0.000000 -0.307566 0.299075 + 626 1.000000 1.000000 1.010000 0.891093 0.000000 -0.311704 0.329838 + 627 1.000000 1.000000 1.010000 0.877560 0.000000 -0.316539 0.360128 + 628 1.000000 1.000000 1.010000 0.862839 0.000000 -0.321853 0.389768 + 629 1.000000 1.000000 1.010000 0.846982 0.000000 -0.327914 0.418442 + 630 1.000000 1.000000 1.010000 0.830003 0.000000 -0.334751 0.446136 + 631 1.000000 1.000000 1.010000 0.811907 0.000000 -0.342164 0.473002 + 632 1.000000 1.000000 1.010000 0.792842 0.000000 -0.350355 0.498652 + 633 1.000000 1.000000 1.010000 0.772854 0.000000 -0.359508 0.522925 + 634 1.000000 1.000000 1.010000 0.751787 0.000000 -0.369357 0.546252 + 635 1.000000 1.000000 1.010000 0.729800 0.000000 -0.380877 0.567737 + 636 1.000000 1.000000 1.010000 0.707135 0.000000 -0.392890 0.587875 + 637 1.000000 1.000000 1.010000 0.683877 0.000000 -0.406060 0.606158 + 638 1.000000 1.000000 1.010000 0.659659 0.000000 -0.421005 0.622579 + 639 1.000000 1.000000 1.010000 0.635024 0.000000 -0.437623 0.636577 + 640 1.000000 1.000000 1.010000 0.609627 0.000000 -0.455657 0.648639 + 641 1.000000 1.000000 1.010000 0.584016 0.000000 -0.475730 0.657728 + 642 1.000000 1.000000 1.010000 0.558152 0.000000 -0.497614 0.663963 + 643 1.000000 1.000000 1.010000 0.531821 0.000000 -0.522255 0.666646 + 644 1.000000 1.000000 1.010000 0.505854 0.000000 -0.549487 0.664963 + 645 1.000000 1.000000 1.010000 0.479868 0.000000 -0.579096 0.659070 + 646 1.000000 1.000000 1.010000 0.454074 0.000000 -0.612073 0.647444 + 647 1.000000 1.000000 1.010000 0.428992 0.000000 -0.647738 0.629604 + 648 1.000000 1.000000 1.010000 0.404746 0.000000 -0.686869 0.603648 + 649 1.000000 1.000000 1.010000 0.381691 0.000000 -0.728062 0.569419 + 650 1.000000 1.000000 1.010000 0.360034 0.000000 -0.771610 0.524399 + 651 1.000000 1.000000 1.010000 0.340567 0.000000 -0.815936 0.467186 + 652 1.000000 1.000000 1.010000 0.323657 0.000000 -0.858650 0.397449 + 653 1.000000 1.000000 1.010000 0.309622 0.000000 -0.897629 0.313683 + 654 1.000000 1.000000 1.010000 0.299221 0.000000 -0.928998 0.217784 + 655 1.000000 1.000000 1.010000 0.292769 0.000000 -0.949575 0.112218 + 656 1.000000 1.000000 1.010000 0.290419 0.000000 -0.956899 0.000985 + 657 1.000000 1.000000 1.010000 0.292853 0.000000 -0.949694 -0.110989 + 658 1.000000 1.000000 1.010000 0.299216 0.000000 -0.929348 -0.216291 + 659 1.000000 1.000000 1.010000 0.309540 0.000000 -0.898036 -0.312597 + 660 1.000000 1.000000 1.010000 0.323643 0.000000 -0.858978 -0.396752 + 661 1.000000 1.000000 1.010000 0.340454 0.000000 -0.816317 -0.466603 + 662 1.000000 1.000000 1.010000 0.360009 0.000000 -0.771970 -0.523885 + 663 1.000000 1.000000 1.010000 0.381633 0.000000 -0.728688 -0.568656 + 664 1.000000 1.000000 1.010000 0.404796 0.000000 -0.687108 -0.603343 + 665 1.000000 1.000000 1.010000 0.428878 0.000000 -0.648350 -0.629052 + 666 1.000000 1.000000 1.010000 0.453976 0.000000 -0.612603 -0.647011 + 667 1.000000 1.000000 1.010000 0.479713 0.000000 -0.579437 -0.658884 + 668 1.000000 1.000000 1.010000 0.505774 0.000000 -0.549582 -0.664945 + 669 1.000000 1.000000 1.010000 0.531884 0.000000 -0.522404 -0.666479 + 670 1.000000 1.000000 1.010000 0.557941 0.000000 -0.498155 -0.663734 + 671 1.000000 1.000000 1.010000 0.584097 0.000000 -0.476052 -0.657423 + 672 1.000000 1.000000 1.010000 0.609560 0.000000 -0.455995 -0.648463 + 673 1.000000 1.000000 1.010000 0.634792 0.000000 -0.437786 -0.636696 + 674 1.000000 1.000000 1.010000 0.659549 0.000000 -0.421277 -0.622511 + 675 1.000000 1.000000 1.010000 0.683693 0.000000 -0.406505 -0.606067 + 676 1.000000 1.000000 1.010000 0.707253 0.000000 -0.393179 -0.587540 + 677 1.000000 1.000000 1.010000 0.729947 0.000000 -0.380792 -0.567605 + 678 1.000000 1.000000 1.010000 0.751712 0.000000 -0.369863 -0.546013 + 679 1.000000 1.000000 1.010000 0.772888 0.000000 -0.359447 -0.522916 + 680 1.000000 1.000000 1.010000 0.792895 0.000000 -0.350624 -0.498378 + 681 1.000000 1.000000 1.010000 0.811999 0.000000 -0.342420 -0.472658 + 682 1.000000 1.000000 1.010000 0.829905 0.000000 -0.334913 -0.446196 + 683 1.000000 1.000000 1.010000 0.847066 0.000000 -0.328112 -0.418116 + 684 1.000000 1.000000 1.010000 0.862916 0.000000 -0.322037 -0.389447 + 685 1.000000 1.000000 1.010000 0.877588 0.000000 -0.316675 -0.359939 + 686 1.000000 1.000000 1.010000 0.891152 0.000000 -0.311944 -0.329451 + 687 1.000000 1.000000 1.010000 0.903494 0.000000 -0.307554 -0.298512 + 688 1.000000 1.000000 1.010000 0.914562 0.000000 -0.303853 -0.266926 + 689 1.000000 1.000000 1.010000 0.924342 0.000000 -0.300745 -0.234828 + 690 1.000000 1.000000 1.010000 0.932956 0.000000 -0.297835 -0.202207 + 691 1.000000 1.000000 1.010000 0.940221 0.000000 -0.295631 -0.169075 + 692 1.000000 1.000000 1.010000 0.946213 0.000000 -0.293750 -0.135618 + 693 1.000000 1.000000 1.010000 0.950957 0.000000 -0.292101 -0.101774 + 694 1.000000 1.000000 1.010000 0.954280 0.000000 -0.291124 -0.067796 + 695 1.000000 1.000000 1.010000 0.956240 0.000000 -0.290598 -0.034026 + 696 1.000000 1.000000 1.010000 0.965926 0.000000 -0.258817 0.000261 + 697 1.000000 1.000000 1.010000 0.965281 0.000000 -0.258963 0.034219 + 698 1.000000 1.000000 1.010000 0.963315 0.000000 -0.259637 0.067912 + 699 1.000000 1.000000 1.010000 0.960141 0.000000 -0.260402 0.101590 + 700 1.000000 1.000000 1.010000 0.955644 0.000000 -0.261615 0.135289 + 701 1.000000 1.000000 1.010000 0.949910 0.000000 -0.263192 0.168525 + 702 1.000000 1.000000 1.010000 0.942937 0.000000 -0.265166 0.201386 + 703 1.000000 1.000000 1.010000 0.934607 0.000000 -0.267575 0.234336 + 704 1.000000 1.000000 1.010000 0.925185 0.000000 -0.270185 0.266521 + 705 1.000000 1.000000 1.010000 0.914514 0.000000 -0.273365 0.298222 + 706 1.000000 1.000000 1.010000 0.902545 0.000000 -0.277105 0.329582 + 707 1.000000 1.000000 1.010000 0.889645 0.000000 -0.281038 0.359930 + 708 1.000000 1.000000 1.010000 0.875396 0.000000 -0.285735 0.389920 + 709 1.000000 1.000000 1.010000 0.860094 0.000000 -0.290705 0.419201 + 710 1.000000 1.000000 1.010000 0.843622 0.000000 -0.296310 0.447775 + 711 1.000000 1.000000 1.010000 0.826302 0.000000 -0.302722 0.474957 + 712 1.000000 1.000000 1.010000 0.807743 0.000000 -0.309644 0.501669 + 713 1.000000 1.000000 1.010000 0.788300 0.000000 -0.317219 0.527215 + 714 1.000000 1.000000 1.010000 0.767981 0.000000 -0.325695 0.551479 + 715 1.000000 1.000000 1.010000 0.746496 0.000000 -0.334933 0.574946 + 716 1.000000 1.000000 1.010000 0.724359 0.000000 -0.345122 0.596821 + 717 1.000000 1.000000 1.010000 0.701402 0.000000 -0.356629 0.617131 + 718 1.000000 1.000000 1.010000 0.677762 0.000000 -0.368972 0.636002 + 719 1.000000 1.000000 1.010000 0.653378 0.000000 -0.382883 0.653068 + 720 1.000000 1.000000 1.010000 0.628184 0.000000 -0.398333 0.668368 + 721 1.000000 1.000000 1.010000 0.602660 0.000000 -0.415077 0.681551 + 722 1.000000 1.000000 1.010000 0.576748 0.000000 -0.433657 0.692317 + 723 1.000000 1.000000 1.010000 0.550234 0.000000 -0.454527 0.700463 + 724 1.000000 1.000000 1.010000 0.523780 0.000000 -0.477707 0.705302 + 725 1.000000 1.000000 1.010000 0.496950 0.000000 -0.503217 0.706975 + 726 1.000000 1.000000 1.010000 0.470146 0.000000 -0.531874 0.704324 + 727 1.000000 1.000000 1.010000 0.443715 0.000000 -0.563632 0.696732 + 728 1.000000 1.000000 1.010000 0.417731 0.000000 -0.598536 0.683561 + 729 1.000000 1.000000 1.010000 0.392301 0.000000 -0.637792 0.662813 + 730 1.000000 1.000000 1.010000 0.367573 0.000000 -0.680318 0.634080 + 731 1.000000 1.000000 1.010000 0.344401 0.000000 -0.726652 0.594446 + 732 1.000000 1.000000 1.010000 0.322685 0.000000 -0.775354 0.542864 + 733 1.000000 1.000000 1.010000 0.303480 0.000000 -0.824563 0.477489 + 734 1.000000 1.000000 1.010000 0.286911 0.000000 -0.872159 0.396259 + 735 1.000000 1.000000 1.010000 0.273582 0.000000 -0.914220 0.298923 + 736 1.000000 1.000000 1.010000 0.264315 0.000000 -0.946386 0.185717 + 737 1.000000 1.000000 1.010000 0.259783 0.000000 -0.963564 0.063696 + 738 1.000000 1.000000 1.010000 0.259531 0.000000 -0.963679 -0.062978 + 739 1.000000 1.000000 1.010000 0.264217 0.000000 -0.946480 -0.185380 + 740 1.000000 1.000000 1.010000 0.273379 0.000000 -0.914928 -0.296936 + 741 1.000000 1.000000 1.010000 0.286850 0.000000 -0.872671 -0.395174 + 742 1.000000 1.000000 1.010000 0.303172 0.000000 -0.824939 -0.477036 + 743 1.000000 1.000000 1.010000 0.322552 0.000000 -0.775735 -0.542399 + 744 1.000000 1.000000 1.010000 0.344030 0.000000 -0.726896 -0.594361 + 745 1.000000 1.000000 1.010000 0.367368 0.000000 -0.680803 -0.633678 + 746 1.000000 1.000000 1.010000 0.391819 0.000000 -0.638426 -0.662488 + 747 1.000000 1.000000 1.010000 0.417507 0.000000 -0.599355 -0.682980 + 748 1.000000 1.000000 1.010000 0.443591 0.000000 -0.564297 -0.696273 + 749 1.000000 1.000000 1.010000 0.470133 0.000000 -0.532379 -0.703952 + 750 1.000000 1.000000 1.010000 0.496802 0.000000 -0.503439 -0.706921 + 751 1.000000 1.000000 1.010000 0.523682 0.000000 -0.477788 -0.705319 + 752 1.000000 1.000000 1.010000 0.550141 0.000000 -0.454605 -0.700485 + 753 1.000000 1.000000 1.010000 0.576767 0.000000 -0.433887 -0.692157 + 754 1.000000 1.000000 1.010000 0.602627 0.000000 -0.415228 -0.681488 + 755 1.000000 1.000000 1.010000 0.628205 0.000000 -0.398387 -0.668316 + 756 1.000000 1.000000 1.010000 0.653163 0.000000 -0.383073 -0.653171 + 757 1.000000 1.000000 1.010000 0.677632 0.000000 -0.369068 -0.636085 + 758 1.000000 1.000000 1.010000 0.701299 0.000000 -0.356968 -0.617053 + 759 1.000000 1.000000 1.010000 0.724390 0.000000 -0.345475 -0.596579 + 760 1.000000 1.000000 1.010000 0.746624 0.000000 -0.335077 -0.574696 + 761 1.000000 1.000000 1.010000 0.767926 0.000000 -0.325962 -0.551397 + 762 1.000000 1.000000 1.010000 0.788231 0.000000 -0.317320 -0.527257 + 763 1.000000 1.000000 1.010000 0.807741 0.000000 -0.309746 -0.501609 + 764 1.000000 1.000000 1.010000 0.826348 0.000000 -0.302795 -0.474830 + 765 1.000000 1.000000 1.010000 0.843854 0.000000 -0.296336 -0.447320 + 766 1.000000 1.000000 1.010000 0.860155 0.000000 -0.290757 -0.419040 + 767 1.000000 1.000000 1.010000 0.875419 0.000000 -0.285670 -0.389916 + 768 1.000000 1.000000 1.010000 0.889704 0.000000 -0.281233 -0.359632 + 769 1.000000 1.000000 1.010000 0.902665 0.000000 -0.277170 -0.329201 + 770 1.000000 1.000000 1.010000 0.914544 0.000000 -0.273565 -0.297947 + 771 1.000000 1.000000 1.010000 0.925256 0.000000 -0.270408 -0.266045 + 772 1.000000 1.000000 1.010000 0.934682 0.000000 -0.267764 -0.233820 + 773 1.000000 1.000000 1.010000 0.942920 0.000000 -0.265309 -0.201277 + 774 1.000000 1.000000 1.010000 0.949997 0.000000 -0.263104 -0.168173 + 775 1.000000 1.000000 1.010000 0.955722 0.000000 -0.261546 -0.134871 + 776 1.000000 1.000000 1.010000 0.960168 0.000000 -0.260459 -0.101183 + 777 1.000000 1.000000 1.010000 0.963338 0.000000 -0.259673 -0.067451 + 778 1.000000 1.000000 1.010000 0.965254 0.000000 -0.259114 -0.033845 + 779 1.000000 1.000000 1.010000 0.973840 0.000000 -0.227236 0.000061 + 780 1.000000 1.000000 1.010000 0.973204 0.000000 -0.227460 0.033703 + 781 1.000000 1.000000 1.010000 0.971406 0.000000 -0.227649 0.067433 + 782 1.000000 1.000000 1.010000 0.968348 0.000000 -0.228381 0.100714 + 783 1.000000 1.000000 1.010000 0.963995 0.000000 -0.229531 0.134275 + 784 1.000000 1.000000 1.010000 0.958521 0.000000 -0.230730 0.167333 + 785 1.000000 1.000000 1.010000 0.951836 0.000000 -0.232496 0.199885 + 786 1.000000 1.000000 1.010000 0.943873 0.000000 -0.234459 0.232663 + 787 1.000000 1.000000 1.010000 0.934843 0.000000 -0.236520 0.264814 + 788 1.000000 1.000000 1.010000 0.924607 0.000000 -0.239109 0.296529 + 789 1.000000 1.000000 1.010000 0.913158 0.000000 -0.242312 0.327760 + 790 1.000000 1.000000 1.010000 0.900629 0.000000 -0.245685 0.358477 + 791 1.000000 1.000000 1.010000 0.887065 0.000000 -0.249468 0.388434 + 792 1.000000 1.000000 1.010000 0.872315 0.000000 -0.253591 0.418041 + 793 1.000000 1.000000 1.010000 0.856603 0.000000 -0.258051 0.446812 + 794 1.000000 1.000000 1.010000 0.839770 0.000000 -0.263437 0.474750 + 795 1.000000 1.000000 1.010000 0.821919 0.000000 -0.268953 0.502109 + 796 1.000000 1.000000 1.010000 0.802951 0.000000 -0.275581 0.528511 + 797 1.000000 1.000000 1.010000 0.783207 0.000000 -0.282548 0.553854 + 798 1.000000 1.000000 1.010000 0.762520 0.000000 -0.290119 0.578268 + 799 1.000000 1.000000 1.010000 0.741151 0.000000 -0.298441 0.601355 + 800 1.000000 1.000000 1.010000 0.718808 0.000000 -0.307855 0.623330 + 801 1.000000 1.000000 1.010000 0.695599 0.000000 -0.318102 0.644168 + 802 1.000000 1.000000 1.010000 0.671574 0.000000 -0.329369 0.663705 + 803 1.000000 1.000000 1.010000 0.647156 0.000000 -0.341636 0.681523 + 804 1.000000 1.000000 1.010000 0.621822 0.000000 -0.355935 0.697602 + 805 1.000000 1.000000 1.010000 0.596061 0.000000 -0.371336 0.711914 + 806 1.000000 1.000000 1.010000 0.570014 0.000000 -0.388066 0.724216 + 807 1.000000 1.000000 1.010000 0.543286 0.000000 -0.407296 0.734132 + 808 1.000000 1.000000 1.010000 0.516425 0.000000 -0.428575 0.741369 + 809 1.000000 1.000000 1.010000 0.489251 0.000000 -0.452157 0.745780 + 810 1.000000 1.000000 1.010000 0.462010 0.000000 -0.479130 0.746312 + 811 1.000000 1.000000 1.010000 0.434820 0.000000 -0.508915 0.742924 + 812 1.000000 1.000000 1.010000 0.407624 0.000000 -0.542654 0.734417 + 813 1.000000 1.000000 1.010000 0.381095 0.000000 -0.580644 0.719458 + 814 1.000000 1.000000 1.010000 0.355377 0.000000 -0.623175 0.696678 + 815 1.000000 1.000000 1.010000 0.330439 0.000000 -0.669683 0.665083 + 816 1.000000 1.000000 1.010000 0.306610 0.000000 -0.721390 0.620956 + 817 1.000000 1.000000 1.010000 0.285195 0.000000 -0.776408 0.562009 + 818 1.000000 1.000000 1.010000 0.266014 0.000000 -0.832019 0.486806 + 819 1.000000 1.000000 1.010000 0.250037 0.000000 -0.885762 0.391034 + 820 1.000000 1.000000 1.010000 0.237526 0.000000 -0.931561 0.275275 + 821 1.000000 1.000000 1.010000 0.230090 0.000000 -0.962495 0.143739 + 822 1.000000 1.000000 1.010000 0.227273 0.000000 -0.973831 0.000093 + 823 1.000000 1.000000 1.010000 0.229877 0.000000 -0.962838 -0.141775 + 824 1.000000 1.000000 1.010000 0.237358 0.000000 -0.931822 -0.274534 + 825 1.000000 1.000000 1.010000 0.249805 0.000000 -0.886320 -0.389916 + 826 1.000000 1.000000 1.010000 0.265833 0.000000 -0.832646 -0.485833 + 827 1.000000 1.000000 1.010000 0.284983 0.000000 -0.776698 -0.561716 + 828 1.000000 1.000000 1.010000 0.306546 0.000000 -0.721786 -0.620527 + 829 1.000000 1.000000 1.010000 0.330026 0.000000 -0.670773 -0.664188 + 830 1.000000 1.000000 1.010000 0.355075 0.000000 -0.623095 -0.696903 + 831 1.000000 1.000000 1.010000 0.381034 0.000000 -0.581182 -0.719056 + 832 1.000000 1.000000 1.010000 0.407515 0.000000 -0.543152 -0.734110 + 833 1.000000 1.000000 1.010000 0.434668 0.000000 -0.509422 -0.742667 + 834 1.000000 1.000000 1.010000 0.461736 0.000000 -0.479377 -0.746323 + 835 1.000000 1.000000 1.010000 0.489070 0.000000 -0.452566 -0.745650 + 836 1.000000 1.000000 1.010000 0.516203 0.000000 -0.429031 -0.741260 + 837 1.000000 1.000000 1.010000 0.543219 0.000000 -0.407299 -0.734180 + 838 1.000000 1.000000 1.010000 0.569721 0.000000 -0.388580 -0.724171 + 839 1.000000 1.000000 1.010000 0.596092 0.000000 -0.371509 -0.711797 + 840 1.000000 1.000000 1.010000 0.621744 0.000000 -0.356092 -0.697591 + 841 1.000000 1.000000 1.010000 0.646959 0.000000 -0.342337 -0.681359 + 842 1.000000 1.000000 1.010000 0.671713 0.000000 -0.329428 -0.663535 + 843 1.000000 1.000000 1.010000 0.695501 0.000000 -0.318255 -0.644199 + 844 1.000000 1.000000 1.010000 0.718737 0.000000 -0.308192 -0.623245 + 845 1.000000 1.000000 1.010000 0.741201 0.000000 -0.298505 -0.601262 + 846 1.000000 1.000000 1.010000 0.762643 0.000000 -0.290258 -0.578036 + 847 1.000000 1.000000 1.010000 0.783371 0.000000 -0.282352 -0.553721 + 848 1.000000 1.000000 1.010000 0.803158 0.000000 -0.275473 -0.528253 + 849 1.000000 1.000000 1.010000 0.821879 0.000000 -0.269272 -0.502004 + 850 1.000000 1.000000 1.010000 0.839806 0.000000 -0.263688 -0.474547 + 851 1.000000 1.000000 1.010000 0.856557 0.000000 -0.258362 -0.446720 + 852 1.000000 1.000000 1.010000 0.872447 0.000000 -0.253415 -0.417872 + 853 1.000000 1.000000 1.010000 0.887080 0.000000 -0.249631 -0.388297 + 854 1.000000 1.000000 1.010000 0.900729 0.000000 -0.245672 -0.358236 + 855 1.000000 1.000000 1.010000 0.913264 0.000000 -0.242336 -0.327447 + 856 1.000000 1.000000 1.010000 0.924667 0.000000 -0.239220 -0.296250 + 857 1.000000 1.000000 1.010000 0.934913 0.000000 -0.236667 -0.264436 + 858 1.000000 1.000000 1.010000 0.943999 0.000000 -0.234235 -0.232379 + 859 1.000000 1.000000 1.010000 0.951881 0.000000 -0.232475 -0.199694 + 860 1.000000 1.000000 1.010000 0.958581 0.000000 -0.230825 -0.166862 + 861 1.000000 1.000000 1.010000 0.964095 0.000000 -0.229407 -0.133764 + 862 1.000000 1.000000 1.010000 0.968323 0.000000 -0.228602 -0.100456 + 863 1.000000 1.000000 1.010000 0.971399 0.000000 -0.227814 -0.066970 + 864 1.000000 1.000000 1.010000 0.973271 0.000000 -0.227237 -0.033281 + 865 1.000000 1.000000 1.010000 0.980749 0.000000 -0.195274 0.000216 + 866 1.000000 1.000000 1.010000 0.980176 0.000000 -0.195289 0.033437 + 867 1.000000 1.000000 1.010000 0.978408 0.000000 -0.195624 0.066705 + 868 1.000000 1.000000 1.010000 0.975457 0.000000 -0.196339 0.099670 + 869 1.000000 1.000000 1.010000 0.971369 0.000000 -0.197136 0.132591 + 870 1.000000 1.000000 1.010000 0.966108 0.000000 -0.198043 0.165574 + 871 1.000000 1.000000 1.010000 0.959680 0.000000 -0.199597 0.197927 + 872 1.000000 1.000000 1.010000 0.952116 0.000000 -0.201145 0.230249 + 873 1.000000 1.000000 1.010000 0.943480 0.000000 -0.202744 0.262183 + 874 1.000000 1.000000 1.010000 0.933692 0.000000 -0.204862 0.293684 + 875 1.000000 1.000000 1.010000 0.922817 0.000000 -0.207349 0.324676 + 876 1.000000 1.000000 1.010000 0.910804 0.000000 -0.210156 0.355346 + 877 1.000000 1.000000 1.010000 0.897661 0.000000 -0.213287 0.385633 + 878 1.000000 1.000000 1.010000 0.883559 0.000000 -0.216503 0.415270 + 879 1.000000 1.000000 1.010000 0.868330 0.000000 -0.220554 0.444251 + 880 1.000000 1.000000 1.010000 0.852162 0.000000 -0.224736 0.472560 + 881 1.000000 1.000000 1.010000 0.835010 0.000000 -0.229182 0.500235 + 882 1.000000 1.000000 1.010000 0.816860 0.000000 -0.234343 0.527089 + 883 1.000000 1.000000 1.010000 0.797826 0.000000 -0.239766 0.553161 + 884 1.000000 1.000000 1.010000 0.777859 0.000000 -0.246126 0.578237 + 885 1.000000 1.000000 1.010000 0.757072 0.000000 -0.252837 0.602424 + 886 1.000000 1.000000 1.010000 0.735390 0.000000 -0.260376 0.625624 + 887 1.000000 1.000000 1.010000 0.712897 0.000000 -0.268434 0.647859 + 888 1.000000 1.000000 1.010000 0.689671 0.000000 -0.277658 0.668775 + 889 1.000000 1.000000 1.010000 0.665876 0.000000 -0.287457 0.688461 + 890 1.000000 1.000000 1.010000 0.641197 0.000000 -0.298550 0.706919 + 891 1.000000 1.000000 1.010000 0.615927 0.000000 -0.310636 0.723975 + 892 1.000000 1.000000 1.010000 0.589999 0.000000 -0.324598 0.739282 + 893 1.000000 1.000000 1.010000 0.563704 0.000000 -0.339731 0.752875 + 894 1.000000 1.000000 1.010000 0.536875 0.000000 -0.356804 0.764498 + 895 1.000000 1.000000 1.010000 0.509940 0.000000 -0.375477 0.773937 + 896 1.000000 1.000000 1.010000 0.482451 0.000000 -0.396631 0.780977 + 897 1.000000 1.000000 1.010000 0.454746 0.000000 -0.421131 0.784764 + 898 1.000000 1.000000 1.010000 0.426997 0.000000 -0.448120 0.785405 + 899 1.000000 1.000000 1.010000 0.399206 0.000000 -0.479591 0.781426 + 900 1.000000 1.000000 1.010000 0.372041 0.000000 -0.514937 0.772286 + 901 1.000000 1.000000 1.010000 0.344900 0.000000 -0.555391 0.756693 + 902 1.000000 1.000000 1.010000 0.318570 0.000000 -0.601421 0.732670 + 903 1.000000 1.000000 1.010000 0.293118 0.000000 -0.653232 0.698119 + 904 1.000000 1.000000 1.010000 0.269518 0.000000 -0.710704 0.649815 + 905 1.000000 1.000000 1.010000 0.247513 0.000000 -0.773742 0.583148 + 906 1.000000 1.000000 1.010000 0.228381 0.000000 -0.838264 0.495132 + 907 1.000000 1.000000 1.010000 0.212876 0.000000 -0.899593 0.381335 + 908 1.000000 1.000000 1.010000 0.202060 0.000000 -0.948783 0.242861 + 909 1.000000 1.000000 1.010000 0.195899 0.000000 -0.977054 0.083602 + 910 1.000000 1.000000 1.010000 0.196012 0.000000 -0.977109 -0.082688 + 911 1.000000 1.000000 1.010000 0.201646 0.000000 -0.949374 -0.240889 + 912 1.000000 1.000000 1.010000 0.212744 0.000000 -0.899959 -0.380543 + 913 1.000000 1.000000 1.010000 0.228211 0.000000 -0.839081 -0.493824 + 914 1.000000 1.000000 1.010000 0.247654 0.000000 -0.774030 -0.582705 + 915 1.000000 1.000000 1.010000 0.269327 0.000000 -0.711401 -0.649132 + 916 1.000000 1.000000 1.010000 0.293098 0.000000 -0.653834 -0.697563 + 917 1.000000 1.000000 1.010000 0.318376 0.000000 -0.601632 -0.732582 + 918 1.000000 1.000000 1.010000 0.344589 0.000000 -0.555895 -0.756464 + 919 1.000000 1.000000 1.010000 0.371848 0.000000 -0.515455 -0.772034 + 920 1.000000 1.000000 1.010000 0.399233 0.000000 -0.479609 -0.781401 + 921 1.000000 1.000000 1.010000 0.426901 0.000000 -0.448372 -0.785314 + 922 1.000000 1.000000 1.010000 0.454476 0.000000 -0.421704 -0.784613 + 923 1.000000 1.000000 1.010000 0.482165 0.000000 -0.397583 -0.780669 + 924 1.000000 1.000000 1.010000 0.509616 0.000000 -0.375726 -0.774029 + 925 1.000000 1.000000 1.010000 0.536882 0.000000 -0.356809 -0.764490 + 926 1.000000 1.000000 1.010000 0.563617 0.000000 -0.339659 -0.752972 + 927 1.000000 1.000000 1.010000 0.590054 0.000000 -0.324678 -0.739203 + 928 1.000000 1.000000 1.010000 0.615911 0.000000 -0.311083 -0.723797 + 929 1.000000 1.000000 1.010000 0.641073 0.000000 -0.298652 -0.706989 + 930 1.000000 1.000000 1.010000 0.665737 0.000000 -0.287875 -0.688420 + 931 1.000000 1.000000 1.010000 0.689630 0.000000 -0.277981 -0.668683 + 932 1.000000 1.000000 1.010000 0.712856 0.000000 -0.268696 -0.647796 + 933 1.000000 1.000000 1.010000 0.735406 0.000000 -0.260431 -0.625582 + 934 1.000000 1.000000 1.010000 0.757106 0.000000 -0.252871 -0.602368 + 935 1.000000 1.000000 1.010000 0.778012 0.000000 -0.246089 -0.578046 + 936 1.000000 1.000000 1.010000 0.798010 0.000000 -0.239964 -0.552809 + 937 1.000000 1.000000 1.010000 0.817083 0.000000 -0.234414 -0.526711 + 938 1.000000 1.000000 1.010000 0.835110 0.000000 -0.229201 -0.500058 + 939 1.000000 1.000000 1.010000 0.852281 0.000000 -0.224817 -0.472308 + 940 1.000000 1.000000 1.010000 0.868497 0.000000 -0.220285 -0.444058 + 941 1.000000 1.000000 1.010000 0.883643 0.000000 -0.216814 -0.414931 + 942 1.000000 1.000000 1.010000 0.897821 0.000000 -0.213140 -0.385343 + 943 1.000000 1.000000 1.010000 0.910873 0.000000 -0.210143 -0.355176 + 944 1.000000 1.000000 1.010000 0.922821 0.000000 -0.207601 -0.324504 + 945 1.000000 1.000000 1.010000 0.933765 0.000000 -0.205038 -0.293330 + 946 1.000000 1.000000 1.010000 0.943525 0.000000 -0.202921 -0.261884 + 947 1.000000 1.000000 1.010000 0.952229 0.000000 -0.201073 -0.229846 + 948 1.000000 1.000000 1.010000 0.959717 0.000000 -0.199597 -0.197748 + 949 1.000000 1.000000 1.010000 0.966207 0.000000 -0.198051 -0.164985 + 950 1.000000 1.000000 1.010000 0.971406 0.000000 -0.197165 -0.132271 + 951 1.000000 1.000000 1.010000 0.975467 0.000000 -0.196409 -0.099439 + 952 1.000000 1.000000 1.010000 0.978441 0.000000 -0.195577 -0.066346 + 953 1.000000 1.000000 1.010000 0.980174 0.000000 -0.195342 -0.033162 + 954 1.000000 1.000000 1.010000 0.986612 0.000000 -0.163086 0.000051 + 955 1.000000 1.000000 1.010000 0.986076 0.000000 -0.162953 0.033179 + 956 1.000000 1.000000 1.010000 0.984332 0.000000 -0.163297 0.066521 + 957 1.000000 1.000000 1.010000 0.981502 0.000000 -0.163778 0.099146 + 958 1.000000 1.000000 1.010000 0.977451 0.000000 -0.164556 0.132328 + 959 1.000000 1.000000 1.010000 0.972374 0.000000 -0.165420 0.164697 + 960 1.000000 1.000000 1.010000 0.966047 0.000000 -0.166534 0.197534 + 961 1.000000 1.000000 1.010000 0.958788 0.000000 -0.167540 0.229467 + 962 1.000000 1.000000 1.010000 0.950294 0.000000 -0.169069 0.261450 + 963 1.000000 1.000000 1.010000 0.940630 0.000000 -0.171042 0.293189 + 964 1.000000 1.000000 1.010000 0.930002 0.000000 -0.172981 0.324305 + 965 1.000000 1.000000 1.010000 0.918324 0.000000 -0.175217 0.354936 + 966 1.000000 1.000000 1.010000 0.905528 0.000000 -0.177703 0.385281 + 967 1.000000 1.000000 1.010000 0.891679 0.000000 -0.180440 0.415150 + 968 1.000000 1.000000 1.010000 0.876874 0.000000 -0.183243 0.444425 + 969 1.000000 1.000000 1.010000 0.861070 0.000000 -0.186806 0.472930 + 970 1.000000 1.000000 1.010000 0.844259 0.000000 -0.190614 0.500892 + 971 1.000000 1.000000 1.010000 0.826425 0.000000 -0.194579 0.528356 + 972 1.000000 1.000000 1.010000 0.807940 0.000000 -0.199110 0.554606 + 973 1.000000 1.000000 1.010000 0.788296 0.000000 -0.204064 0.580472 + 974 1.000000 1.000000 1.010000 0.767867 0.000000 -0.209504 0.605382 + 975 1.000000 1.000000 1.010000 0.746386 0.000000 -0.215239 0.629746 + 976 1.000000 1.000000 1.010000 0.724428 0.000000 -0.221915 0.652655 + 977 1.000000 1.000000 1.010000 0.701493 0.000000 -0.229210 0.674811 + 978 1.000000 1.000000 1.010000 0.677787 0.000000 -0.237200 0.695946 + 979 1.000000 1.000000 1.010000 0.653401 0.000000 -0.246105 0.715891 + 980 1.000000 1.000000 1.010000 0.628333 0.000000 -0.256007 0.734614 + 981 1.000000 1.000000 1.010000 0.602796 0.000000 -0.266728 0.751993 + 982 1.000000 1.000000 1.010000 0.576437 0.000000 -0.278948 0.768055 + 983 1.000000 1.000000 1.010000 0.549612 0.000000 -0.292374 0.782588 + 984 1.000000 1.000000 1.010000 0.522489 0.000000 -0.307778 0.795159 + 985 1.000000 1.000000 1.010000 0.494875 0.000000 -0.324931 0.805927 + 986 1.000000 1.000000 1.010000 0.466868 0.000000 -0.344602 0.814422 + 987 1.000000 1.000000 1.010000 0.438714 0.000000 -0.366457 0.820512 + 988 1.000000 1.000000 1.010000 0.410301 0.000000 -0.391812 0.823490 + 989 1.000000 1.000000 1.010000 0.381791 0.000000 -0.421709 0.822434 + 990 1.000000 1.000000 1.010000 0.353672 0.000000 -0.454958 0.817270 + 991 1.000000 1.000000 1.010000 0.325476 0.000000 -0.494677 0.805829 + 992 1.000000 1.000000 1.010000 0.297999 0.000000 -0.540126 0.787058 + 993 1.000000 1.000000 1.010000 0.271199 0.000000 -0.593124 0.758060 + 994 1.000000 1.000000 1.010000 0.245825 0.000000 -0.654116 0.715334 + 995 1.000000 1.000000 1.010000 0.222159 0.000000 -0.724297 0.652717 + 996 1.000000 1.000000 1.010000 0.200999 0.000000 -0.800521 0.564593 + 997 1.000000 1.000000 1.010000 0.183623 0.000000 -0.876846 0.444325 + 998 1.000000 1.000000 1.010000 0.170864 0.000000 -0.942162 0.288335 + 999 1.000000 1.000000 1.010000 0.163895 0.000000 -0.981390 0.100060 + 1000 1.000000 1.000000 1.010000 0.164019 0.000000 -0.981458 -0.099181 + 1001 1.000000 1.000000 1.010000 0.170578 0.000000 -0.942980 -0.285818 + 1002 1.000000 1.000000 1.010000 0.183412 0.000000 -0.878084 -0.441960 + 1003 1.000000 1.000000 1.010000 0.200838 0.000000 -0.801603 -0.563113 + 1004 1.000000 1.000000 1.010000 0.221837 0.000000 -0.725021 -0.652023 + 1005 1.000000 1.000000 1.010000 0.245612 0.000000 -0.654911 -0.714679 + 1006 1.000000 1.000000 1.010000 0.271211 0.000000 -0.593867 -0.757474 + 1007 1.000000 1.000000 1.010000 0.297772 0.000000 -0.540609 -0.786813 + 1008 1.000000 1.000000 1.010000 0.325154 0.000000 -0.495119 -0.805687 + 1009 1.000000 1.000000 1.010000 0.353292 0.000000 -0.455519 -0.817121 + 1010 1.000000 1.000000 1.010000 0.381599 0.000000 -0.422008 -0.822369 + 1011 1.000000 1.000000 1.010000 0.409987 0.000000 -0.392582 -0.823280 + 1012 1.000000 1.000000 1.010000 0.438609 0.000000 -0.366887 -0.820375 + 1013 1.000000 1.000000 1.010000 0.466666 0.000000 -0.345148 -0.814307 + 1014 1.000000 1.000000 1.010000 0.494727 0.000000 -0.325356 -0.805847 + 1015 1.000000 1.000000 1.010000 0.522408 0.000000 -0.307943 -0.795148 + 1016 1.000000 1.000000 1.010000 0.549584 0.000000 -0.292776 -0.782457 + 1017 1.000000 1.000000 1.010000 0.576350 0.000000 -0.279360 -0.767971 + 1018 1.000000 1.000000 1.010000 0.602746 0.000000 -0.267164 -0.751878 + 1019 1.000000 1.000000 1.010000 0.628242 0.000000 -0.256386 -0.734560 + 1020 1.000000 1.000000 1.010000 0.653461 0.000000 -0.246275 -0.715778 + 1021 1.000000 1.000000 1.010000 0.677687 0.000000 -0.237480 -0.695948 + 1022 1.000000 1.000000 1.010000 0.701392 0.000000 -0.229189 -0.674923 + 1023 1.000000 1.000000 1.010000 0.724251 0.000000 -0.222364 -0.652698 + 1024 1.000000 1.000000 1.010000 0.746518 0.000000 -0.215524 -0.629492 + 1025 1.000000 1.000000 1.010000 0.767747 0.000000 -0.209600 -0.605502 + 1026 1.000000 1.000000 1.010000 0.788222 0.000000 -0.204315 -0.580484 + 1027 1.000000 1.000000 1.010000 0.807945 0.000000 -0.199091 -0.554605 + 1028 1.000000 1.000000 1.010000 0.826589 0.000000 -0.194754 -0.528035 + 1029 1.000000 1.000000 1.010000 0.844385 0.000000 -0.190472 -0.500734 + 1030 1.000000 1.000000 1.010000 0.861147 0.000000 -0.186764 -0.472805 + 1031 1.000000 1.000000 1.010000 0.877028 0.000000 -0.183507 -0.444012 + 1032 1.000000 1.000000 1.010000 0.891788 0.000000 -0.180432 -0.414919 + 1033 1.000000 1.000000 1.010000 0.905690 0.000000 -0.177457 -0.385013 + 1034 1.000000 1.000000 1.010000 0.918410 0.000000 -0.175015 -0.354814 + 1035 1.000000 1.000000 1.010000 0.930093 0.000000 -0.173055 -0.324006 + 1036 1.000000 1.000000 1.010000 0.940808 0.000000 -0.171032 -0.292624 + 1037 1.000000 1.000000 1.010000 0.950331 0.000000 -0.169329 -0.261149 + 1038 1.000000 1.000000 1.010000 0.958785 0.000000 -0.167674 -0.229384 + 1039 1.000000 1.000000 1.010000 0.966189 0.000000 -0.166318 -0.197021 + 1040 1.000000 1.000000 1.010000 0.972409 0.000000 -0.165429 -0.164480 + 1041 1.000000 1.000000 1.010000 0.977519 0.000000 -0.164403 -0.132018 + 1042 1.000000 1.000000 1.010000 0.981500 0.000000 -0.163809 -0.099116 + 1043 1.000000 1.000000 1.010000 0.984373 0.000000 -0.163294 -0.065917 + 1044 1.000000 1.000000 1.010000 0.986054 0.000000 -0.163107 -0.033072 + 1045 1.000000 1.000000 1.010000 0.991422 0.000000 -0.130703 0.000296 + 1046 1.000000 1.000000 1.010000 0.990865 0.000000 -0.130712 0.033190 + 1047 1.000000 1.000000 1.010000 0.989209 0.000000 -0.130917 0.065770 + 1048 1.000000 1.000000 1.010000 0.986432 0.000000 -0.131231 0.098641 + 1049 1.000000 1.000000 1.010000 0.982557 0.000000 -0.131721 0.131268 + 1050 1.000000 1.000000 1.010000 0.977572 0.000000 -0.132353 0.163815 + 1051 1.000000 1.000000 1.010000 0.971507 0.000000 -0.133354 0.195936 + 1052 1.000000 1.000000 1.010000 0.964337 0.000000 -0.134217 0.228121 + 1053 1.000000 1.000000 1.010000 0.956046 0.000000 -0.135545 0.260005 + 1054 1.000000 1.000000 1.010000 0.946694 0.000000 -0.136787 0.291650 + 1055 1.000000 1.000000 1.010000 0.936433 0.000000 -0.138153 0.322502 + 1056 1.000000 1.000000 1.010000 0.924993 0.000000 -0.140004 0.353252 + 1057 1.000000 1.000000 1.010000 0.912571 0.000000 -0.142053 0.383451 + 1058 1.000000 1.000000 1.010000 0.899159 0.000000 -0.143976 0.413260 + 1059 1.000000 1.000000 1.010000 0.884713 0.000000 -0.146494 0.442518 + 1060 1.000000 1.000000 1.010000 0.869211 0.000000 -0.149065 0.471436 + 1061 1.000000 1.000000 1.010000 0.852767 0.000000 -0.151949 0.499700 + 1062 1.000000 1.000000 1.010000 0.835381 0.000000 -0.154952 0.527379 + 1063 1.000000 1.000000 1.010000 0.817150 0.000000 -0.158469 0.554214 + 1064 1.000000 1.000000 1.010000 0.797935 0.000000 -0.162251 0.580495 + 1065 1.000000 1.000000 1.010000 0.777930 0.000000 -0.166442 0.605906 + 1066 1.000000 1.000000 1.010000 0.757169 0.000000 -0.170929 0.630459 + 1067 1.000000 1.000000 1.010000 0.735549 0.000000 -0.176076 0.654191 + 1068 1.000000 1.000000 1.010000 0.712931 0.000000 -0.181452 0.677351 + 1069 1.000000 1.000000 1.010000 0.689694 0.000000 -0.187890 0.699300 + 1070 1.000000 1.000000 1.010000 0.665871 0.000000 -0.194286 0.720325 + 1071 1.000000 1.000000 1.010000 0.641214 0.000000 -0.202147 0.740258 + 1072 1.000000 1.000000 1.010000 0.615772 0.000000 -0.210614 0.759254 + 1073 1.000000 1.000000 1.010000 0.589950 0.000000 -0.219469 0.777041 + 1074 1.000000 1.000000 1.010000 0.563382 0.000000 -0.230176 0.793486 + 1075 1.000000 1.000000 1.010000 0.536242 0.000000 -0.241764 0.808699 + 1076 1.000000 1.000000 1.010000 0.508684 0.000000 -0.255027 0.822315 + 1077 1.000000 1.000000 1.010000 0.480656 0.000000 -0.269228 0.834557 + 1078 1.000000 1.000000 1.010000 0.452257 0.000000 -0.286083 0.844760 + 1079 1.000000 1.000000 1.010000 0.423592 0.000000 -0.305761 0.852690 + 1080 1.000000 1.000000 1.010000 0.394685 0.000000 -0.328193 0.858203 + 1081 1.000000 1.000000 1.010000 0.365710 0.000000 -0.354015 0.860773 + 1082 1.000000 1.000000 1.010000 0.336745 0.000000 -0.384993 0.859292 + 1083 1.000000 1.000000 1.010000 0.307613 0.000000 -0.421073 0.853271 + 1084 1.000000 1.000000 1.010000 0.279058 0.000000 -0.464321 0.840555 + 1085 1.000000 1.000000 1.010000 0.250903 0.000000 -0.516231 0.818873 + 1086 1.000000 1.000000 1.010000 0.223962 0.000000 -0.578376 0.784425 + 1087 1.000000 1.000000 1.010000 0.198273 0.000000 -0.654265 0.729812 + 1088 1.000000 1.000000 1.010000 0.174762 0.000000 -0.740454 0.648989 + 1089 1.000000 1.000000 1.010000 0.154779 0.000000 -0.836718 0.525306 + 1090 1.000000 1.000000 1.010000 0.140001 0.000000 -0.925747 0.351273 + 1091 1.000000 1.000000 1.010000 0.131882 0.000000 -0.983458 0.124170 + 1092 1.000000 1.000000 1.010000 0.131699 0.000000 -0.983753 -0.122008 + 1093 1.000000 1.000000 1.010000 0.140002 0.000000 -0.926626 -0.348946 + 1094 1.000000 1.000000 1.010000 0.154868 0.000000 -0.838088 -0.523091 + 1095 1.000000 1.000000 1.010000 0.174600 0.000000 -0.742122 -0.647124 + 1096 1.000000 1.000000 1.010000 0.198121 0.000000 -0.654944 -0.729244 + 1097 1.000000 1.000000 1.010000 0.223605 0.000000 -0.579017 -0.784054 + 1098 1.000000 1.000000 1.010000 0.250671 0.000000 -0.517347 -0.818240 + 1099 1.000000 1.000000 1.010000 0.278883 0.000000 -0.464776 -0.840361 + 1100 1.000000 1.000000 1.010000 0.307517 0.000000 -0.421687 -0.853003 + 1101 1.000000 1.000000 1.010000 0.336574 0.000000 -0.385101 -0.859311 + 1102 1.000000 1.000000 1.010000 0.365568 0.000000 -0.354331 -0.860703 + 1103 1.000000 1.000000 1.010000 0.394407 0.000000 -0.328299 -0.858291 + 1104 1.000000 1.000000 1.010000 0.423483 0.000000 -0.306284 -0.852556 + 1105 1.000000 1.000000 1.010000 0.452322 0.000000 -0.286777 -0.844490 + 1106 1.000000 1.000000 1.010000 0.480564 0.000000 -0.269901 -0.834393 + 1107 1.000000 1.000000 1.010000 0.508386 0.000000 -0.254940 -0.822526 + 1108 1.000000 1.000000 1.010000 0.536134 0.000000 -0.241954 -0.808714 + 1109 1.000000 1.000000 1.010000 0.563234 0.000000 -0.230195 -0.793585 + 1110 1.000000 1.000000 1.010000 0.589739 0.000000 -0.219718 -0.777130 + 1111 1.000000 1.000000 1.010000 0.615646 0.000000 -0.210569 -0.759368 + 1112 1.000000 1.000000 1.010000 0.640963 0.000000 -0.202156 -0.740472 + 1113 1.000000 1.000000 1.010000 0.665760 0.000000 -0.194818 -0.720284 + 1114 1.000000 1.000000 1.010000 0.689704 0.000000 -0.188155 -0.699218 + 1115 1.000000 1.000000 1.010000 0.712999 0.000000 -0.181675 -0.677220 + 1116 1.000000 1.000000 1.010000 0.735408 0.000000 -0.176426 -0.654255 + 1117 1.000000 1.000000 1.010000 0.757102 0.000000 -0.171257 -0.630451 + 1118 1.000000 1.000000 1.010000 0.778115 0.000000 -0.166338 -0.605696 + 1119 1.000000 1.000000 1.010000 0.798143 0.000000 -0.162240 -0.580211 + 1120 1.000000 1.000000 1.010000 0.817338 0.000000 -0.158707 -0.553869 + 1121 1.000000 1.000000 1.010000 0.835473 0.000000 -0.155126 -0.527182 + 1122 1.000000 1.000000 1.010000 0.852849 0.000000 -0.152132 -0.499505 + 1123 1.000000 1.000000 1.010000 0.869251 0.000000 -0.149228 -0.471311 + 1124 1.000000 1.000000 1.010000 0.884693 0.000000 -0.146263 -0.442636 + 1125 1.000000 1.000000 1.010000 0.899141 0.000000 -0.144228 -0.413211 + 1126 1.000000 1.000000 1.010000 0.912670 0.000000 -0.142009 -0.383233 + 1127 1.000000 1.000000 1.010000 0.925016 0.000000 -0.140214 -0.353109 + 1128 1.000000 1.000000 1.010000 0.936424 0.000000 -0.138405 -0.322418 + 1129 1.000000 1.000000 1.010000 0.946834 0.000000 -0.136865 -0.291160 + 1130 1.000000 1.000000 1.010000 0.956182 0.000000 -0.135348 -0.259607 + 1131 1.000000 1.000000 1.010000 0.964409 0.000000 -0.134268 -0.227789 + 1132 1.000000 1.000000 1.010000 0.971516 0.000000 -0.133204 -0.195995 + 1133 1.000000 1.000000 1.010000 0.977614 0.000000 -0.132509 -0.163437 + 1134 1.000000 1.000000 1.010000 0.982580 0.000000 -0.131803 -0.131009 + 1135 1.000000 1.000000 1.010000 0.986472 0.000000 -0.131248 -0.098220 + 1136 1.000000 1.000000 1.010000 0.989216 0.000000 -0.130902 -0.065693 + 1137 1.000000 1.000000 1.010000 0.990892 0.000000 -0.130605 -0.032792 + 1138 1.000000 1.000000 1.010000 0.995155 0.000000 -0.098314 0.000017 + 1139 1.000000 1.000000 1.010000 0.994602 0.000000 -0.098350 0.033088 + 1140 1.000000 1.000000 1.010000 0.992949 0.000000 -0.098419 0.066073 + 1141 1.000000 1.000000 1.010000 0.990233 0.000000 -0.098472 0.098703 + 1142 1.000000 1.000000 1.010000 0.986362 0.000000 -0.099157 0.131371 + 1143 1.000000 1.000000 1.010000 0.981444 0.000000 -0.099544 0.163888 + 1144 1.000000 1.000000 1.010000 0.975435 0.000000 -0.099966 0.196300 + 1145 1.000000 1.000000 1.010000 0.968282 0.000000 -0.101020 0.228527 + 1146 1.000000 1.000000 1.010000 0.960173 0.000000 -0.101628 0.260270 + 1147 1.000000 1.000000 1.010000 0.950903 0.000000 -0.102832 0.291906 + 1148 1.000000 1.000000 1.010000 0.940611 0.000000 -0.103802 0.323228 + 1149 1.000000 1.000000 1.010000 0.929336 0.000000 -0.105073 0.353970 + 1150 1.000000 1.000000 1.010000 0.917038 0.000000 -0.106461 0.384327 + 1151 1.000000 1.000000 1.010000 0.903720 0.000000 -0.108094 0.414253 + 1152 1.000000 1.000000 1.010000 0.889340 0.000000 -0.109684 0.443896 + 1153 1.000000 1.000000 1.010000 0.874001 0.000000 -0.111786 0.472891 + 1154 1.000000 1.000000 1.010000 0.857775 0.000000 -0.113679 0.501298 + 1155 1.000000 1.000000 1.010000 0.840482 0.000000 -0.116205 0.529231 + 1156 1.000000 1.000000 1.010000 0.822421 0.000000 -0.118745 0.556349 + 1157 1.000000 1.000000 1.010000 0.803387 0.000000 -0.121546 0.582920 + 1158 1.000000 1.000000 1.010000 0.783530 0.000000 -0.124805 0.608690 + 1159 1.000000 1.000000 1.010000 0.762659 0.000000 -0.128258 0.633957 + 1160 1.000000 1.000000 1.010000 0.741165 0.000000 -0.132020 0.658213 + 1161 1.000000 1.000000 1.010000 0.718791 0.000000 -0.136021 0.681790 + 1162 1.000000 1.000000 1.010000 0.695501 0.000000 -0.140341 0.704686 + 1163 1.000000 1.000000 1.010000 0.671658 0.000000 -0.145169 0.726499 + 1164 1.000000 1.000000 1.010000 0.647145 0.000000 -0.150759 0.747312 + 1165 1.000000 1.000000 1.010000 0.621698 0.000000 -0.157200 0.767320 + 1166 1.000000 1.000000 1.010000 0.595700 0.000000 -0.164055 0.786274 + 1167 1.000000 1.000000 1.010000 0.569167 0.000000 -0.171600 0.804116 + 1168 1.000000 1.000000 1.010000 0.542000 0.000000 -0.180306 0.820808 + 1169 1.000000 1.000000 1.010000 0.514469 0.000000 -0.190101 0.836172 + 1170 1.000000 1.000000 1.010000 0.486080 0.000000 -0.200845 0.850522 + 1171 1.000000 1.000000 1.010000 0.457581 0.000000 -0.213306 0.863204 + 1172 1.000000 1.000000 1.010000 0.428472 0.000000 -0.227779 0.874373 + 1173 1.000000 1.000000 1.010000 0.399141 0.000000 -0.244897 0.883579 + 1174 1.000000 1.000000 1.010000 0.369453 0.000000 -0.264703 0.890751 + 1175 1.000000 1.000000 1.010000 0.339737 0.000000 -0.287413 0.895529 + 1176 1.000000 1.000000 1.010000 0.309709 0.000000 -0.315825 0.896847 + 1177 1.000000 1.000000 1.010000 0.279625 0.000000 -0.349524 0.894227 + 1178 1.000000 1.000000 1.010000 0.249795 0.000000 -0.391172 0.885769 + 1179 1.000000 1.000000 1.010000 0.220498 0.000000 -0.443897 0.868526 + 1180 1.000000 1.000000 1.010000 0.191930 0.000000 -0.509568 0.838751 + 1181 1.000000 1.000000 1.010000 0.164637 0.000000 -0.594476 0.787079 + 1182 1.000000 1.000000 1.010000 0.139651 0.000000 -0.698734 0.701618 + 1183 1.000000 1.000000 1.010000 0.118687 0.000000 -0.824619 0.553098 + 1184 1.000000 1.000000 1.010000 0.103552 0.000000 -0.942542 0.317634 + 1185 1.000000 1.000000 1.010000 0.098096 0.000000 -0.995173 0.002828 + 1186 1.000000 1.000000 1.010000 0.103614 0.000000 -0.943814 -0.313815 + 1187 1.000000 1.000000 1.010000 0.118241 0.000000 -0.826044 -0.551062 + 1188 1.000000 1.000000 1.010000 0.139421 0.000000 -0.700573 -0.699829 + 1189 1.000000 1.000000 1.010000 0.164520 0.000000 -0.594663 -0.786962 + 1190 1.000000 1.000000 1.010000 0.191734 0.000000 -0.509342 -0.838933 + 1191 1.000000 1.000000 1.010000 0.220364 0.000000 -0.443767 -0.868625 + 1192 1.000000 1.000000 1.010000 0.249675 0.000000 -0.391541 -0.885640 + 1193 1.000000 1.000000 1.010000 0.279363 0.000000 -0.349615 -0.894274 + 1194 1.000000 1.000000 1.010000 0.309405 0.000000 -0.316329 -0.896774 + 1195 1.000000 1.000000 1.010000 0.339275 0.000000 -0.288130 -0.895474 + 1196 1.000000 1.000000 1.010000 0.369194 0.000000 -0.264474 -0.890926 + 1197 1.000000 1.000000 1.010000 0.398878 0.000000 -0.244789 -0.883728 + 1198 1.000000 1.000000 1.010000 0.428299 0.000000 -0.227987 -0.874404 + 1199 1.000000 1.000000 1.010000 0.457297 0.000000 -0.213798 -0.863232 + 1200 1.000000 1.000000 1.010000 0.486109 0.000000 -0.200876 -0.850498 + 1201 1.000000 1.000000 1.010000 0.514188 0.000000 -0.190111 -0.836342 + 1202 1.000000 1.000000 1.010000 0.541964 0.000000 -0.180446 -0.820801 + 1203 1.000000 1.000000 1.010000 0.569179 0.000000 -0.172012 -0.804019 + 1204 1.000000 1.000000 1.010000 0.595613 0.000000 -0.164281 -0.786293 + 1205 1.000000 1.000000 1.010000 0.621630 0.000000 -0.157020 -0.767411 + 1206 1.000000 1.000000 1.010000 0.647096 0.000000 -0.151266 -0.747252 + 1207 1.000000 1.000000 1.010000 0.671513 0.000000 -0.145742 -0.726519 + 1208 1.000000 1.000000 1.010000 0.695657 0.000000 -0.140506 -0.704500 + 1209 1.000000 1.000000 1.010000 0.718648 0.000000 -0.136228 -0.681899 + 1210 1.000000 1.000000 1.010000 0.741168 0.000000 -0.131816 -0.658251 + 1211 1.000000 1.000000 1.010000 0.762734 0.000000 -0.128284 -0.633862 + 1212 1.000000 1.000000 1.010000 0.783521 0.000000 -0.124492 -0.608767 + 1213 1.000000 1.000000 1.010000 0.803384 0.000000 -0.121631 -0.582906 + 1214 1.000000 1.000000 1.010000 0.822507 0.000000 -0.118695 -0.556232 + 1215 1.000000 1.000000 1.010000 0.840680 0.000000 -0.116183 -0.528923 + 1216 1.000000 1.000000 1.010000 0.857767 0.000000 -0.113827 -0.501278 + 1217 1.000000 1.000000 1.010000 0.874077 0.000000 -0.111871 -0.472730 + 1218 1.000000 1.000000 1.010000 0.889508 0.000000 -0.109912 -0.443502 + 1219 1.000000 1.000000 1.010000 0.903739 0.000000 -0.108035 -0.414227 + 1220 1.000000 1.000000 1.010000 0.917093 0.000000 -0.106403 -0.384211 + 1221 1.000000 1.000000 1.010000 0.929429 0.000000 -0.104970 -0.353755 + 1222 1.000000 1.000000 1.010000 0.940683 0.000000 -0.103711 -0.323048 + 1223 1.000000 1.000000 1.010000 0.951032 0.000000 -0.102611 -0.291564 + 1224 1.000000 1.000000 1.010000 0.960223 0.000000 -0.101593 -0.260097 + 1225 1.000000 1.000000 1.010000 0.968377 0.000000 -0.101056 -0.228108 + 1226 1.000000 1.000000 1.010000 0.975425 0.000000 -0.100237 -0.196213 + 1227 1.000000 1.000000 1.010000 0.981456 0.000000 -0.099618 -0.163769 + 1228 1.000000 1.000000 1.010000 0.986420 0.000000 -0.098902 -0.131127 + 1229 1.000000 1.000000 1.010000 0.990247 0.000000 -0.098490 -0.098541 + 1230 1.000000 1.000000 1.010000 0.992990 0.000000 -0.098318 -0.065607 + 1231 1.000000 1.000000 1.010000 0.994617 0.000000 -0.098303 -0.032780 + 1232 1.000000 1.000000 1.010000 0.997839 0.000000 -0.065706 0.000256 + 1233 1.000000 1.000000 1.010000 0.997287 0.000000 -0.065763 0.033065 + 1234 1.000000 1.000000 1.010000 0.995673 0.000000 -0.065644 0.065775 + 1235 1.000000 1.000000 1.010000 0.992965 0.000000 -0.065788 0.098455 + 1236 1.000000 1.000000 1.010000 0.989172 0.000000 -0.066002 0.131079 + 1237 1.000000 1.000000 1.010000 0.984257 0.000000 -0.066519 0.163748 + 1238 1.000000 1.000000 1.010000 0.978343 0.000000 -0.066912 0.195876 + 1239 1.000000 1.000000 1.010000 0.971358 0.000000 -0.067207 0.227920 + 1240 1.000000 1.000000 1.010000 0.963255 0.000000 -0.067888 0.259869 + 1241 1.000000 1.000000 1.010000 0.954123 0.000000 -0.068381 0.291503 + 1242 1.000000 1.000000 1.010000 0.944004 0.000000 -0.069354 0.322562 + 1243 1.000000 1.000000 1.010000 0.932779 0.000000 -0.070207 0.353545 + 1244 1.000000 1.000000 1.010000 0.920714 0.000000 -0.071166 0.383695 + 1245 1.000000 1.000000 1.010000 0.907504 0.000000 -0.072164 0.413798 + 1246 1.000000 1.000000 1.010000 0.893323 0.000000 -0.073160 0.443420 + 1247 1.000000 1.000000 1.010000 0.878187 0.000000 -0.074416 0.472494 + 1248 1.000000 1.000000 1.010000 0.862000 0.000000 -0.075704 0.501223 + 1249 1.000000 1.000000 1.010000 0.845108 0.000000 -0.077501 0.528947 + 1250 1.000000 1.000000 1.010000 0.827187 0.000000 -0.078924 0.556356 + 1251 1.000000 1.000000 1.010000 0.808217 0.000000 -0.080717 0.583326 + 1252 1.000000 1.000000 1.010000 0.788551 0.000000 -0.082838 0.609364 + 1253 1.000000 1.000000 1.010000 0.768075 0.000000 -0.085326 0.634650 + 1254 1.000000 1.000000 1.010000 0.746637 0.000000 -0.087681 0.659428 + 1255 1.000000 1.000000 1.010000 0.724465 0.000000 -0.090227 0.683381 + 1256 1.000000 1.000000 1.010000 0.701393 0.000000 -0.093405 0.706628 + 1257 1.000000 1.000000 1.010000 0.677677 0.000000 -0.096576 0.728991 + 1258 1.000000 1.000000 1.010000 0.653216 0.000000 -0.100217 0.750510 + 1259 1.000000 1.000000 1.010000 0.627980 0.000000 -0.104152 0.771228 + 1260 1.000000 1.000000 1.010000 0.602316 0.000000 -0.108847 0.790802 + 1261 1.000000 1.000000 1.010000 0.575804 0.000000 -0.113770 0.809634 + 1262 1.000000 1.000000 1.010000 0.548791 0.000000 -0.118877 0.827464 + 1263 1.000000 1.000000 1.010000 0.520964 0.000000 -0.125365 0.844322 + 1264 1.000000 1.000000 1.010000 0.492781 0.000000 -0.132738 0.859970 + 1265 1.000000 1.000000 1.010000 0.464239 0.000000 -0.140964 0.874420 + 1266 1.000000 1.000000 1.010000 0.435014 0.000000 -0.150240 0.887801 + 1267 1.000000 1.000000 1.010000 0.405653 0.000000 -0.161228 0.899695 + 1268 1.000000 1.000000 1.010000 0.375596 0.000000 -0.174148 0.910275 + 1269 1.000000 1.000000 1.010000 0.345262 0.000000 -0.189209 0.919236 + 1270 1.000000 1.000000 1.010000 0.314811 0.000000 -0.208261 0.926025 + 1271 1.000000 1.000000 1.010000 0.283931 0.000000 -0.230257 0.930787 + 1272 1.000000 1.000000 1.010000 0.253418 0.000000 -0.258626 0.932143 + 1273 1.000000 1.000000 1.010000 0.222483 0.000000 -0.293392 0.929743 + 1274 1.000000 1.000000 1.010000 0.191892 0.000000 -0.340991 0.920273 + 1275 1.000000 1.000000 1.010000 0.161580 0.000000 -0.404310 0.900236 + 1276 1.000000 1.000000 1.010000 0.132404 0.000000 -0.493764 0.859457 + 1277 1.000000 1.000000 1.010000 0.105381 0.000000 -0.622552 0.775451 + 1278 1.000000 1.000000 1.010000 0.082390 0.000000 -0.795944 0.599738 + 1279 1.000000 1.000000 1.010000 0.067574 0.000000 -0.967011 0.245608 + 1280 1.000000 1.000000 1.010000 0.067629 0.000000 -0.968190 -0.240905 + 1281 1.000000 1.000000 1.010000 0.082018 0.000000 -0.797403 -0.597848 + 1282 1.000000 1.000000 1.010000 0.105176 0.000000 -0.623579 -0.774653 + 1283 1.000000 1.000000 1.010000 0.132114 0.000000 -0.494491 -0.859084 + 1284 1.000000 1.000000 1.010000 0.161365 0.000000 -0.406263 -0.899395 + 1285 1.000000 1.000000 1.010000 0.191491 0.000000 -0.341161 -0.920294 + 1286 1.000000 1.000000 1.010000 0.222179 0.000000 -0.294933 -0.929328 + 1287 1.000000 1.000000 1.010000 0.252956 0.000000 -0.258457 -0.932316 + 1288 1.000000 1.000000 1.010000 0.283949 0.000000 -0.230149 -0.930808 + 1289 1.000000 1.000000 1.010000 0.314507 0.000000 -0.207822 -0.926226 + 1290 1.000000 1.000000 1.010000 0.345315 0.000000 -0.190017 -0.919049 + 1291 1.000000 1.000000 1.010000 0.375450 0.000000 -0.174262 -0.910313 + 1292 1.000000 1.000000 1.010000 0.405406 0.000000 -0.161594 -0.899741 + 1293 1.000000 1.000000 1.010000 0.434935 0.000000 -0.150113 -0.887861 + 1294 1.000000 1.000000 1.010000 0.464136 0.000000 -0.140813 -0.874500 + 1295 1.000000 1.000000 1.010000 0.492782 0.000000 -0.133129 -0.859908 + 1296 1.000000 1.000000 1.010000 0.521044 0.000000 -0.125619 -0.844235 + 1297 1.000000 1.000000 1.010000 0.548647 0.000000 -0.119002 -0.827541 + 1298 1.000000 1.000000 1.010000 0.575620 0.000000 -0.113674 -0.809777 + 1299 1.000000 1.000000 1.010000 0.602232 0.000000 -0.108841 -0.790867 + 1300 1.000000 1.000000 1.010000 0.627920 0.000000 -0.104401 -0.771244 + 1301 1.000000 1.000000 1.010000 0.653162 0.000000 -0.100097 -0.750573 + 1302 1.000000 1.000000 1.010000 0.677699 0.000000 -0.096440 -0.728988 + 1303 1.000000 1.000000 1.010000 0.701507 0.000000 -0.093470 -0.706507 + 1304 1.000000 1.000000 1.010000 0.724470 0.000000 -0.090309 -0.683365 + 1305 1.000000 1.000000 1.010000 0.746607 0.000000 -0.087659 -0.659464 + 1306 1.000000 1.000000 1.010000 0.768060 0.000000 -0.085050 -0.634704 + 1307 1.000000 1.000000 1.010000 0.788601 0.000000 -0.082862 -0.609297 + 1308 1.000000 1.000000 1.010000 0.808414 0.000000 -0.081116 -0.582998 + 1309 1.000000 1.000000 1.010000 0.827269 0.000000 -0.079304 -0.556181 + 1310 1.000000 1.000000 1.010000 0.845188 0.000000 -0.077380 -0.528839 + 1311 1.000000 1.000000 1.010000 0.862168 0.000000 -0.076044 -0.500883 + 1312 1.000000 1.000000 1.010000 0.878274 0.000000 -0.074692 -0.472287 + 1313 1.000000 1.000000 1.010000 0.893330 0.000000 -0.073386 -0.443369 + 1314 1.000000 1.000000 1.010000 0.907596 0.000000 -0.072209 -0.413588 + 1315 1.000000 1.000000 1.010000 0.920798 0.000000 -0.071115 -0.383501 + 1316 1.000000 1.000000 1.010000 0.932968 0.000000 -0.069996 -0.353088 + 1317 1.000000 1.000000 1.010000 0.944136 0.000000 -0.069211 -0.322205 + 1318 1.000000 1.000000 1.010000 0.954223 0.000000 -0.068525 -0.291141 + 1319 1.000000 1.000000 1.010000 0.963310 0.000000 -0.067754 -0.259699 + 1320 1.000000 1.000000 1.010000 0.971386 0.000000 -0.067240 -0.227788 + 1321 1.000000 1.000000 1.010000 0.978368 0.000000 -0.067019 -0.195718 + 1322 1.000000 1.000000 1.010000 0.984333 0.000000 -0.066405 -0.163335 + 1323 1.000000 1.000000 1.010000 0.989201 0.000000 -0.066133 -0.130794 + 1324 1.000000 1.000000 1.010000 0.992980 0.000000 -0.065897 -0.098228 + 1325 1.000000 1.000000 1.010000 0.995679 0.000000 -0.065807 -0.065520 + 1326 1.000000 1.000000 1.010000 0.997308 0.000000 -0.065557 -0.032843 + 1327 1.000000 1.000000 1.010000 0.999457 0.000000 -0.032935 0.000272 + 1328 1.000000 1.000000 1.010000 0.998922 0.000000 -0.032789 0.032864 + 1329 1.000000 1.000000 1.010000 0.997317 0.000000 -0.032807 0.065440 + 1330 1.000000 1.000000 1.010000 0.994645 0.000000 -0.033075 0.097910 + 1331 1.000000 1.000000 1.010000 0.990886 0.000000 -0.033222 0.130545 + 1332 1.000000 1.000000 1.010000 0.986097 0.000000 -0.033242 0.162811 + 1333 1.000000 1.000000 1.010000 0.980231 0.000000 -0.033541 0.194991 + 1334 1.000000 1.000000 1.010000 0.973380 0.000000 -0.033681 0.226710 + 1335 1.000000 1.000000 1.010000 0.965402 0.000000 -0.034125 0.258525 + 1336 1.000000 1.000000 1.010000 0.956425 0.000000 -0.034300 0.289955 + 1337 1.000000 1.000000 1.010000 0.946501 0.000000 -0.034785 0.320820 + 1338 1.000000 1.000000 1.010000 0.935503 0.000000 -0.035165 0.351563 + 1339 1.000000 1.000000 1.010000 0.923464 0.000000 -0.035731 0.382018 + 1340 1.000000 1.000000 1.010000 0.910501 0.000000 -0.035972 0.411939 + 1341 1.000000 1.000000 1.010000 0.896531 0.000000 -0.036680 0.441461 + 1342 1.000000 1.000000 1.010000 0.881543 0.000000 -0.037103 0.470643 + 1343 1.000000 1.000000 1.010000 0.865699 0.000000 -0.037957 0.499124 + 1344 1.000000 1.000000 1.010000 0.848972 0.000000 -0.038824 0.527010 + 1345 1.000000 1.000000 1.010000 0.831334 0.000000 -0.039330 0.554380 + 1346 1.000000 1.000000 1.010000 0.812709 0.000000 -0.040343 0.581271 + 1347 1.000000 1.000000 1.010000 0.793154 0.000000 -0.041513 0.607605 + 1348 1.000000 1.000000 1.010000 0.773006 0.000000 -0.042665 0.632962 + 1349 1.000000 1.000000 1.010000 0.751832 0.000000 -0.043706 0.657904 + 1350 1.000000 1.000000 1.010000 0.729910 0.000000 -0.045245 0.682044 + 1351 1.000000 1.000000 1.010000 0.707134 0.000000 -0.046429 0.705553 + 1352 1.000000 1.000000 1.010000 0.683843 0.000000 -0.047950 0.728052 + 1353 1.000000 1.000000 1.010000 0.659536 0.000000 -0.049820 0.750020 + 1354 1.000000 1.000000 1.010000 0.634629 0.000000 -0.051609 0.771092 + 1355 1.000000 1.000000 1.010000 0.609142 0.000000 -0.053742 0.791238 + 1356 1.000000 1.000000 1.010000 0.582941 0.000000 -0.056226 0.810567 + 1357 1.000000 1.000000 1.010000 0.556159 0.000000 -0.059233 0.828962 + 1358 1.000000 1.000000 1.010000 0.528785 0.000000 -0.062199 0.846474 + 1359 1.000000 1.000000 1.010000 0.500788 0.000000 -0.065912 0.863057 + 1360 1.000000 1.000000 1.010000 0.472295 0.000000 -0.069755 0.878676 + 1361 1.000000 1.000000 1.010000 0.443183 0.000000 -0.074227 0.893353 + 1362 1.000000 1.000000 1.010000 0.413910 0.000000 -0.079352 0.906853 + 1363 1.000000 1.000000 1.010000 0.383999 0.000000 -0.085425 0.919373 + 1364 1.000000 1.000000 1.010000 0.353574 0.000000 -0.093225 0.930749 + 1365 1.000000 1.000000 1.010000 0.322915 0.000000 -0.101375 0.940983 + 1366 1.000000 1.000000 1.010000 0.292200 0.000000 -0.112051 0.949770 + 1367 1.000000 1.000000 1.010000 0.260882 0.000000 -0.126259 0.957078 + 1368 1.000000 1.000000 1.010000 0.229205 0.000000 -0.143192 0.962788 + 1369 1.000000 1.000000 1.010000 0.197839 0.000000 -0.166249 0.966034 + 1370 1.000000 1.000000 1.010000 0.166258 0.000000 -0.197274 0.966148 + 1371 1.000000 1.000000 1.010000 0.134589 0.000000 -0.244774 0.960193 + 1372 1.000000 1.000000 1.010000 0.103312 0.000000 -0.317750 0.942529 + 1373 1.000000 1.000000 1.010000 0.073252 0.000000 -0.449672 0.890185 + 1374 1.000000 1.000000 1.010000 0.046522 0.000000 -0.710282 0.702379 + 1375 1.000000 1.000000 1.010000 0.032749 0.000000 -0.999451 0.004924 + 1376 1.000000 1.000000 1.010000 0.046264 0.000000 -0.710291 -0.702386 + 1377 1.000000 1.000000 1.010000 0.073000 0.000000 -0.448592 -0.890750 + 1378 1.000000 1.000000 1.010000 0.103095 0.000000 -0.319748 -0.941877 + 1379 1.000000 1.000000 1.010000 0.134457 0.000000 -0.245636 -0.959992 + 1380 1.000000 1.000000 1.010000 0.165958 0.000000 -0.197303 -0.966193 + 1381 1.000000 1.000000 1.010000 0.197747 0.000000 -0.166347 -0.966036 + 1382 1.000000 1.000000 1.010000 0.229221 0.000000 -0.143520 -0.962735 + 1383 1.000000 1.000000 1.010000 0.260646 0.000000 -0.126383 -0.957126 + 1384 1.000000 1.000000 1.010000 0.291874 0.000000 -0.112402 -0.949829 + 1385 1.000000 1.000000 1.010000 0.322682 0.000000 -0.102014 -0.940994 + 1386 1.000000 1.000000 1.010000 0.353495 0.000000 -0.092719 -0.930830 + 1387 1.000000 1.000000 1.010000 0.383568 0.000000 -0.085852 -0.919514 + 1388 1.000000 1.000000 1.010000 0.413695 0.000000 -0.079655 -0.906924 + 1389 1.000000 1.000000 1.010000 0.443002 0.000000 -0.074174 -0.893447 + 1390 1.000000 1.000000 1.010000 0.472030 0.000000 -0.069426 -0.878845 + 1391 1.000000 1.000000 1.010000 0.500700 0.000000 -0.065621 -0.863130 + 1392 1.000000 1.000000 1.010000 0.528609 0.000000 -0.062249 -0.846580 + 1393 1.000000 1.000000 1.010000 0.556042 0.000000 -0.059032 -0.829055 + 1394 1.000000 1.000000 1.010000 0.582974 0.000000 -0.056583 -0.810518 + 1395 1.000000 1.000000 1.010000 0.609156 0.000000 -0.053789 -0.791224 + 1396 1.000000 1.000000 1.010000 0.634761 0.000000 -0.051678 -0.770979 + 1397 1.000000 1.000000 1.010000 0.659474 0.000000 -0.050088 -0.750057 + 1398 1.000000 1.000000 1.010000 0.683695 0.000000 -0.048174 -0.728176 + 1399 1.000000 1.000000 1.010000 0.707318 0.000000 -0.046611 -0.705357 + 1400 1.000000 1.000000 1.010000 0.729960 0.000000 -0.045186 -0.681995 + 1401 1.000000 1.000000 1.010000 0.751877 0.000000 -0.043533 -0.657865 + 1402 1.000000 1.000000 1.010000 0.773030 0.000000 -0.042497 -0.632945 + 1403 1.000000 1.000000 1.010000 0.793354 0.000000 -0.041526 -0.607343 + 1404 1.000000 1.000000 1.010000 0.812765 0.000000 -0.040301 -0.581196 + 1405 1.000000 1.000000 1.010000 0.831316 0.000000 -0.039609 -0.554386 + 1406 1.000000 1.000000 1.010000 0.848998 0.000000 -0.038610 -0.526984 + 1407 1.000000 1.000000 1.010000 0.865814 0.000000 -0.038097 -0.498913 + 1408 1.000000 1.000000 1.010000 0.881742 0.000000 -0.037398 -0.470247 + 1409 1.000000 1.000000 1.010000 0.896660 0.000000 -0.036646 -0.441201 + 1410 1.000000 1.000000 1.010000 0.910602 0.000000 -0.036056 -0.411708 + 1411 1.000000 1.000000 1.010000 0.923615 0.000000 -0.035756 -0.381650 + 1412 1.000000 1.000000 1.010000 0.935554 0.000000 -0.034960 -0.351449 + 1413 1.000000 1.000000 1.010000 0.946583 0.000000 -0.034689 -0.320589 + 1414 1.000000 1.000000 1.010000 0.956538 0.000000 -0.034352 -0.289576 + 1415 1.000000 1.000000 1.010000 0.965487 0.000000 -0.034086 -0.258211 + 1416 1.000000 1.000000 1.010000 0.973414 0.000000 -0.033609 -0.226572 + 1417 1.000000 1.000000 1.010000 0.980335 0.000000 -0.033397 -0.194493 + 1418 1.000000 1.000000 1.010000 0.986180 0.000000 -0.033378 -0.162283 + 1419 1.000000 1.000000 1.010000 0.990953 0.000000 -0.033059 -0.130073 + 1420 1.000000 1.000000 1.010000 0.994676 0.000000 -0.032903 -0.097656 + 1421 1.000000 1.000000 1.010000 0.997345 0.000000 -0.032797 -0.065020 + 1422 1.000000 1.000000 1.010000 0.998930 0.000000 -0.032782 -0.032626 + 1423 1.000000 1.000000 1.010000 1.000000 0.000000 -0.000170 0.000294 + 1424 1.000000 1.000000 1.010000 0.999465 0.000000 -0.000289 0.032703 + 1425 1.000000 1.000000 1.010000 0.997850 0.000000 -0.000256 0.065540 + 1426 1.000000 1.000000 1.010000 0.995166 0.000000 -0.000045 0.098210 + 1427 1.000000 1.000000 1.010000 0.991429 0.000000 -0.000022 0.130647 + 1428 1.000000 1.000000 1.010000 0.986635 0.000000 -0.000227 0.162945 + 1429 1.000000 1.000000 1.010000 0.980786 0.000000 -0.000164 0.195089 + 1430 1.000000 1.000000 1.010000 0.973860 0.000000 -0.000169 0.227150 + 1431 1.000000 1.000000 1.010000 0.965862 0.000000 -0.000108 0.259056 + 1432 1.000000 1.000000 1.010000 0.956906 0.000000 -0.000113 0.290397 + 1433 1.000000 1.000000 1.010000 0.946888 0.000000 -0.000320 0.321563 + 1434 1.000000 1.000000 1.010000 0.935933 0.000000 -0.000160 0.352179 + 1435 1.000000 1.000000 1.010000 0.923838 0.000000 -0.000270 0.382784 + 1436 1.000000 1.000000 1.010000 0.910877 0.000000 -0.000068 0.412677 + 1437 1.000000 1.000000 1.010000 0.896921 0.000000 -0.000032 0.442190 + 1438 1.000000 1.000000 1.010000 0.881863 0.000000 -0.000078 0.471505 + 1439 1.000000 1.000000 1.010000 0.866138 0.000000 -0.000215 0.499805 + 1440 1.000000 1.000000 1.010000 0.849154 0.000000 -0.000260 0.528145 + 1441 1.000000 1.000000 1.010000 0.831556 0.000000 -0.000376 0.555441 + 1442 1.000000 1.000000 1.010000 0.812883 0.000000 -0.000016 0.582428 + 1443 1.000000 1.000000 1.010000 0.793380 0.000000 -0.000069 0.608727 + 1444 1.000000 1.000000 1.010000 0.773126 0.000000 -0.000189 0.634252 + 1445 1.000000 1.000000 1.010000 0.751860 0.000000 -0.000144 0.659323 + 1446 1.000000 1.000000 1.010000 0.730015 0.000000 -0.000041 0.683431 + 1447 1.000000 1.000000 1.010000 0.707248 0.000000 -0.000382 0.706965 + 1448 1.000000 1.000000 1.010000 0.683606 0.000000 -0.000195 0.729851 + 1449 1.000000 1.000000 1.010000 0.659364 0.000000 -0.000331 0.751824 + 1450 1.000000 1.000000 1.010000 0.634432 0.000000 -0.000298 0.772978 + 1451 1.000000 1.000000 1.010000 0.608781 0.000000 -0.000002 0.793338 + 1452 1.000000 1.000000 1.010000 0.582590 0.000000 -0.000373 0.812766 + 1453 1.000000 1.000000 1.010000 0.555851 0.000000 -0.000190 0.831282 + 1454 1.000000 1.000000 1.010000 0.528289 0.000000 -0.000168 0.849064 + 1455 1.000000 1.000000 1.010000 0.500165 0.000000 -0.000307 0.865930 + 1456 1.000000 1.000000 1.010000 0.471640 0.000000 -0.000441 0.881791 + 1457 1.000000 1.000000 1.010000 0.442328 0.000000 -0.000604 0.896853 + 1458 1.000000 1.000000 1.010000 0.412988 0.000000 -0.000453 0.910736 + 1459 1.000000 1.000000 1.010000 0.382709 0.000000 -0.000022 0.923869 + 1460 1.000000 1.000000 1.010000 0.352498 0.000000 -0.000750 0.935812 + 1461 1.000000 1.000000 1.010000 0.321587 0.000000 -0.000283 0.946880 + 1462 1.000000 1.000000 1.010000 0.290466 0.000000 -0.000945 0.956885 + 1463 1.000000 1.000000 1.010000 0.259027 0.000000 -0.000886 0.965870 + 1464 1.000000 1.000000 1.010000 0.227431 0.000000 -0.000885 0.973794 + 1465 1.000000 1.000000 1.010000 0.195276 0.000000 -0.000661 0.980748 + 1466 1.000000 1.000000 1.010000 0.163153 0.000000 -0.000134 0.986601 + 1467 1.000000 1.000000 1.010000 0.130754 0.000000 -0.002547 0.991412 + 1468 1.000000 1.000000 1.010000 0.098161 0.000000 -0.002245 0.995168 + 1469 1.000000 1.000000 1.010000 0.065692 0.000000 -0.001163 0.997839 + 1470 1.000000 1.000000 1.010000 0.033048 0.000000 -0.000931 0.999453 + 1471 1.000000 1.000000 1.010000 0.000224 0.000000 -0.359019 0.933330 + 1472 1.000000 1.000000 1.010000 0.032673 0.000000 -0.009212 -0.999424 + 1473 1.000000 1.000000 1.010000 0.065396 0.000000 -0.001108 -0.997859 + 1474 1.000000 1.000000 1.010000 0.097834 0.000000 -0.001634 -0.995201 + 1475 1.000000 1.000000 1.010000 0.130478 0.000000 -0.002324 -0.991448 + 1476 1.000000 1.000000 1.010000 0.162867 0.000000 -0.000397 -0.986648 + 1477 1.000000 1.000000 1.010000 0.194946 0.000000 -0.000766 -0.980814 + 1478 1.000000 1.000000 1.010000 0.227159 0.000000 -0.000907 -0.973857 + 1479 1.000000 1.000000 1.010000 0.258725 0.000000 -0.000766 -0.965951 + 1480 1.000000 1.000000 1.010000 0.290348 0.000000 -0.000765 -0.956921 + 1481 1.000000 1.000000 1.010000 0.321612 0.000000 -0.000278 -0.946871 + 1482 1.000000 1.000000 1.010000 0.352318 0.000000 -0.000401 -0.935880 + 1483 1.000000 1.000000 1.010000 0.382765 0.000000 -0.000696 -0.923845 + 1484 1.000000 1.000000 1.010000 0.412719 0.000000 -0.000754 -0.910858 + 1485 1.000000 1.000000 1.010000 0.442261 0.000000 -0.000354 -0.896886 + 1486 1.000000 1.000000 1.010000 0.471468 0.000000 -0.000217 -0.881883 + 1487 1.000000 1.000000 1.010000 0.500146 0.000000 -0.000293 -0.865941 + 1488 1.000000 1.000000 1.010000 0.528107 0.000000 -0.000194 -0.849178 + 1489 1.000000 1.000000 1.010000 0.555587 0.000000 -0.000165 -0.831458 + 1490 1.000000 1.000000 1.010000 0.582563 0.000000 -0.000079 -0.812786 + 1491 1.000000 1.000000 1.010000 0.608955 0.000000 -0.000091 -0.793205 + 1492 1.000000 1.000000 1.010000 0.634448 0.000000 -0.000260 -0.772965 + 1493 1.000000 1.000000 1.010000 0.659344 0.000000 -0.000044 -0.751841 + 1494 1.000000 1.000000 1.010000 0.683685 0.000000 -0.000452 -0.729777 + 1495 1.000000 1.000000 1.010000 0.707178 0.000000 -0.000070 -0.707036 + 1496 1.000000 1.000000 1.010000 0.729960 0.000000 -0.000073 -0.683490 + 1497 1.000000 1.000000 1.010000 0.752047 0.000000 -0.000318 -0.659110 + 1498 1.000000 1.000000 1.010000 0.773103 0.000000 -0.000291 -0.634281 + 1499 1.000000 1.000000 1.010000 0.793437 0.000000 -0.000151 -0.608653 + 1500 1.000000 1.000000 1.010000 0.812945 0.000000 -0.000037 -0.582340 + 1501 1.000000 1.000000 1.010000 0.831558 0.000000 -0.000003 -0.555438 + 1502 1.000000 1.000000 1.010000 0.849275 0.000000 -0.000146 -0.527951 + 1503 1.000000 1.000000 1.010000 0.866056 0.000000 -0.000303 -0.499947 + 1504 1.000000 1.000000 1.010000 0.881984 0.000000 -0.000169 -0.471279 + 1505 1.000000 1.000000 1.010000 0.896987 0.000000 -0.000037 -0.442058 + 1506 1.000000 1.000000 1.010000 0.910949 0.000000 -0.000295 -0.412518 + 1507 1.000000 1.000000 1.010000 0.923952 0.000000 -0.000238 -0.382509 + 1508 1.000000 1.000000 1.010000 0.935974 0.000000 -0.000161 -0.352070 + 1509 1.000000 1.000000 1.010000 0.947030 0.000000 -0.000188 -0.321146 + 1510 1.000000 1.000000 1.010000 0.957005 0.000000 -0.000183 -0.290071 + 1511 1.000000 1.000000 1.010000 0.965988 0.000000 -0.000217 -0.258587 + 1512 1.000000 1.000000 1.010000 0.973917 0.000000 -0.000221 -0.226904 + 1513 1.000000 1.000000 1.010000 0.980845 0.000000 -0.000065 -0.194791 + 1514 1.000000 1.000000 1.010000 0.986687 0.000000 -0.000271 -0.162632 + 1515 1.000000 1.000000 1.010000 0.991452 0.000000 -0.000066 -0.130473 + 1516 1.000000 1.000000 1.010000 0.995200 0.000000 -0.000138 -0.097859 + 1517 1.000000 1.000000 1.010000 0.997873 0.000000 -0.000079 -0.065194 + 1518 1.000000 1.000000 1.010000 0.999475 0.000000 -0.000091 -0.032406 + 1519 1.000000 1.000000 1.010000 0.999465 -0.000000 0.032713 0.000177 + 1520 1.000000 1.000000 1.010000 0.998934 -0.000000 0.032421 0.032870 + 1521 1.000000 1.000000 1.010000 0.997319 -0.000000 0.032611 0.065516 + 1522 1.000000 1.000000 1.010000 0.994633 -0.000000 0.032716 0.098152 + 1523 1.000000 1.000000 1.010000 0.990930 -0.000000 0.032812 0.130315 + 1524 1.000000 1.000000 1.010000 0.986129 -0.000000 0.033027 0.162665 + 1525 1.000000 1.000000 1.010000 0.980290 -0.000000 0.033225 0.194752 + 1526 1.000000 1.000000 1.010000 0.973354 -0.000000 0.033249 0.226883 + 1527 1.000000 1.000000 1.010000 0.965405 -0.000000 0.033691 0.258569 + 1528 1.000000 1.000000 1.010000 0.956463 -0.000000 0.033918 0.289875 + 1529 1.000000 1.000000 1.010000 0.946454 -0.000000 0.034296 0.321012 + 1530 1.000000 1.000000 1.010000 0.935475 -0.000000 0.034665 0.351689 + 1531 1.000000 1.000000 1.010000 0.923429 -0.000000 0.035305 0.382142 + 1532 1.000000 1.000000 1.010000 0.910489 -0.000000 0.035799 0.411982 + 1533 1.000000 1.000000 1.010000 0.896455 -0.000000 0.036194 0.441655 + 1534 1.000000 1.000000 1.010000 0.881530 -0.000000 0.037013 0.470675 + 1535 1.000000 1.000000 1.010000 0.865791 -0.000000 0.037421 0.499005 + 1536 1.000000 1.000000 1.010000 0.848984 -0.000000 0.038445 0.527018 + 1537 1.000000 1.000000 1.010000 0.831373 -0.000000 0.038938 0.554349 + 1538 1.000000 1.000000 1.010000 0.812731 -0.000000 0.039916 0.581271 + 1539 1.000000 1.000000 1.010000 0.793169 -0.000000 0.041167 0.607608 + 1540 1.000000 1.000000 1.010000 0.773017 -0.000000 0.041933 0.632997 + 1541 1.000000 1.000000 1.010000 0.751890 -0.000000 0.043066 0.657881 + 1542 1.000000 1.000000 1.010000 0.729949 -0.000000 0.044514 0.682050 + 1543 1.000000 1.000000 1.010000 0.707237 -0.000000 0.046043 0.705476 + 1544 1.000000 1.000000 1.010000 0.683705 -0.000000 0.047598 0.728205 + 1545 1.000000 1.000000 1.010000 0.659654 -0.000000 0.049212 0.749957 + 1546 1.000000 1.000000 1.010000 0.634616 -0.000000 0.051394 0.771117 + 1547 1.000000 1.000000 1.010000 0.609118 -0.000000 0.053657 0.791263 + 1548 1.000000 1.000000 1.010000 0.583067 -0.000000 0.055527 0.810524 + 1549 1.000000 1.000000 1.010000 0.556178 -0.000000 0.058206 0.829022 + 1550 1.000000 1.000000 1.010000 0.528617 -0.000000 0.061379 0.846639 + 1551 1.000000 1.000000 1.010000 0.500639 -0.000000 0.064661 0.863238 + 1552 1.000000 1.000000 1.010000 0.472277 -0.000000 0.068890 0.878754 + 1553 1.000000 1.000000 1.010000 0.443299 -0.000000 0.073687 0.893340 + 1554 1.000000 1.000000 1.010000 0.413892 -0.000000 0.078643 0.906923 + 1555 1.000000 1.000000 1.010000 0.383788 -0.000000 0.084588 0.919539 + 1556 1.000000 1.000000 1.010000 0.353611 -0.000000 0.091833 0.930874 + 1557 1.000000 1.000000 1.010000 0.322996 -0.000000 0.100376 0.941062 + 1558 1.000000 1.000000 1.010000 0.291878 -0.000000 0.111202 0.949969 + 1559 1.000000 1.000000 1.010000 0.260840 -0.000000 0.124633 0.957303 + 1560 1.000000 1.000000 1.010000 0.229379 -0.000000 0.142141 0.962902 + 1561 1.000000 1.000000 1.010000 0.197933 -0.000000 0.164667 0.966285 + 1562 1.000000 1.000000 1.010000 0.166303 -0.000000 0.195017 0.966598 + 1563 1.000000 1.000000 1.010000 0.134718 -0.000000 0.241777 0.960934 + 1564 1.000000 1.000000 1.010000 0.103525 -0.000000 0.315657 0.943209 + 1565 1.000000 1.000000 1.010000 0.073205 -0.000000 0.442809 0.893622 + 1566 1.000000 1.000000 1.010000 0.046343 -0.000000 0.702646 0.710029 + 1567 1.000000 1.000000 1.010000 0.032671 -0.000000 0.999450 0.005664 + 1568 1.000000 1.000000 1.010000 0.046165 0.000000 0.708605 -0.704093 + 1569 1.000000 1.000000 1.010000 0.072937 0.000000 0.445403 -0.892354 + 1570 1.000000 1.000000 1.010000 0.103032 0.000000 0.316341 -0.943034 + 1571 1.000000 1.000000 1.010000 0.134157 0.000000 0.242904 -0.960729 + 1572 1.000000 1.000000 1.010000 0.165893 0.000000 0.196283 -0.966412 + 1573 1.000000 1.000000 1.010000 0.197364 0.000000 0.164884 -0.966365 + 1574 1.000000 1.000000 1.010000 0.229170 0.000000 0.142277 -0.962932 + 1575 1.000000 1.000000 1.010000 0.260637 0.000000 0.124943 -0.957318 + 1576 1.000000 1.000000 1.010000 0.291910 0.000000 0.112088 -0.949855 + 1577 1.000000 1.000000 1.010000 0.322873 0.000000 0.101157 -0.941021 + 1578 1.000000 1.000000 1.010000 0.353387 0.000000 0.092312 -0.930912 + 1579 1.000000 1.000000 1.010000 0.383626 0.000000 0.084619 -0.919603 + 1580 1.000000 1.000000 1.010000 0.413443 0.000000 0.078680 -0.907124 + 1581 1.000000 1.000000 1.010000 0.442969 0.000000 0.073323 -0.893534 + 1582 1.000000 1.000000 1.010000 0.471897 0.000000 0.068760 -0.878968 + 1583 1.000000 1.000000 1.010000 0.500603 0.000000 0.064767 -0.863251 + 1584 1.000000 1.000000 1.010000 0.528617 0.000000 0.061824 -0.846606 + 1585 1.000000 1.000000 1.010000 0.556033 0.000000 0.058450 -0.829102 + 1586 1.000000 1.000000 1.010000 0.582838 0.000000 0.055713 -0.810676 + 1587 1.000000 1.000000 1.010000 0.609053 0.000000 0.053336 -0.791334 + 1588 1.000000 1.000000 1.010000 0.634585 0.000000 0.051247 -0.771153 + 1589 1.000000 1.000000 1.010000 0.659547 0.000000 0.049594 -0.750025 + 1590 1.000000 1.000000 1.010000 0.683826 0.000000 0.047733 -0.728082 + 1591 1.000000 1.000000 1.010000 0.707286 0.000000 0.046086 -0.705423 + 1592 1.000000 1.000000 1.010000 0.729960 0.000000 0.044529 -0.682038 + 1593 1.000000 1.000000 1.010000 0.751912 0.000000 0.043394 -0.657834 + 1594 1.000000 1.000000 1.010000 0.773026 0.000000 0.042278 -0.632965 + 1595 1.000000 1.000000 1.010000 0.793222 0.000000 0.040823 -0.607563 + 1596 1.000000 1.000000 1.010000 0.812774 0.000000 0.040164 -0.581192 + 1597 1.000000 1.000000 1.010000 0.831295 0.000000 0.038945 -0.554466 + 1598 1.000000 1.000000 1.010000 0.849003 0.000000 0.038296 -0.526999 + 1599 1.000000 1.000000 1.010000 0.865804 0.000000 0.037690 -0.498961 + 1600 1.000000 1.000000 1.010000 0.881660 0.000000 0.036904 -0.470440 + 1601 1.000000 1.000000 1.010000 0.896616 0.000000 0.036203 -0.441326 + 1602 1.000000 1.000000 1.010000 0.910530 0.000000 0.035815 -0.411890 + 1603 1.000000 1.000000 1.010000 0.923590 0.000000 0.035365 -0.381748 + 1604 1.000000 1.000000 1.010000 0.935503 0.000000 0.034757 -0.351606 + 1605 1.000000 1.000000 1.010000 0.946489 0.000000 0.034474 -0.320888 + 1606 1.000000 1.000000 1.010000 0.956517 0.000000 0.034071 -0.289679 + 1607 1.000000 1.000000 1.010000 0.965501 0.000000 0.033535 -0.258231 + 1608 1.000000 1.000000 1.010000 0.973465 0.000000 0.033475 -0.226376 + 1609 1.000000 1.000000 1.010000 0.980365 0.000000 0.033025 -0.194407 + 1610 1.000000 1.000000 1.010000 0.986166 0.000000 0.033017 -0.162437 + 1611 1.000000 1.000000 1.010000 0.990926 0.000000 0.032997 -0.130298 + 1612 1.000000 1.000000 1.010000 0.994675 0.000000 0.032760 -0.097715 + 1613 1.000000 1.000000 1.010000 0.997345 0.000000 0.032721 -0.065050 + 1614 1.000000 1.000000 1.010000 0.998951 0.000000 0.032386 -0.032385 + 1615 1.000000 1.000000 1.010000 0.997869 -0.000000 0.065252 0.000097 + 1616 1.000000 1.000000 1.010000 0.997324 -0.000000 0.065238 0.033008 + 1617 1.000000 1.000000 1.010000 0.995678 -0.000000 0.065430 0.065911 + 1618 1.000000 1.000000 1.010000 0.992980 -0.000000 0.065399 0.098562 + 1619 1.000000 1.000000 1.010000 0.989169 -0.000000 0.065907 0.131150 + 1620 1.000000 1.000000 1.010000 0.984322 -0.000000 0.065997 0.163570 + 1621 1.000000 1.000000 1.010000 0.978370 -0.000000 0.066526 0.195872 + 1622 1.000000 1.000000 1.010000 0.971337 -0.000000 0.066848 0.228114 + 1623 1.000000 1.000000 1.010000 0.963306 -0.000000 0.067539 0.259770 + 1624 1.000000 1.000000 1.010000 0.954168 -0.000000 0.068083 0.291426 + 1625 1.000000 1.000000 1.010000 0.944010 -0.000000 0.068999 0.322620 + 1626 1.000000 1.000000 1.010000 0.932880 -0.000000 0.069764 0.353365 + 1627 1.000000 1.000000 1.010000 0.920648 -0.000000 0.070647 0.383948 + 1628 1.000000 1.000000 1.010000 0.907489 -0.000000 0.071545 0.413938 + 1629 1.000000 1.000000 1.010000 0.893366 -0.000000 0.072957 0.443368 + 1630 1.000000 1.000000 1.010000 0.878134 -0.000000 0.074283 0.472613 + 1631 1.000000 1.000000 1.010000 0.862035 -0.000000 0.075530 0.501189 + 1632 1.000000 1.000000 1.010000 0.845060 -0.000000 0.076987 0.529100 + 1633 1.000000 1.000000 1.010000 0.827193 -0.000000 0.078495 0.556409 + 1634 1.000000 1.000000 1.010000 0.808217 -0.000000 0.080575 0.583346 + 1635 1.000000 1.000000 1.010000 0.788494 -0.000000 0.082498 0.609484 + 1636 1.000000 1.000000 1.010000 0.767906 -0.000000 0.084613 0.634950 + 1637 1.000000 1.000000 1.010000 0.746560 -0.000000 0.087228 0.659575 + 1638 1.000000 1.000000 1.010000 0.724356 -0.000000 0.090009 0.683525 + 1639 1.000000 1.000000 1.010000 0.701321 -0.000000 0.092799 0.706779 + 1640 1.000000 1.000000 1.010000 0.677664 -0.000000 0.096245 0.729046 + 1641 1.000000 1.000000 1.010000 0.653127 -0.000000 0.099522 0.750680 + 1642 1.000000 1.000000 1.010000 0.628064 -0.000000 0.103855 0.771200 + 1643 1.000000 1.000000 1.010000 0.602097 -0.000000 0.108257 0.791050 + 1644 1.000000 1.000000 1.010000 0.575780 -0.000000 0.113026 0.809755 + 1645 1.000000 1.000000 1.010000 0.548737 -0.000000 0.118565 0.827545 + 1646 1.000000 1.000000 1.010000 0.520925 -0.000000 0.125054 0.844393 + 1647 1.000000 1.000000 1.010000 0.492923 -0.000000 0.131945 0.860010 + 1648 1.000000 1.000000 1.010000 0.464232 -0.000000 0.139961 0.874585 + 1649 1.000000 1.000000 1.010000 0.434870 -0.000000 0.149538 0.887990 + 1650 1.000000 1.000000 1.010000 0.405413 -0.000000 0.160686 0.899900 + 1651 1.000000 1.000000 1.010000 0.375616 -0.000000 0.173248 0.910438 + 1652 1.000000 1.000000 1.010000 0.345211 -0.000000 0.188807 0.919338 + 1653 1.000000 1.000000 1.010000 0.314703 -0.000000 0.206709 0.926409 + 1654 1.000000 1.000000 1.010000 0.284105 -0.000000 0.229410 0.930943 + 1655 1.000000 1.000000 1.010000 0.253198 -0.000000 0.257768 0.932441 + 1656 1.000000 1.000000 1.010000 0.222495 -0.000000 0.292903 0.929894 + 1657 1.000000 1.000000 1.010000 0.191880 -0.000000 0.339596 0.920791 + 1658 1.000000 1.000000 1.010000 0.161544 -0.000000 0.404140 0.900319 + 1659 1.000000 1.000000 1.010000 0.132461 -0.000000 0.492289 0.860294 + 1660 1.000000 1.000000 1.010000 0.105129 -0.000000 0.618447 0.778763 + 1661 1.000000 1.000000 1.010000 0.081858 -0.000000 0.794961 0.601113 + 1662 1.000000 1.000000 1.010000 0.067265 -0.000000 0.966433 0.247958 + 1663 1.000000 1.000000 1.010000 0.067341 0.000000 0.967944 -0.241972 + 1664 1.000000 1.000000 1.010000 0.081711 0.000000 0.795165 -0.600863 + 1665 1.000000 1.000000 1.010000 0.105016 0.000000 0.620914 -0.776812 + 1666 1.000000 1.000000 1.010000 0.131989 0.000000 0.492397 -0.860305 + 1667 1.000000 1.000000 1.010000 0.161307 0.000000 0.404035 -0.900408 + 1668 1.000000 1.000000 1.010000 0.191452 0.000000 0.340702 -0.920472 + 1669 1.000000 1.000000 1.010000 0.222083 0.000000 0.292838 -0.930013 + 1670 1.000000 1.000000 1.010000 0.252817 0.000000 0.257777 -0.932542 + 1671 1.000000 1.000000 1.010000 0.283910 0.000000 0.229370 -0.931013 + 1672 1.000000 1.000000 1.010000 0.314578 0.000000 0.206806 -0.926430 + 1673 1.000000 1.000000 1.010000 0.345073 0.000000 0.188397 -0.919473 + 1674 1.000000 1.000000 1.010000 0.375439 0.000000 0.173607 -0.910443 + 1675 1.000000 1.000000 1.010000 0.405125 0.000000 0.161091 -0.899958 + 1676 1.000000 1.000000 1.010000 0.434866 0.000000 0.149918 -0.887928 + 1677 1.000000 1.000000 1.010000 0.464000 0.000000 0.140167 -0.874676 + 1678 1.000000 1.000000 1.010000 0.492672 0.000000 0.131849 -0.860169 + 1679 1.000000 1.000000 1.010000 0.521020 0.000000 0.124942 -0.844350 + 1680 1.000000 1.000000 1.010000 0.548553 0.000000 0.118490 -0.827678 + 1681 1.000000 1.000000 1.010000 0.575705 0.000000 0.113049 -0.809805 + 1682 1.000000 1.000000 1.010000 0.602210 0.000000 0.107908 -0.791011 + 1683 1.000000 1.000000 1.010000 0.628097 0.000000 0.103543 -0.771215 + 1684 1.000000 1.000000 1.010000 0.653243 0.000000 0.099865 -0.750534 + 1685 1.000000 1.000000 1.010000 0.677618 0.000000 0.096068 -0.729113 + 1686 1.000000 1.000000 1.010000 0.701392 0.000000 0.092794 -0.706710 + 1687 1.000000 1.000000 1.010000 0.724458 0.000000 0.089720 -0.683455 + 1688 1.000000 1.000000 1.010000 0.746541 0.000000 0.087211 -0.659599 + 1689 1.000000 1.000000 1.010000 0.767937 0.000000 0.084573 -0.634918 + 1690 1.000000 1.000000 1.010000 0.788548 0.000000 0.082726 -0.609384 + 1691 1.000000 1.000000 1.010000 0.808307 0.000000 0.080619 -0.583216 + 1692 1.000000 1.000000 1.010000 0.827289 0.000000 0.078727 -0.556232 + 1693 1.000000 1.000000 1.010000 0.845152 0.000000 0.077175 -0.528926 + 1694 1.000000 1.000000 1.010000 0.862096 0.000000 0.075612 -0.501072 + 1695 1.000000 1.000000 1.010000 0.878245 0.000000 0.074265 -0.472409 + 1696 1.000000 1.000000 1.010000 0.893448 0.000000 0.072795 -0.443229 + 1697 1.000000 1.000000 1.010000 0.907601 0.000000 0.071773 -0.413652 + 1698 1.000000 1.000000 1.010000 0.920802 0.000000 0.070599 -0.383588 + 1699 1.000000 1.000000 1.010000 0.932957 0.000000 0.069778 -0.353161 + 1700 1.000000 1.000000 1.010000 0.944063 0.000000 0.069054 -0.322455 + 1701 1.000000 1.000000 1.010000 0.954285 0.000000 0.068136 -0.291029 + 1702 1.000000 1.000000 1.010000 0.963354 0.000000 0.067716 -0.259544 + 1703 1.000000 1.000000 1.010000 0.971415 0.000000 0.066956 -0.227749 + 1704 1.000000 1.000000 1.010000 0.978424 0.000000 0.066377 -0.195656 + 1705 1.000000 1.000000 1.010000 0.984376 0.000000 0.066167 -0.163176 + 1706 1.000000 1.000000 1.010000 0.989200 0.000000 0.065780 -0.130985 + 1707 1.000000 1.000000 1.010000 0.993029 0.000000 0.065388 -0.098066 + 1708 1.000000 1.000000 1.010000 0.995705 0.000000 0.065454 -0.065476 + 1709 1.000000 1.000000 1.010000 0.997340 0.000000 0.065146 -0.032701 + 1710 1.000000 1.000000 1.010000 0.995193 -0.000000 0.097935 0.000051 + 1711 1.000000 1.000000 1.010000 0.994666 -0.000000 0.097731 0.032999 + 1712 1.000000 1.000000 1.010000 0.992990 -0.000000 0.098097 0.065945 + 1713 1.000000 1.000000 1.010000 0.990248 -0.000000 0.098211 0.098812 + 1714 1.000000 1.000000 1.010000 0.986408 -0.000000 0.098601 0.131444 + 1715 1.000000 1.000000 1.010000 0.981427 -0.000000 0.099305 0.164131 + 1716 1.000000 1.000000 1.010000 0.975437 -0.000000 0.099617 0.196468 + 1717 1.000000 1.000000 1.010000 0.968323 -0.000000 0.100597 0.228542 + 1718 1.000000 1.000000 1.010000 0.960175 -0.000000 0.101308 0.260385 + 1719 1.000000 1.000000 1.010000 0.950931 -0.000000 0.102274 0.292012 + 1720 1.000000 1.000000 1.010000 0.940664 -0.000000 0.103476 0.323177 + 1721 1.000000 1.000000 1.010000 0.929444 -0.000000 0.104582 0.353831 + 1722 1.000000 1.000000 1.010000 0.917028 -0.000000 0.106284 0.384400 + 1723 1.000000 1.000000 1.010000 0.903645 -0.000000 0.107880 0.414473 + 1724 1.000000 1.000000 1.010000 0.889296 -0.000000 0.109343 0.444069 + 1725 1.000000 1.000000 1.010000 0.874030 -0.000000 0.111507 0.472903 + 1726 1.000000 1.000000 1.010000 0.857762 -0.000000 0.113404 0.501382 + 1727 1.000000 1.000000 1.010000 0.840563 -0.000000 0.115721 0.529208 + 1728 1.000000 1.000000 1.010000 0.822426 -0.000000 0.118472 0.556399 + 1729 1.000000 1.000000 1.010000 0.803323 -0.000000 0.121154 0.583090 + 1730 1.000000 1.000000 1.010000 0.783473 -0.000000 0.124323 0.608862 + 1731 1.000000 1.000000 1.010000 0.762753 -0.000000 0.127529 0.633991 + 1732 1.000000 1.000000 1.010000 0.741182 -0.000000 0.131409 0.658317 + 1733 1.000000 1.000000 1.010000 0.718674 -0.000000 0.135315 0.682054 + 1734 1.000000 1.000000 1.010000 0.695583 -0.000000 0.140106 0.704652 + 1735 1.000000 1.000000 1.010000 0.671753 -0.000000 0.144742 0.726497 + 1736 1.000000 1.000000 1.010000 0.646879 -0.000000 0.150327 0.747629 + 1737 1.000000 1.000000 1.010000 0.621742 -0.000000 0.156719 0.767383 + 1738 1.000000 1.000000 1.010000 0.595751 -0.000000 0.163624 0.786325 + 1739 1.000000 1.000000 1.010000 0.569067 -0.000000 0.171106 0.804292 + 1740 1.000000 1.000000 1.010000 0.541990 -0.000000 0.179893 0.820905 + 1741 1.000000 1.000000 1.010000 0.514413 -0.000000 0.189054 0.836444 + 1742 1.000000 1.000000 1.010000 0.486146 -0.000000 0.200119 0.850655 + 1743 1.000000 1.000000 1.010000 0.457388 -0.000000 0.212728 0.863448 + 1744 1.000000 1.000000 1.010000 0.428530 -0.000000 0.227447 0.874431 + 1745 1.000000 1.000000 1.010000 0.398940 -0.000000 0.244015 0.883914 + 1746 1.000000 1.000000 1.010000 0.369479 -0.000000 0.263244 0.891172 + 1747 1.000000 1.000000 1.010000 0.339593 -0.000000 0.286425 0.895900 + 1748 1.000000 1.000000 1.010000 0.309521 -0.000000 0.314526 0.897369 + 1749 1.000000 1.000000 1.010000 0.279608 -0.000000 0.348024 0.894818 + 1750 1.000000 1.000000 1.010000 0.249685 -0.000000 0.389680 0.886457 + 1751 1.000000 1.000000 1.010000 0.220531 -0.000000 0.441625 0.869674 + 1752 1.000000 1.000000 1.010000 0.191834 -0.000000 0.508550 0.839390 + 1753 1.000000 1.000000 1.010000 0.164530 -0.000000 0.592344 0.788707 + 1754 1.000000 1.000000 1.010000 0.139550 -0.000000 0.698192 0.702178 + 1755 1.000000 1.000000 1.010000 0.118253 -0.000000 0.824181 0.553842 + 1756 1.000000 1.000000 1.010000 0.103238 -0.000000 0.942238 0.318637 + 1757 1.000000 1.000000 1.010000 0.098023 -0.000000 0.995182 0.001885 + 1758 1.000000 1.000000 1.010000 0.103353 0.000000 0.943226 -0.315661 + 1759 1.000000 1.000000 1.010000 0.118189 0.000000 0.824880 -0.552815 + 1760 1.000000 1.000000 1.010000 0.139270 0.000000 0.700330 -0.700101 + 1761 1.000000 1.000000 1.010000 0.164350 0.000000 0.592391 -0.788709 + 1762 1.000000 1.000000 1.010000 0.191592 0.000000 0.508870 -0.839252 + 1763 1.000000 1.000000 1.010000 0.220257 0.000000 0.442577 -0.869260 + 1764 1.000000 1.000000 1.010000 0.249440 0.000000 0.391104 -0.885899 + 1765 1.000000 1.000000 1.010000 0.279338 0.000000 0.349111 -0.894479 + 1766 1.000000 1.000000 1.010000 0.309250 0.000000 0.314852 -0.897348 + 1767 1.000000 1.000000 1.010000 0.339378 0.000000 0.287236 -0.895722 + 1768 1.000000 1.000000 1.010000 0.369158 0.000000 0.263884 -0.891116 + 1769 1.000000 1.000000 1.010000 0.398900 0.000000 0.243887 -0.883967 + 1770 1.000000 1.000000 1.010000 0.428145 0.000000 0.227655 -0.874566 + 1771 1.000000 1.000000 1.010000 0.457335 0.000000 0.213044 -0.863399 + 1772 1.000000 1.000000 1.010000 0.485955 0.000000 0.200167 -0.850753 + 1773 1.000000 1.000000 1.010000 0.514092 0.000000 0.189597 -0.836518 + 1774 1.000000 1.000000 1.010000 0.541848 0.000000 0.179710 -0.821039 + 1775 1.000000 1.000000 1.010000 0.569080 0.000000 0.171353 -0.804230 + 1776 1.000000 1.000000 1.010000 0.595687 0.000000 0.163315 -0.786438 + 1777 1.000000 1.000000 1.010000 0.621733 0.000000 0.156758 -0.767382 + 1778 1.000000 1.000000 1.010000 0.647076 0.000000 0.150703 -0.747383 + 1779 1.000000 1.000000 1.010000 0.671728 0.000000 0.144813 -0.726506 + 1780 1.000000 1.000000 1.010000 0.695549 0.000000 0.140039 -0.704699 + 1781 1.000000 1.000000 1.010000 0.718829 0.000000 0.135662 -0.681822 + 1782 1.000000 1.000000 1.010000 0.741036 0.000000 0.131647 -0.658434 + 1783 1.000000 1.000000 1.010000 0.762646 0.000000 0.127899 -0.634045 + 1784 1.000000 1.000000 1.010000 0.783484 0.000000 0.124442 -0.608824 + 1785 1.000000 1.000000 1.010000 0.803475 0.000000 0.121078 -0.582896 + 1786 1.000000 1.000000 1.010000 0.822475 0.000000 0.118307 -0.556361 + 1787 1.000000 1.000000 1.010000 0.840707 0.000000 0.115797 -0.528963 + 1788 1.000000 1.000000 1.010000 0.857823 0.000000 0.113389 -0.501280 + 1789 1.000000 1.000000 1.010000 0.874117 0.000000 0.111460 -0.472753 + 1790 1.000000 1.000000 1.010000 0.889463 0.000000 0.109431 -0.443712 + 1791 1.000000 1.000000 1.010000 0.903763 0.000000 0.107734 -0.414254 + 1792 1.000000 1.000000 1.010000 0.917083 0.000000 0.106103 -0.384318 + 1793 1.000000 1.000000 1.010000 0.929510 0.000000 0.104792 -0.353596 + 1794 1.000000 1.000000 1.010000 0.940725 0.000000 0.103402 -0.323024 + 1795 1.000000 1.000000 1.010000 0.950995 0.000000 0.102551 -0.291706 + 1796 1.000000 1.000000 1.010000 0.960277 0.000000 0.101261 -0.260027 + 1797 1.000000 1.000000 1.010000 0.968397 0.000000 0.100630 -0.228212 + 1798 1.000000 1.000000 1.010000 0.975469 0.000000 0.099951 -0.196137 + 1799 1.000000 1.000000 1.010000 0.981478 0.000000 0.099331 -0.163812 + 1800 1.000000 1.000000 1.010000 0.986439 0.000000 0.098724 -0.131118 + 1801 1.000000 1.000000 1.010000 0.990284 0.000000 0.098209 -0.098454 + 1802 1.000000 1.000000 1.010000 0.993001 0.000000 0.098131 -0.065721 + 1803 1.000000 1.000000 1.010000 0.994668 0.000000 0.097797 -0.032719 + 1804 1.000000 1.000000 1.010000 0.991462 -0.000000 0.130397 0.000241 + 1805 1.000000 1.000000 1.010000 0.990922 -0.000000 0.130324 0.032992 + 1806 1.000000 1.000000 1.010000 0.989230 -0.000000 0.130703 0.065891 + 1807 1.000000 1.000000 1.010000 0.986442 -0.000000 0.131141 0.098664 + 1808 1.000000 1.000000 1.010000 0.982590 -0.000000 0.131336 0.131407 + 1809 1.000000 1.000000 1.010000 0.977615 -0.000000 0.132118 0.163748 + 1810 1.000000 1.000000 1.010000 0.971521 -0.000000 0.132799 0.196241 + 1811 1.000000 1.000000 1.010000 0.964387 -0.000000 0.133812 0.228150 + 1812 1.000000 1.000000 1.010000 0.956101 -0.000000 0.135127 0.260022 + 1813 1.000000 1.000000 1.010000 0.946813 -0.000000 0.136279 0.291502 + 1814 1.000000 1.000000 1.010000 0.936434 -0.000000 0.137944 0.322587 + 1815 1.000000 1.000000 1.010000 0.925055 -0.000000 0.139555 0.353268 + 1816 1.000000 1.000000 1.010000 0.912573 -0.000000 0.141702 0.383576 + 1817 1.000000 1.000000 1.010000 0.899181 -0.000000 0.143812 0.413268 + 1818 1.000000 1.000000 1.010000 0.884619 -0.000000 0.145932 0.442892 + 1819 1.000000 1.000000 1.010000 0.869164 -0.000000 0.148661 0.471650 + 1820 1.000000 1.000000 1.010000 0.852833 -0.000000 0.151525 0.499716 + 1821 1.000000 1.000000 1.010000 0.835538 -0.000000 0.154559 0.527246 + 1822 1.000000 1.000000 1.010000 0.817218 -0.000000 0.158227 0.554184 + 1823 1.000000 1.000000 1.010000 0.798056 -0.000000 0.161981 0.580405 + 1824 1.000000 1.000000 1.010000 0.778062 -0.000000 0.166204 0.605801 + 1825 1.000000 1.000000 1.010000 0.757242 -0.000000 0.170507 0.630486 + 1826 1.000000 1.000000 1.010000 0.735460 -0.000000 0.175644 0.654407 + 1827 1.000000 1.000000 1.010000 0.712977 -0.000000 0.181449 0.677304 + 1828 1.000000 1.000000 1.010000 0.689672 -0.000000 0.187406 0.699451 + 1829 1.000000 1.000000 1.010000 0.665621 -0.000000 0.194218 0.720575 + 1830 1.000000 1.000000 1.010000 0.640977 -0.000000 0.201537 0.740629 + 1831 1.000000 1.000000 1.010000 0.615613 -0.000000 0.210088 0.759529 + 1832 1.000000 1.000000 1.010000 0.589777 -0.000000 0.219339 0.777209 + 1833 1.000000 1.000000 1.010000 0.563129 -0.000000 0.229468 0.793870 + 1834 1.000000 1.000000 1.010000 0.536308 -0.000000 0.240826 0.808935 + 1835 1.000000 1.000000 1.010000 0.508639 -0.000000 0.254041 0.822648 + 1836 1.000000 1.000000 1.010000 0.480487 -0.000000 0.268670 0.834834 + 1837 1.000000 1.000000 1.010000 0.452226 -0.000000 0.285856 0.844854 + 1838 1.000000 1.000000 1.010000 0.423597 -0.000000 0.305235 0.852876 + 1839 1.000000 1.000000 1.010000 0.394680 -0.000000 0.327687 0.858399 + 1840 1.000000 1.000000 1.010000 0.365589 -0.000000 0.353175 0.861169 + 1841 1.000000 1.000000 1.010000 0.336316 -0.000000 0.384130 0.859846 + 1842 1.000000 1.000000 1.010000 0.307646 -0.000000 0.419802 0.853885 + 1843 1.000000 1.000000 1.010000 0.278836 -0.000000 0.463358 0.841160 + 1844 1.000000 1.000000 1.010000 0.250803 -0.000000 0.515363 0.819450 + 1845 1.000000 1.000000 1.010000 0.223782 -0.000000 0.577714 0.784964 + 1846 1.000000 1.000000 1.010000 0.197975 -0.000000 0.652912 0.731103 + 1847 1.000000 1.000000 1.010000 0.174385 -0.000000 0.740327 0.649235 + 1848 1.000000 1.000000 1.010000 0.154383 -0.000000 0.836331 0.526039 + 1849 1.000000 1.000000 1.010000 0.139712 -0.000000 0.925506 0.352022 + 1850 1.000000 1.000000 1.010000 0.131607 -0.000000 0.983298 0.125715 + 1851 1.000000 1.000000 1.010000 0.131432 0.000000 0.983795 -0.121955 + 1852 1.000000 1.000000 1.010000 0.139503 0.000000 0.926965 -0.348245 + 1853 1.000000 1.000000 1.010000 0.154593 0.000000 0.837556 -0.524023 + 1854 1.000000 1.000000 1.010000 0.174297 0.000000 0.741468 -0.647955 + 1855 1.000000 1.000000 1.010000 0.197780 0.000000 0.653134 -0.730958 + 1856 1.000000 1.000000 1.010000 0.223339 0.000000 0.578935 -0.784190 + 1857 1.000000 1.000000 1.010000 0.250510 0.000000 0.516523 -0.818809 + 1858 1.000000 1.000000 1.010000 0.278715 0.000000 0.463686 -0.841019 + 1859 1.000000 1.000000 1.010000 0.307469 0.000000 0.420363 -0.853673 + 1860 1.000000 1.000000 1.010000 0.336225 0.000000 0.384646 -0.859651 + 1861 1.000000 1.000000 1.010000 0.365507 0.000000 0.354002 -0.860864 + 1862 1.000000 1.000000 1.010000 0.394428 0.000000 0.327672 -0.858521 + 1863 1.000000 1.000000 1.010000 0.423472 0.000000 0.305124 -0.852977 + 1864 1.000000 1.000000 1.010000 0.452001 0.000000 0.286319 -0.844817 + 1865 1.000000 1.000000 1.010000 0.480556 0.000000 0.268776 -0.834760 + 1866 1.000000 1.000000 1.010000 0.508522 0.000000 0.254604 -0.822546 + 1867 1.000000 1.000000 1.010000 0.536032 0.000000 0.241285 -0.808982 + 1868 1.000000 1.000000 1.010000 0.563309 0.000000 0.229776 -0.793653 + 1869 1.000000 1.000000 1.010000 0.589682 0.000000 0.219413 -0.777260 + 1870 1.000000 1.000000 1.010000 0.615564 0.000000 0.209994 -0.759595 + 1871 1.000000 1.000000 1.010000 0.641071 0.000000 0.201558 -0.740542 + 1872 1.000000 1.000000 1.010000 0.665746 0.000000 0.194323 -0.720431 + 1873 1.000000 1.000000 1.010000 0.689663 0.000000 0.187576 -0.699414 + 1874 1.000000 1.000000 1.010000 0.713040 0.000000 0.181482 -0.677228 + 1875 1.000000 1.000000 1.010000 0.735591 0.000000 0.176006 -0.654161 + 1876 1.000000 1.000000 1.010000 0.757295 0.000000 0.170631 -0.630388 + 1877 1.000000 1.000000 1.010000 0.777982 0.000000 0.166229 -0.605898 + 1878 1.000000 1.000000 1.010000 0.798066 0.000000 0.161999 -0.580386 + 1879 1.000000 1.000000 1.010000 0.817227 0.000000 0.158073 -0.554215 + 1880 1.000000 1.000000 1.010000 0.835576 0.000000 0.154652 -0.527159 + 1881 1.000000 1.000000 1.010000 0.852855 0.000000 0.151624 -0.499648 + 1882 1.000000 1.000000 1.010000 0.869324 0.000000 0.148682 -0.471349 + 1883 1.000000 1.000000 1.010000 0.884824 0.000000 0.146036 -0.442447 + 1884 1.000000 1.000000 1.010000 0.899166 0.000000 0.143819 -0.413299 + 1885 1.000000 1.000000 1.010000 0.912628 0.000000 0.141514 -0.383516 + 1886 1.000000 1.000000 1.010000 0.925044 0.000000 0.139722 -0.353229 + 1887 1.000000 1.000000 1.010000 0.936464 0.000000 0.138016 -0.322471 + 1888 1.000000 1.000000 1.010000 0.946872 0.000000 0.136369 -0.291268 + 1889 1.000000 1.000000 1.010000 0.956167 0.000000 0.135179 -0.259754 + 1890 1.000000 1.000000 1.010000 0.964411 0.000000 0.134091 -0.227884 + 1891 1.000000 1.000000 1.010000 0.971593 0.000000 0.133133 -0.195662 + 1892 1.000000 1.000000 1.010000 0.977644 0.000000 0.132199 -0.163510 + 1893 1.000000 1.000000 1.010000 0.982620 0.000000 0.131435 -0.131079 + 1894 1.000000 1.000000 1.010000 0.986503 0.000000 0.130922 -0.098338 + 1895 1.000000 1.000000 1.010000 0.989254 0.000000 0.130627 -0.065676 + 1896 1.000000 1.000000 1.010000 0.990918 0.000000 0.130440 -0.032658 + 1897 1.000000 1.000000 1.010000 0.986672 -0.000000 0.162722 0.000039 + 1898 1.000000 1.000000 1.010000 0.986102 -0.000000 0.162756 0.033360 + 1899 1.000000 1.000000 1.010000 0.984391 -0.000000 0.162962 0.066463 + 1900 1.000000 1.000000 1.010000 0.981550 -0.000000 0.163331 0.099412 + 1901 1.000000 1.000000 1.010000 0.977513 -0.000000 0.164307 0.132177 + 1902 1.000000 1.000000 1.010000 0.972420 -0.000000 0.164940 0.164905 + 1903 1.000000 1.000000 1.010000 0.966128 -0.000000 0.166260 0.197369 + 1904 1.000000 1.000000 1.010000 0.958784 -0.000000 0.167574 0.229461 + 1905 1.000000 1.000000 1.010000 0.950263 -0.000000 0.168928 0.261654 + 1906 1.000000 1.000000 1.010000 0.940752 -0.000000 0.170548 0.293086 + 1907 1.000000 1.000000 1.010000 0.930105 -0.000000 0.172652 0.324185 + 1908 1.000000 1.000000 1.010000 0.918336 -0.000000 0.174832 0.355095 + 1909 1.000000 1.000000 1.010000 0.905656 -0.000000 0.177163 0.385228 + 1910 1.000000 1.000000 1.010000 0.891736 -0.000000 0.180082 0.415182 + 1911 1.000000 1.000000 1.010000 0.877015 -0.000000 0.182982 0.444254 + 1912 1.000000 1.000000 1.010000 0.861143 -0.000000 0.186340 0.472980 + 1913 1.000000 1.000000 1.010000 0.844376 -0.000000 0.190069 0.500902 + 1914 1.000000 1.000000 1.010000 0.826579 -0.000000 0.194142 0.528277 + 1915 1.000000 1.000000 1.010000 0.807944 -0.000000 0.198582 0.554790 + 1916 1.000000 1.000000 1.010000 0.788197 -0.000000 0.203578 0.580777 + 1917 1.000000 1.000000 1.010000 0.767788 -0.000000 0.209154 0.605604 + 1918 1.000000 1.000000 1.010000 0.746503 -0.000000 0.214891 0.629726 + 1919 1.000000 1.000000 1.010000 0.724435 -0.000000 0.221447 0.652806 + 1920 1.000000 1.000000 1.010000 0.701503 -0.000000 0.228828 0.674931 + 1921 1.000000 1.000000 1.010000 0.677852 -0.000000 0.237104 0.695915 + 1922 1.000000 1.000000 1.010000 0.653421 -0.000000 0.245459 0.716094 + 1923 1.000000 1.000000 1.010000 0.628388 -0.000000 0.255625 0.734700 + 1924 1.000000 1.000000 1.010000 0.602769 -0.000000 0.266177 0.752209 + 1925 1.000000 1.000000 1.010000 0.576331 -0.000000 0.278609 0.768258 + 1926 1.000000 1.000000 1.010000 0.549734 -0.000000 0.292177 0.782576 + 1927 1.000000 1.000000 1.010000 0.522457 -0.000000 0.307037 0.795467 + 1928 1.000000 1.000000 1.010000 0.494672 -0.000000 0.324758 0.806121 + 1929 1.000000 1.000000 1.010000 0.466877 -0.000000 0.343842 0.814738 + 1930 1.000000 1.000000 1.010000 0.438437 -0.000000 0.365894 0.820911 + 1931 1.000000 1.000000 1.010000 0.409993 -0.000000 0.391566 0.823761 + 1932 1.000000 1.000000 1.010000 0.381817 -0.000000 0.420921 0.822825 + 1933 1.000000 1.000000 1.010000 0.353333 -0.000000 0.454245 0.817812 + 1934 1.000000 1.000000 1.010000 0.325292 -0.000000 0.493884 0.806389 + 1935 1.000000 1.000000 1.010000 0.297658 -0.000000 0.539365 0.787709 + 1936 1.000000 1.000000 1.010000 0.271155 -0.000000 0.592323 0.758702 + 1937 1.000000 1.000000 1.010000 0.245458 -0.000000 0.654257 0.715331 + 1938 1.000000 1.000000 1.010000 0.221923 -0.000000 0.724137 0.652975 + 1939 1.000000 1.000000 1.010000 0.200666 -0.000000 0.799569 0.566059 + 1940 1.000000 1.000000 1.010000 0.183279 -0.000000 0.876314 0.445515 + 1941 1.000000 1.000000 1.010000 0.170545 -0.000000 0.942270 0.288170 + 1942 1.000000 1.000000 1.010000 0.163809 -0.000000 0.981270 0.101367 + 1943 1.000000 1.000000 1.010000 0.163624 0.000000 0.981597 -0.098457 + 1944 1.000000 1.000000 1.010000 0.170195 0.000000 0.942860 -0.286440 + 1945 1.000000 1.000000 1.010000 0.183133 0.000000 0.877559 -0.443117 + 1946 1.000000 1.000000 1.010000 0.200475 0.000000 0.801039 -0.564045 + 1947 1.000000 1.000000 1.010000 0.221771 0.000000 0.724754 -0.652341 + 1948 1.000000 1.000000 1.010000 0.245512 0.000000 0.654858 -0.714762 + 1949 1.000000 1.000000 1.010000 0.270784 0.000000 0.593175 -0.758168 + 1950 1.000000 1.000000 1.010000 0.297581 0.000000 0.539864 -0.787396 + 1951 1.000000 1.000000 1.010000 0.325156 0.000000 0.493544 -0.806652 + 1952 1.000000 1.000000 1.010000 0.353200 0.000000 0.454943 -0.817482 + 1953 1.000000 1.000000 1.010000 0.381599 0.000000 0.420972 -0.822900 + 1954 1.000000 1.000000 1.010000 0.410077 0.000000 0.391720 -0.823646 + 1955 1.000000 1.000000 1.010000 0.438423 0.000000 0.366320 -0.820728 + 1956 1.000000 1.000000 1.010000 0.466552 0.000000 0.344290 -0.814735 + 1957 1.000000 1.000000 1.010000 0.494704 0.000000 0.324877 -0.806054 + 1958 1.000000 1.000000 1.010000 0.522263 0.000000 0.307755 -0.795316 + 1959 1.000000 1.000000 1.010000 0.549593 0.000000 0.292086 -0.782709 + 1960 1.000000 1.000000 1.010000 0.576363 0.000000 0.278896 -0.768129 + 1961 1.000000 1.000000 1.010000 0.602623 0.000000 0.266401 -0.752247 + 1962 1.000000 1.000000 1.010000 0.628418 0.000000 0.255695 -0.734650 + 1963 1.000000 1.000000 1.010000 0.653408 0.000000 0.245719 -0.716017 + 1964 1.000000 1.000000 1.010000 0.677848 0.000000 0.236835 -0.696011 + 1965 1.000000 1.000000 1.010000 0.701356 0.000000 0.229111 -0.674987 + 1966 1.000000 1.000000 1.010000 0.724351 0.000000 0.221868 -0.652756 + 1967 1.000000 1.000000 1.010000 0.746412 0.000000 0.215136 -0.629751 + 1968 1.000000 1.000000 1.010000 0.767871 0.000000 0.209063 -0.605530 + 1969 1.000000 1.000000 1.010000 0.788352 0.000000 0.203776 -0.580496 + 1970 1.000000 1.000000 1.010000 0.807988 0.000000 0.198740 -0.554669 + 1971 1.000000 1.000000 1.010000 0.826678 0.000000 0.194285 -0.528069 + 1972 1.000000 1.000000 1.010000 0.844427 0.000000 0.190023 -0.500833 + 1973 1.000000 1.000000 1.010000 0.861160 0.000000 0.186521 -0.472878 + 1974 1.000000 1.000000 1.010000 0.876997 0.000000 0.183038 -0.444268 + 1975 1.000000 1.000000 1.010000 0.891824 0.000000 0.180071 -0.414999 + 1976 1.000000 1.000000 1.010000 0.905640 0.000000 0.177216 -0.385241 + 1977 1.000000 1.000000 1.010000 0.918403 0.000000 0.174730 -0.354974 + 1978 1.000000 1.000000 1.010000 0.930106 0.000000 0.172765 -0.324122 + 1979 1.000000 1.000000 1.010000 0.940749 0.000000 0.170710 -0.293001 + 1980 1.000000 1.000000 1.010000 0.950430 0.000000 0.168770 -0.261150 + 1981 1.000000 1.000000 1.010000 0.958830 0.000000 0.167426 -0.229378 + 1982 1.000000 1.000000 1.010000 0.966208 0.000000 0.166212 -0.197018 + 1983 1.000000 1.000000 1.010000 0.972435 0.000000 0.165053 -0.164705 + 1984 1.000000 1.000000 1.010000 0.977601 0.000000 0.164075 -0.131816 + 1985 1.000000 1.000000 1.010000 0.981569 0.000000 0.163452 -0.099021 + 1986 1.000000 1.000000 1.010000 0.984409 0.000000 0.163008 -0.066080 + 1987 1.000000 1.000000 1.010000 0.986134 0.000000 0.162669 -0.032831 + 1988 1.000000 1.000000 1.010000 0.980839 -0.000000 0.194822 0.000278 + 1989 1.000000 1.000000 1.010000 0.980230 -0.000000 0.194998 0.033552 + 1990 1.000000 1.000000 1.010000 0.978499 -0.000000 0.195257 0.066436 + 1991 1.000000 1.000000 1.010000 0.975539 -0.000000 0.195906 0.099726 + 1992 1.000000 1.000000 1.010000 0.971497 -0.000000 0.196585 0.132469 + 1993 1.000000 1.000000 1.010000 0.966229 -0.000000 0.197705 0.165271 + 1994 1.000000 1.000000 1.010000 0.959755 -0.000000 0.199306 0.197858 + 1995 1.000000 1.000000 1.010000 0.952232 -0.000000 0.200758 0.230110 + 1996 1.000000 1.000000 1.010000 0.943498 -0.000000 0.202743 0.262120 + 1997 1.000000 1.000000 1.010000 0.933732 -0.000000 0.204691 0.293676 + 1998 1.000000 1.000000 1.010000 0.922832 -0.000000 0.207233 0.324708 + 1999 1.000000 1.000000 1.010000 0.910847 -0.000000 0.209817 0.355436 + 2000 1.000000 1.000000 1.010000 0.897745 -0.000000 0.212751 0.385733 + 2001 1.000000 1.000000 1.010000 0.883630 -0.000000 0.216193 0.415281 + 2002 1.000000 1.000000 1.010000 0.868485 -0.000000 0.219876 0.444284 + 2003 1.000000 1.000000 1.010000 0.852236 -0.000000 0.224303 0.472632 + 2004 1.000000 1.000000 1.010000 0.835005 -0.000000 0.228937 0.500355 + 2005 1.000000 1.000000 1.010000 0.816898 -0.000000 0.234055 0.527159 + 2006 1.000000 1.000000 1.010000 0.797875 -0.000000 0.239339 0.553273 + 2007 1.000000 1.000000 1.010000 0.777921 -0.000000 0.245652 0.578354 + 2008 1.000000 1.000000 1.010000 0.757222 -0.000000 0.252299 0.602461 + 2009 1.000000 1.000000 1.010000 0.735337 -0.000000 0.259852 0.625905 + 2010 1.000000 1.000000 1.010000 0.712984 -0.000000 0.268175 0.647870 + 2011 1.000000 1.000000 1.010000 0.689642 -0.000000 0.277313 0.668947 + 2012 1.000000 1.000000 1.010000 0.665847 -0.000000 0.287342 0.688536 + 2013 1.000000 1.000000 1.010000 0.641066 -0.000000 0.298353 0.707121 + 2014 1.000000 1.000000 1.010000 0.615903 -0.000000 0.310415 0.724090 + 2015 1.000000 1.000000 1.010000 0.590211 -0.000000 0.324022 0.739365 + 2016 1.000000 1.000000 1.010000 0.563622 -0.000000 0.339156 0.753195 + 2017 1.000000 1.000000 1.010000 0.536802 -0.000000 0.355831 0.765002 + 2018 1.000000 1.000000 1.010000 0.509733 -0.000000 0.375027 0.774291 + 2019 1.000000 1.000000 1.010000 0.482286 -0.000000 0.396646 0.781071 + 2020 1.000000 1.000000 1.010000 0.454509 -0.000000 0.420530 0.785224 + 2021 1.000000 1.000000 1.010000 0.426805 -0.000000 0.447995 0.785581 + 2022 1.000000 1.000000 1.010000 0.399350 -0.000000 0.478701 0.781898 + 2023 1.000000 1.000000 1.010000 0.371708 -0.000000 0.514402 0.772802 + 2024 1.000000 1.000000 1.010000 0.344841 -0.000000 0.554711 0.757219 + 2025 1.000000 1.000000 1.010000 0.318382 -0.000000 0.600430 0.733564 + 2026 1.000000 1.000000 1.010000 0.293238 -0.000000 0.652067 0.699157 + 2027 1.000000 1.000000 1.010000 0.269094 -0.000000 0.710472 0.650245 + 2028 1.000000 1.000000 1.010000 0.247408 -0.000000 0.773423 0.583615 + 2029 1.000000 1.000000 1.010000 0.228316 -0.000000 0.837737 0.496053 + 2030 1.000000 1.000000 1.010000 0.212528 -0.000000 0.899426 0.381921 + 2031 1.000000 1.000000 1.010000 0.201685 -0.000000 0.948605 0.243868 + 2032 1.000000 1.000000 1.010000 0.195707 -0.000000 0.977077 0.083778 + 2033 1.000000 1.000000 1.010000 0.195708 0.000000 0.977201 -0.082325 + 2034 1.000000 1.000000 1.010000 0.201349 0.000000 0.949333 -0.241301 + 2035 1.000000 1.000000 1.010000 0.212616 0.000000 0.900043 -0.380418 + 2036 1.000000 1.000000 1.010000 0.228122 0.000000 0.838567 -0.494738 + 2037 1.000000 1.000000 1.010000 0.247155 0.000000 0.773947 -0.583027 + 2038 1.000000 1.000000 1.010000 0.269038 0.000000 0.711458 -0.649189 + 2039 1.000000 1.000000 1.010000 0.292817 0.000000 0.653208 -0.698268 + 2040 1.000000 1.000000 1.010000 0.318325 0.000000 0.600889 -0.733213 + 2041 1.000000 1.000000 1.010000 0.344525 0.000000 0.555263 -0.756958 + 2042 1.000000 1.000000 1.010000 0.371527 0.000000 0.514947 -0.772527 + 2043 1.000000 1.000000 1.010000 0.399194 0.000000 0.479218 -0.781662 + 2044 1.000000 1.000000 1.010000 0.426744 0.000000 0.448432 -0.785365 + 2045 1.000000 1.000000 1.010000 0.454630 0.000000 0.420991 -0.784907 + 2046 1.000000 1.000000 1.010000 0.482093 0.000000 0.396975 -0.781023 + 2047 1.000000 1.000000 1.010000 0.509757 0.000000 0.375435 -0.774078 + 2048 1.000000 1.000000 1.010000 0.536872 0.000000 0.355984 -0.764882 + 2049 1.000000 1.000000 1.010000 0.563567 0.000000 0.339348 -0.753150 + 2050 1.000000 1.000000 1.010000 0.589928 0.000000 0.324191 -0.739517 + 2051 1.000000 1.000000 1.010000 0.615801 0.000000 0.310683 -0.724061 + 2052 1.000000 1.000000 1.010000 0.641139 0.000000 0.298507 -0.706990 + 2053 1.000000 1.000000 1.010000 0.665810 0.000000 0.287270 -0.688602 + 2054 1.000000 1.000000 1.010000 0.689618 0.000000 0.277445 -0.668917 + 2055 1.000000 1.000000 1.010000 0.713041 0.000000 0.268088 -0.647843 + 2056 1.000000 1.000000 1.010000 0.735542 0.000000 0.259938 -0.625628 + 2057 1.000000 1.000000 1.010000 0.757114 0.000000 0.252801 -0.602387 + 2058 1.000000 1.000000 1.010000 0.777968 0.000000 0.245768 -0.578242 + 2059 1.000000 1.000000 1.010000 0.797985 0.000000 0.239643 -0.552983 + 2060 1.000000 1.000000 1.010000 0.817054 0.000000 0.234006 -0.526938 + 2061 1.000000 1.000000 1.010000 0.835230 0.000000 0.229008 -0.499947 + 2062 1.000000 1.000000 1.010000 0.852372 0.000000 0.224141 -0.472465 + 2063 1.000000 1.000000 1.010000 0.868460 0.000000 0.220253 -0.444146 + 2064 1.000000 1.000000 1.010000 0.883692 0.000000 0.216389 -0.415046 + 2065 1.000000 1.000000 1.010000 0.897869 0.000000 0.212872 -0.385379 + 2066 1.000000 1.000000 1.010000 0.910886 0.000000 0.210058 -0.355192 + 2067 1.000000 1.000000 1.010000 0.922964 0.000000 0.207112 -0.324410 + 2068 1.000000 1.000000 1.010000 0.933785 0.000000 0.204650 -0.293538 + 2069 1.000000 1.000000 1.010000 0.943575 0.000000 0.202604 -0.261951 + 2070 1.000000 1.000000 1.010000 0.952301 0.000000 0.200777 -0.229807 + 2071 1.000000 1.000000 1.010000 0.959820 0.000000 0.199237 -0.197609 + 2072 1.000000 1.000000 1.010000 0.966221 0.000000 0.197875 -0.165112 + 2073 1.000000 1.000000 1.010000 0.971489 0.000000 0.196650 -0.132430 + 2074 1.000000 1.000000 1.010000 0.975540 0.000000 0.196019 -0.099489 + 2075 1.000000 1.000000 1.010000 0.978450 0.000000 0.195520 -0.066385 + 2076 1.000000 1.000000 1.010000 0.980241 0.000000 0.195043 -0.032945 + 2077 1.000000 1.000000 1.010000 0.973952 -0.000000 0.226755 0.000103 + 2078 1.000000 1.000000 1.010000 0.973323 -0.000000 0.226940 0.033760 + 2079 1.000000 1.000000 1.010000 0.971478 -0.000000 0.227345 0.067411 + 2080 1.000000 1.000000 1.010000 0.968366 -0.000000 0.228195 0.100965 + 2081 1.000000 1.000000 1.010000 0.964085 -0.000000 0.229184 0.134219 + 2082 1.000000 1.000000 1.010000 0.958602 -0.000000 0.230463 0.167237 + 2083 1.000000 1.000000 1.010000 0.951911 -0.000000 0.232091 0.199999 + 2084 1.000000 1.000000 1.010000 0.944018 -0.000000 0.233923 0.232615 + 2085 1.000000 1.000000 1.010000 0.934900 -0.000000 0.236484 0.264647 + 2086 1.000000 1.000000 1.010000 0.924673 -0.000000 0.238905 0.296487 + 2087 1.000000 1.000000 1.010000 0.913266 -0.000000 0.241833 0.327815 + 2088 1.000000 1.000000 1.010000 0.900735 -0.000000 0.245142 0.358584 + 2089 1.000000 1.000000 1.010000 0.887163 -0.000000 0.248907 0.388570 + 2090 1.000000 1.000000 1.010000 0.872384 -0.000000 0.253231 0.418115 + 2091 1.000000 1.000000 1.010000 0.856563 -0.000000 0.257850 0.447004 + 2092 1.000000 1.000000 1.010000 0.839668 -0.000000 0.263188 0.475069 + 2093 1.000000 1.000000 1.010000 0.821941 -0.000000 0.268913 0.502094 + 2094 1.000000 1.000000 1.010000 0.803038 -0.000000 0.275294 0.528529 + 2095 1.000000 1.000000 1.010000 0.783382 -0.000000 0.282014 0.553878 + 2096 1.000000 1.000000 1.010000 0.762730 -0.000000 0.289749 0.578176 + 2097 1.000000 1.000000 1.010000 0.741124 -0.000000 0.298152 0.601532 + 2098 1.000000 1.000000 1.010000 0.718791 -0.000000 0.307405 0.623571 + 2099 1.000000 1.000000 1.010000 0.695527 -0.000000 0.317831 0.644380 + 2100 1.000000 1.000000 1.010000 0.671685 -0.000000 0.329069 0.663741 + 2101 1.000000 1.000000 1.010000 0.647222 -0.000000 0.341514 0.681521 + 2102 1.000000 1.000000 1.010000 0.621897 -0.000000 0.355167 0.697925 + 2103 1.000000 1.000000 1.010000 0.596240 -0.000000 0.370859 0.712012 + 2104 1.000000 1.000000 1.010000 0.569912 -0.000000 0.387756 0.724462 + 2105 1.000000 1.000000 1.010000 0.543201 -0.000000 0.406753 0.734496 + 2106 1.000000 1.000000 1.010000 0.516307 -0.000000 0.428367 0.741572 + 2107 1.000000 1.000000 1.010000 0.489202 -0.000000 0.452041 0.745882 + 2108 1.000000 1.000000 1.010000 0.461860 -0.000000 0.478622 0.746730 + 2109 1.000000 1.000000 1.010000 0.434545 -0.000000 0.508377 0.743453 + 2110 1.000000 1.000000 1.010000 0.407712 -0.000000 0.542559 0.734439 + 2111 1.000000 1.000000 1.010000 0.380943 -0.000000 0.580066 0.720004 + 2112 1.000000 1.000000 1.010000 0.355154 -0.000000 0.622395 0.697489 + 2113 1.000000 1.000000 1.010000 0.330194 -0.000000 0.669295 0.665594 + 2114 1.000000 1.000000 1.010000 0.306752 -0.000000 0.720885 0.621472 + 2115 1.000000 1.000000 1.010000 0.285118 -0.000000 0.775739 0.562971 + 2116 1.000000 1.000000 1.010000 0.265682 -0.000000 0.832141 0.486780 + 2117 1.000000 1.000000 1.010000 0.249491 -0.000000 0.885549 0.391863 + 2118 1.000000 1.000000 1.010000 0.237319 -0.000000 0.931550 0.275488 + 2119 1.000000 1.000000 1.010000 0.229530 -0.000000 0.962772 0.142781 + 2120 1.000000 1.000000 1.010000 0.226999 -0.000000 0.973895 0.000499 + 2121 1.000000 1.000000 1.010000 0.229739 0.000000 0.962930 -0.141369 + 2122 1.000000 1.000000 1.010000 0.237166 0.000000 0.931743 -0.274969 + 2123 1.000000 1.000000 1.010000 0.249364 0.000000 0.886424 -0.389963 + 2124 1.000000 1.000000 1.010000 0.265619 0.000000 0.832760 -0.485755 + 2125 1.000000 1.000000 1.010000 0.284842 0.000000 0.776210 -0.562461 + 2126 1.000000 1.000000 1.010000 0.306385 0.000000 0.721742 -0.620658 + 2127 1.000000 1.000000 1.010000 0.329907 0.000000 0.670482 -0.664541 + 2128 1.000000 1.000000 1.010000 0.354950 0.000000 0.623334 -0.696753 + 2129 1.000000 1.000000 1.010000 0.380932 0.000000 0.580679 -0.719516 + 2130 1.000000 1.000000 1.010000 0.407345 0.000000 0.542568 -0.734636 + 2131 1.000000 1.000000 1.010000 0.434520 0.000000 0.509154 -0.742936 + 2132 1.000000 1.000000 1.010000 0.461646 0.000000 0.479167 -0.746513 + 2133 1.000000 1.000000 1.010000 0.488903 0.000000 0.452182 -0.745993 + 2134 1.000000 1.000000 1.010000 0.515986 0.000000 0.428329 -0.741817 + 2135 1.000000 1.000000 1.010000 0.543096 0.000000 0.407025 -0.734423 + 2136 1.000000 1.000000 1.010000 0.569692 0.000000 0.388090 -0.724456 + 2137 1.000000 1.000000 1.010000 0.596119 0.000000 0.371018 -0.712031 + 2138 1.000000 1.000000 1.010000 0.621737 0.000000 0.355706 -0.697794 + 2139 1.000000 1.000000 1.010000 0.646992 0.000000 0.341953 -0.681520 + 2140 1.000000 1.000000 1.010000 0.671585 0.000000 0.329104 -0.663825 + 2141 1.000000 1.000000 1.010000 0.695635 0.000000 0.317799 -0.644279 + 2142 1.000000 1.000000 1.010000 0.718700 0.000000 0.307541 -0.623610 + 2143 1.000000 1.000000 1.010000 0.741168 0.000000 0.298181 -0.601463 + 2144 1.000000 1.000000 1.010000 0.762692 0.000000 0.289690 -0.578257 + 2145 1.000000 1.000000 1.010000 0.783416 0.000000 0.282095 -0.553789 + 2146 1.000000 1.000000 1.010000 0.803058 0.000000 0.275414 -0.528437 + 2147 1.000000 1.000000 1.010000 0.822027 0.000000 0.268774 -0.502029 + 2148 1.000000 1.000000 1.010000 0.839892 0.000000 0.263117 -0.474711 + 2149 1.000000 1.000000 1.010000 0.856604 0.000000 0.258096 -0.446785 + 2150 1.000000 1.000000 1.010000 0.872433 0.000000 0.253222 -0.418017 + 2151 1.000000 1.000000 1.010000 0.887186 0.000000 0.249037 -0.388434 + 2152 1.000000 1.000000 1.010000 0.900822 0.000000 0.245273 -0.358274 + 2153 1.000000 1.000000 1.010000 0.913271 0.000000 0.242141 -0.327573 + 2154 1.000000 1.000000 1.010000 0.924702 0.000000 0.239048 -0.296282 + 2155 1.000000 1.000000 1.010000 0.934970 0.000000 0.236499 -0.264386 + 2156 1.000000 1.000000 1.010000 0.944090 0.000000 0.233939 -0.232309 + 2157 1.000000 1.000000 1.010000 0.951961 0.000000 0.232160 -0.199679 + 2158 1.000000 1.000000 1.010000 0.958630 0.000000 0.230474 -0.167061 + 2159 1.000000 1.000000 1.010000 0.964126 0.000000 0.229185 -0.133923 + 2160 1.000000 1.000000 1.010000 0.968415 0.000000 0.228179 -0.100532 + 2161 1.000000 1.000000 1.010000 0.971462 0.000000 0.227518 -0.067055 + 2162 1.000000 1.000000 1.010000 0.973347 0.000000 0.226900 -0.033362 + 2163 1.000000 1.000000 1.010000 0.966011 -0.000000 0.258503 0.000045 + 2164 1.000000 1.000000 1.010000 0.965355 -0.000000 0.258725 0.033938 + 2165 1.000000 1.000000 1.010000 0.963405 -0.000000 0.259287 0.067978 + 2166 1.000000 1.000000 1.010000 0.960209 -0.000000 0.260181 0.101515 + 2167 1.000000 1.000000 1.010000 0.955735 -0.000000 0.261383 0.135094 + 2168 1.000000 1.000000 1.010000 0.949950 -0.000000 0.262940 0.168696 + 2169 1.000000 1.000000 1.010000 0.942968 -0.000000 0.264850 0.201660 + 2170 1.000000 1.000000 1.010000 0.934739 -0.000000 0.267131 0.234315 + 2171 1.000000 1.000000 1.010000 0.925290 -0.000000 0.269773 0.266571 + 2172 1.000000 1.000000 1.010000 0.914559 -0.000000 0.273111 0.298317 + 2173 1.000000 1.000000 1.010000 0.902699 -0.000000 0.276618 0.329570 + 2174 1.000000 1.000000 1.010000 0.889642 -0.000000 0.280765 0.360150 + 2175 1.000000 1.000000 1.010000 0.875398 -0.000000 0.285497 0.390089 + 2176 1.000000 1.000000 1.010000 0.860137 -0.000000 0.290348 0.419360 + 2177 1.000000 1.000000 1.010000 0.843697 -0.000000 0.295993 0.447842 + 2178 1.000000 1.000000 1.010000 0.826187 -0.000000 0.302280 0.475439 + 2179 1.000000 1.000000 1.010000 0.807758 -0.000000 0.309198 0.501920 + 2180 1.000000 1.000000 1.010000 0.788251 -0.000000 0.317024 0.527405 + 2181 1.000000 1.000000 1.010000 0.767946 -0.000000 0.325406 0.551697 + 2182 1.000000 1.000000 1.010000 0.746542 -0.000000 0.334597 0.575082 + 2183 1.000000 1.000000 1.010000 0.724494 -0.000000 0.344729 0.596884 + 2184 1.000000 1.000000 1.010000 0.701294 -0.000000 0.356123 0.617546 + 2185 1.000000 1.000000 1.010000 0.677759 -0.000000 0.368630 0.636204 + 2186 1.000000 1.000000 1.010000 0.653311 -0.000000 0.382268 0.653495 + 2187 1.000000 1.000000 1.010000 0.628286 -0.000000 0.397614 0.668700 + 2188 1.000000 1.000000 1.010000 0.602744 -0.000000 0.414502 0.681827 + 2189 1.000000 1.000000 1.010000 0.576734 -0.000000 0.433237 0.692591 + 2190 1.000000 1.000000 1.010000 0.550214 -0.000000 0.453766 0.700971 + 2191 1.000000 1.000000 1.010000 0.523769 -0.000000 0.477149 0.705688 + 2192 1.000000 1.000000 1.010000 0.496787 -0.000000 0.502840 0.707357 + 2193 1.000000 1.000000 1.010000 0.470202 -0.000000 0.531317 0.704708 + 2194 1.000000 1.000000 1.010000 0.443587 -0.000000 0.563199 0.697164 + 2195 1.000000 1.000000 1.010000 0.417642 -0.000000 0.598756 0.683423 + 2196 1.000000 1.000000 1.010000 0.391900 -0.000000 0.637263 0.663558 + 2197 1.000000 1.000000 1.010000 0.367356 -0.000000 0.680240 0.634290 + 2198 1.000000 1.000000 1.010000 0.344264 -0.000000 0.726094 0.595206 + 2199 1.000000 1.000000 1.010000 0.322614 -0.000000 0.775135 0.543218 + 2200 1.000000 1.000000 1.010000 0.303099 -0.000000 0.824559 0.477738 + 2201 1.000000 1.000000 1.010000 0.286406 -0.000000 0.872407 0.396077 + 2202 1.000000 1.000000 1.010000 0.273380 -0.000000 0.914225 0.299092 + 2203 1.000000 1.000000 1.010000 0.264109 -0.000000 0.946213 0.186888 + 2204 1.000000 1.000000 1.010000 0.259339 -0.000000 0.963652 0.064175 + 2205 1.000000 1.000000 1.010000 0.259191 0.000000 0.963816 -0.062271 + 2206 1.000000 1.000000 1.010000 0.264008 0.000000 0.946663 -0.184738 + 2207 1.000000 1.000000 1.010000 0.273395 0.000000 0.914728 -0.297536 + 2208 1.000000 1.000000 1.010000 0.286434 0.000000 0.872748 -0.395306 + 2209 1.000000 1.000000 1.010000 0.303027 0.000000 0.824908 -0.477182 + 2210 1.000000 1.000000 1.010000 0.322209 0.000000 0.775602 -0.542792 + 2211 1.000000 1.000000 1.010000 0.343924 0.000000 0.726454 -0.594963 + 2212 1.000000 1.000000 1.010000 0.367188 0.000000 0.680804 -0.633782 + 2213 1.000000 1.000000 1.010000 0.391972 0.000000 0.638125 -0.662688 + 2214 1.000000 1.000000 1.010000 0.417474 0.000000 0.598965 -0.683342 + 2215 1.000000 1.000000 1.010000 0.443521 0.000000 0.563785 -0.696732 + 2216 1.000000 1.000000 1.010000 0.470172 0.000000 0.531484 -0.704601 + 2217 1.000000 1.000000 1.010000 0.496866 0.000000 0.503020 -0.707174 + 2218 1.000000 1.000000 1.010000 0.523669 0.000000 0.477373 -0.705610 + 2219 1.000000 1.000000 1.010000 0.550085 0.000000 0.454340 -0.700701 + 2220 1.000000 1.000000 1.010000 0.576531 0.000000 0.433796 -0.692411 + 2221 1.000000 1.000000 1.010000 0.602728 0.000000 0.414826 -0.681644 + 2222 1.000000 1.000000 1.010000 0.628335 0.000000 0.397871 -0.668501 + 2223 1.000000 1.000000 1.010000 0.653315 0.000000 0.382418 -0.653403 + 2224 1.000000 1.000000 1.010000 0.677624 0.000000 0.368927 -0.636175 + 2225 1.000000 1.000000 1.010000 0.701321 0.000000 0.356573 -0.617256 + 2226 1.000000 1.000000 1.010000 0.724479 0.000000 0.344983 -0.596755 + 2227 1.000000 1.000000 1.010000 0.746644 0.000000 0.334650 -0.574920 + 2228 1.000000 1.000000 1.010000 0.767876 0.000000 0.325445 -0.551772 + 2229 1.000000 1.000000 1.010000 0.788312 0.000000 0.316991 -0.527334 + 2230 1.000000 1.000000 1.010000 0.807820 0.000000 0.309371 -0.501714 + 2231 1.000000 1.000000 1.010000 0.826386 0.000000 0.302598 -0.474891 + 2232 1.000000 1.000000 1.010000 0.843853 0.000000 0.296107 -0.447474 + 2233 1.000000 1.000000 1.010000 0.860200 0.000000 0.290319 -0.419250 + 2234 1.000000 1.000000 1.010000 0.875485 0.000000 0.285500 -0.389893 + 2235 1.000000 1.000000 1.010000 0.889712 0.000000 0.280907 -0.359866 + 2236 1.000000 1.000000 1.010000 0.902798 0.000000 0.276623 -0.329296 + 2237 1.000000 1.000000 1.010000 0.914653 0.000000 0.273241 -0.297907 + 2238 1.000000 1.000000 1.010000 0.925327 0.000000 0.270046 -0.266167 + 2239 1.000000 1.000000 1.010000 0.934738 0.000000 0.267381 -0.234035 + 2240 1.000000 1.000000 1.010000 0.943039 0.000000 0.264875 -0.201293 + 2241 1.000000 1.000000 1.010000 0.949978 0.000000 0.263055 -0.168358 + 2242 1.000000 1.000000 1.010000 0.955725 0.000000 0.261436 -0.135061 + 2243 1.000000 1.000000 1.010000 0.960292 0.000000 0.259976 -0.101252 + 2244 1.000000 1.000000 1.010000 0.963453 0.000000 0.259164 -0.067760 + 2245 1.000000 1.000000 1.010000 0.965382 0.000000 0.258644 -0.033782 + 2246 1.000000 1.000000 1.010000 0.957009 -0.000000 0.290057 0.000088 + 2247 1.000000 1.000000 1.010000 0.956361 -0.000000 0.290181 0.034173 + 2248 1.000000 1.000000 1.010000 0.954300 -0.000000 0.290922 0.068386 + 2249 1.000000 1.000000 1.010000 0.950917 -0.000000 0.292024 0.102370 + 2250 1.000000 1.000000 1.010000 0.946300 -0.000000 0.293399 0.135773 + 2251 1.000000 1.000000 1.010000 0.940281 -0.000000 0.295222 0.169460 + 2252 1.000000 1.000000 1.010000 0.933032 -0.000000 0.297372 0.202535 + 2253 1.000000 1.000000 1.010000 0.924347 -0.000000 0.300380 0.235274 + 2254 1.000000 1.000000 1.010000 0.914574 -0.000000 0.303390 0.267411 + 2255 1.000000 1.000000 1.010000 0.903522 -0.000000 0.307134 0.298858 + 2256 1.000000 1.000000 1.010000 0.891151 -0.000000 0.311447 0.329926 + 2257 1.000000 1.000000 1.010000 0.877540 -0.000000 0.316240 0.360439 + 2258 1.000000 1.000000 1.010000 0.862858 -0.000000 0.321584 0.389949 + 2259 1.000000 1.000000 1.010000 0.846983 -0.000000 0.327683 0.418622 + 2260 1.000000 1.000000 1.010000 0.829970 -0.000000 0.334312 0.446526 + 2261 1.000000 1.000000 1.010000 0.811850 -0.000000 0.341973 0.473237 + 2262 1.000000 1.000000 1.010000 0.792965 -0.000000 0.350092 0.498641 + 2263 1.000000 1.000000 1.010000 0.772697 -0.000000 0.359244 0.523338 + 2264 1.000000 1.000000 1.010000 0.751752 -0.000000 0.369440 0.546245 + 2265 1.000000 1.000000 1.010000 0.730034 -0.000000 0.380184 0.567900 + 2266 1.000000 1.000000 1.010000 0.707193 -0.000000 0.392499 0.588067 + 2267 1.000000 1.000000 1.010000 0.683732 -0.000000 0.405841 0.606468 + 2268 1.000000 1.000000 1.010000 0.659548 -0.000000 0.420783 0.622847 + 2269 1.000000 1.000000 1.010000 0.635042 -0.000000 0.437121 0.636904 + 2270 1.000000 1.000000 1.010000 0.609617 -0.000000 0.455387 0.648837 + 2271 1.000000 1.000000 1.010000 0.583967 -0.000000 0.475481 0.657952 + 2272 1.000000 1.000000 1.010000 0.558128 -0.000000 0.497464 0.664096 + 2273 1.000000 1.000000 1.010000 0.531848 -0.000000 0.521917 0.666888 + 2274 1.000000 1.000000 1.010000 0.505800 -0.000000 0.549157 0.665276 + 2275 1.000000 1.000000 1.010000 0.479683 -0.000000 0.578803 0.659463 + 2276 1.000000 1.000000 1.010000 0.454126 -0.000000 0.611721 0.647740 + 2277 1.000000 1.000000 1.010000 0.428765 -0.000000 0.647373 0.630134 + 2278 1.000000 1.000000 1.010000 0.404636 -0.000000 0.686346 0.604317 + 2279 1.000000 1.000000 1.010000 0.381498 -0.000000 0.728098 0.569502 + 2280 1.000000 1.000000 1.010000 0.360036 -0.000000 0.771244 0.524936 + 2281 1.000000 1.000000 1.010000 0.340552 -0.000000 0.815634 0.467724 + 2282 1.000000 1.000000 1.010000 0.323610 -0.000000 0.858647 0.397493 + 2283 1.000000 1.000000 1.010000 0.309476 -0.000000 0.897434 0.314382 + 2284 1.000000 1.000000 1.010000 0.299023 -0.000000 0.928994 0.218073 + 2285 1.000000 1.000000 1.010000 0.292505 -0.000000 0.949672 0.112091 + 2286 1.000000 1.000000 1.010000 0.290114 -0.000000 0.956992 0.000911 + 2287 1.000000 1.000000 1.010000 0.292209 0.000000 0.949921 -0.110744 + 2288 1.000000 1.000000 1.010000 0.298677 0.000000 0.929356 -0.217001 + 2289 1.000000 1.000000 1.010000 0.309315 0.000000 0.897922 -0.313146 + 2290 1.000000 1.000000 1.010000 0.323440 0.000000 0.858996 -0.396880 + 2291 1.000000 1.000000 1.010000 0.340214 0.000000 0.815998 -0.467335 + 2292 1.000000 1.000000 1.010000 0.359975 0.000000 0.771841 -0.524098 + 2293 1.000000 1.000000 1.010000 0.381565 0.000000 0.728118 -0.569432 + 2294 1.000000 1.000000 1.010000 0.404439 0.000000 0.686558 -0.604207 + 2295 1.000000 1.000000 1.010000 0.428736 0.000000 0.648071 -0.629436 + 2296 1.000000 1.000000 1.010000 0.453895 0.000000 0.612086 -0.647556 + 2297 1.000000 1.000000 1.010000 0.479670 0.000000 0.579383 -0.658963 + 2298 1.000000 1.000000 1.010000 0.505582 0.000000 0.549427 -0.665219 + 2299 1.000000 1.000000 1.010000 0.531772 0.000000 0.522110 -0.666798 + 2300 1.000000 1.000000 1.010000 0.557917 0.000000 0.497817 -0.664008 + 2301 1.000000 1.000000 1.010000 0.583816 0.000000 0.475621 -0.657984 + 2302 1.000000 1.000000 1.010000 0.609684 0.000000 0.455774 -0.648503 + 2303 1.000000 1.000000 1.010000 0.634907 0.000000 0.437419 -0.636834 + 2304 1.000000 1.000000 1.010000 0.659668 0.000000 0.421029 -0.622553 + 2305 1.000000 1.000000 1.010000 0.683799 0.000000 0.406178 -0.606167 + 2306 1.000000 1.000000 1.010000 0.707229 0.000000 0.392844 -0.587794 + 2307 1.000000 1.000000 1.010000 0.729896 0.000000 0.380593 -0.567803 + 2308 1.000000 1.000000 1.010000 0.751849 0.000000 0.369386 -0.546147 + 2309 1.000000 1.000000 1.010000 0.772740 0.000000 0.359451 -0.523133 + 2310 1.000000 1.000000 1.010000 0.792801 0.000000 0.350387 -0.498694 + 2311 1.000000 1.000000 1.010000 0.811898 0.000000 0.342201 -0.472991 + 2312 1.000000 1.000000 1.010000 0.830114 0.000000 0.334551 -0.446079 + 2313 1.000000 1.000000 1.010000 0.847083 0.000000 0.327792 -0.418333 + 2314 1.000000 1.000000 1.010000 0.862835 0.000000 0.321994 -0.389661 + 2315 1.000000 1.000000 1.010000 0.877583 0.000000 0.316412 -0.360181 + 2316 1.000000 1.000000 1.010000 0.891147 0.000000 0.311564 -0.329825 + 2317 1.000000 1.000000 1.010000 0.903521 0.000000 0.307267 -0.298727 + 2318 1.000000 1.000000 1.010000 0.914652 0.000000 0.303582 -0.266925 + 2319 1.000000 1.000000 1.010000 0.924521 0.000000 0.300218 -0.234799 + 2320 1.000000 1.000000 1.010000 0.933064 0.000000 0.297652 -0.201978 + 2321 1.000000 1.000000 1.010000 0.940366 0.000000 0.295210 -0.169007 + 2322 1.000000 1.000000 1.010000 0.946365 0.000000 0.293290 -0.135554 + 2323 1.000000 1.000000 1.010000 0.950983 0.000000 0.291967 -0.101918 + 2324 1.000000 1.000000 1.010000 0.954360 0.000000 0.290785 -0.068118 + 2325 1.000000 1.000000 1.010000 0.956301 0.000000 0.290419 -0.033847 + 2326 1.000000 1.000000 1.010000 0.947049 -0.000000 0.321088 0.000058 + 2327 1.000000 1.000000 1.010000 0.946303 -0.000000 0.321410 0.034722 + 2328 1.000000 1.000000 1.010000 0.944137 -0.000000 0.322197 0.069237 + 2329 1.000000 1.000000 1.010000 0.940606 -0.000000 0.323278 0.103690 + 2330 1.000000 1.000000 1.010000 0.935562 -0.000000 0.325140 0.137866 + 2331 1.000000 1.000000 1.010000 0.929128 -0.000000 0.327453 0.171747 + 2332 1.000000 1.000000 1.010000 0.921444 -0.000000 0.329936 0.205139 + 2333 1.000000 1.000000 1.010000 0.912173 -0.000000 0.333535 0.238105 + 2334 1.000000 1.000000 1.010000 0.901728 -0.000000 0.337189 0.270537 + 2335 1.000000 1.000000 1.010000 0.889939 -0.000000 0.341853 0.301903 + 2336 1.000000 1.000000 1.010000 0.876739 -0.000000 0.346894 0.333156 + 2337 1.000000 1.000000 1.010000 0.862458 -0.000000 0.352762 0.362940 + 2338 1.000000 1.000000 1.010000 0.846862 -0.000000 0.359242 0.392135 + 2339 1.000000 1.000000 1.010000 0.830049 -0.000000 0.366516 0.420338 + 2340 1.000000 1.000000 1.010000 0.812092 -0.000000 0.374609 0.447409 + 2341 1.000000 1.000000 1.010000 0.793093 -0.000000 0.383527 0.473191 + 2342 1.000000 1.000000 1.010000 0.772935 -0.000000 0.393646 0.497609 + 2343 1.000000 1.000000 1.010000 0.751991 -0.000000 0.404626 0.520372 + 2344 1.000000 1.000000 1.010000 0.729929 -0.000000 0.416654 0.541851 + 2345 1.000000 1.000000 1.010000 0.707228 -0.000000 0.430104 0.561105 + 2346 1.000000 1.000000 1.010000 0.683749 -0.000000 0.444870 0.578427 + 2347 1.000000 1.000000 1.010000 0.659542 -0.000000 0.461150 0.593586 + 2348 1.000000 1.000000 1.010000 0.634669 -0.000000 0.479337 0.606162 + 2349 1.000000 1.000000 1.010000 0.609352 -0.000000 0.499325 0.615926 + 2350 1.000000 1.000000 1.010000 0.583806 -0.000000 0.521223 0.622493 + 2351 1.000000 1.000000 1.010000 0.558096 -0.000000 0.545288 0.625452 + 2352 1.000000 1.000000 1.010000 0.532108 -0.000000 0.571673 0.624541 + 2353 1.000000 1.000000 1.010000 0.506593 -0.000000 0.600776 0.618410 + 2354 1.000000 1.000000 1.010000 0.480931 -0.000000 0.632570 0.607091 + 2355 1.000000 1.000000 1.010000 0.456258 -0.000000 0.666747 0.589302 + 2356 1.000000 1.000000 1.010000 0.432470 -0.000000 0.703344 0.564160 + 2357 1.000000 1.000000 1.010000 0.409821 -0.000000 0.742647 0.529643 + 2358 1.000000 1.000000 1.010000 0.388932 -0.000000 0.782610 0.486059 + 2359 1.000000 1.000000 1.010000 0.369905 -0.000000 0.822707 0.431652 + 2360 1.000000 1.000000 1.010000 0.353383 -0.000000 0.861241 0.365217 + 2361 1.000000 1.000000 1.010000 0.339862 -0.000000 0.895544 0.287219 + 2362 1.000000 1.000000 1.010000 0.329710 -0.000000 0.922997 0.198412 + 2363 1.000000 1.000000 1.010000 0.323541 -0.000000 0.940728 0.101744 + 2364 1.000000 1.000000 1.010000 0.321324 -0.000000 0.946969 0.000050 + 2365 1.000000 1.000000 1.010000 0.323332 0.000000 0.940885 -0.100958 + 2366 1.000000 1.000000 1.010000 0.329839 0.000000 0.923114 -0.197651 + 2367 1.000000 1.000000 1.010000 0.339753 0.000000 0.895840 -0.286425 + 2368 1.000000 1.000000 1.010000 0.353160 0.000000 0.861814 -0.364080 + 2369 1.000000 1.000000 1.010000 0.369713 0.000000 0.823323 -0.430641 + 2370 1.000000 1.000000 1.010000 0.388715 0.000000 0.783262 -0.485182 + 2371 1.000000 1.000000 1.010000 0.409796 0.000000 0.743076 -0.529061 + 2372 1.000000 1.000000 1.010000 0.432435 0.000000 0.703760 -0.563668 + 2373 1.000000 1.000000 1.010000 0.456117 0.000000 0.666911 -0.589225 + 2374 1.000000 1.000000 1.010000 0.481149 0.000000 0.632660 -0.606825 + 2375 1.000000 1.000000 1.010000 0.506254 0.000000 0.601296 -0.618182 + 2376 1.000000 1.000000 1.010000 0.532142 0.000000 0.572019 -0.624195 + 2377 1.000000 1.000000 1.010000 0.557935 0.000000 0.545591 -0.625331 + 2378 1.000000 1.000000 1.010000 0.583822 0.000000 0.521279 -0.622431 + 2379 1.000000 1.000000 1.010000 0.609251 0.000000 0.499351 -0.616005 + 2380 1.000000 1.000000 1.010000 0.634606 0.000000 0.479537 -0.606068 + 2381 1.000000 1.000000 1.010000 0.659401 0.000000 0.461842 -0.593205 + 2382 1.000000 1.000000 1.010000 0.683576 0.000000 0.445153 -0.578414 + 2383 1.000000 1.000000 1.010000 0.707242 0.000000 0.430461 -0.560813 + 2384 1.000000 1.000000 1.010000 0.730043 0.000000 0.416972 -0.541452 + 2385 1.000000 1.000000 1.010000 0.751937 0.000000 0.404769 -0.520340 + 2386 1.000000 1.000000 1.010000 0.773055 0.000000 0.393756 -0.497336 + 2387 1.000000 1.000000 1.010000 0.793196 0.000000 0.383608 -0.472953 + 2388 1.000000 1.000000 1.010000 0.812113 0.000000 0.374644 -0.447341 + 2389 1.000000 1.000000 1.010000 0.830070 0.000000 0.366643 -0.420186 + 2390 1.000000 1.000000 1.010000 0.846846 0.000000 0.359420 -0.392006 + 2391 1.000000 1.000000 1.010000 0.862371 0.000000 0.352953 -0.362961 + 2392 1.000000 1.000000 1.010000 0.876852 0.000000 0.346895 -0.332858 + 2393 1.000000 1.000000 1.010000 0.889987 0.000000 0.341939 -0.301663 + 2394 1.000000 1.000000 1.010000 0.901747 0.000000 0.337521 -0.270061 + 2395 1.000000 1.000000 1.010000 0.912261 0.000000 0.333522 -0.237789 + 2396 1.000000 1.000000 1.010000 0.921435 0.000000 0.330215 -0.204732 + 2397 1.000000 1.000000 1.010000 0.929172 0.000000 0.327512 -0.171392 + 2398 1.000000 1.000000 1.010000 0.935623 0.000000 0.325062 -0.137638 + 2399 1.000000 1.000000 1.010000 0.940616 0.000000 0.323371 -0.103305 + 2400 1.000000 1.000000 1.010000 0.944195 0.000000 0.322061 -0.069088 + 2401 1.000000 1.000000 1.010000 0.946298 0.000000 0.321467 -0.034324 + 2402 1.000000 1.000000 1.010000 0.935959 -0.000000 0.352109 0.000146 + 2403 1.000000 1.000000 1.010000 0.935184 -0.000000 0.352414 0.035155 + 2404 1.000000 1.000000 1.010000 0.932956 -0.000000 0.353075 0.070221 + 2405 1.000000 1.000000 1.010000 0.929139 -0.000000 0.354515 0.104976 + 2406 1.000000 1.000000 1.010000 0.923790 -0.000000 0.356665 0.139294 + 2407 1.000000 1.000000 1.010000 0.916990 -0.000000 0.359334 0.173230 + 2408 1.000000 1.000000 1.010000 0.908668 -0.000000 0.362659 0.206884 + 2409 1.000000 1.000000 1.010000 0.898913 -0.000000 0.366519 0.240042 + 2410 1.000000 1.000000 1.010000 0.887780 -0.000000 0.370947 0.272478 + 2411 1.000000 1.000000 1.010000 0.875208 -0.000000 0.376436 0.303820 + 2412 1.000000 1.000000 1.010000 0.861357 -0.000000 0.382410 0.334406 + 2413 1.000000 1.000000 1.010000 0.845980 -0.000000 0.389484 0.364171 + 2414 1.000000 1.000000 1.010000 0.829414 -0.000000 0.397262 0.392753 + 2415 1.000000 1.000000 1.010000 0.811877 -0.000000 0.405729 0.419809 + 2416 1.000000 1.000000 1.010000 0.792891 -0.000000 0.415365 0.445864 + 2417 1.000000 1.000000 1.010000 0.773034 -0.000000 0.426220 0.469845 + 2418 1.000000 1.000000 1.010000 0.751922 -0.000000 0.438119 0.492610 + 2419 1.000000 1.000000 1.010000 0.730089 -0.000000 0.451249 0.513171 + 2420 1.000000 1.000000 1.010000 0.707148 -0.000000 0.465873 0.531886 + 2421 1.000000 1.000000 1.010000 0.683576 -0.000000 0.481948 0.548133 + 2422 1.000000 1.000000 1.010000 0.659574 -0.000000 0.499637 0.561538 + 2423 1.000000 1.000000 1.010000 0.634602 -0.000000 0.519467 0.572219 + 2424 1.000000 1.000000 1.010000 0.609634 -0.000000 0.540605 0.579734 + 2425 1.000000 1.000000 1.010000 0.584242 -0.000000 0.563945 0.583633 + 2426 1.000000 1.000000 1.010000 0.558724 -0.000000 0.589710 0.583155 + 2427 1.000000 1.000000 1.010000 0.533302 -0.000000 0.617834 0.577814 + 2428 1.000000 1.000000 1.010000 0.508526 -0.000000 0.648431 0.566514 + 2429 1.000000 1.000000 1.010000 0.483964 -0.000000 0.681016 0.549542 + 2430 1.000000 1.000000 1.010000 0.460607 -0.000000 0.715552 0.525191 + 2431 1.000000 1.000000 1.010000 0.438373 -0.000000 0.751839 0.492511 + 2432 1.000000 1.000000 1.010000 0.417627 -0.000000 0.789034 0.450569 + 2433 1.000000 1.000000 1.010000 0.399175 -0.000000 0.825552 0.398904 + 2434 1.000000 1.000000 1.010000 0.383240 -0.000000 0.860391 0.335939 + 2435 1.000000 1.000000 1.010000 0.370011 -0.000000 0.890988 0.263122 + 2436 1.000000 1.000000 1.010000 0.360271 -0.000000 0.915002 0.181596 + 2437 1.000000 1.000000 1.010000 0.354357 -0.000000 0.930473 0.093008 + 2438 1.000000 1.000000 1.010000 0.352242 -0.000000 0.935909 0.000600 + 2439 1.000000 1.000000 1.010000 0.354235 0.000000 0.930620 -0.092000 + 2440 1.000000 1.000000 1.010000 0.360262 0.000000 0.915114 -0.181047 + 2441 1.000000 1.000000 1.010000 0.369929 0.000000 0.891082 -0.262918 + 2442 1.000000 1.000000 1.010000 0.383084 0.000000 0.860579 -0.335634 + 2443 1.000000 1.000000 1.010000 0.399109 0.000000 0.826031 -0.397976 + 2444 1.000000 1.000000 1.010000 0.417763 0.000000 0.789523 -0.449586 + 2445 1.000000 1.000000 1.010000 0.438341 0.000000 0.752329 -0.491791 + 2446 1.000000 1.000000 1.010000 0.460469 0.000000 0.715925 -0.524805 + 2447 1.000000 1.000000 1.010000 0.484018 0.000000 0.681425 -0.548987 + 2448 1.000000 1.000000 1.010000 0.508383 0.000000 0.648511 -0.566551 + 2449 1.000000 1.000000 1.010000 0.533419 0.000000 0.618375 -0.577128 + 2450 1.000000 1.000000 1.010000 0.558704 0.000000 0.590248 -0.582630 + 2451 1.000000 1.000000 1.010000 0.584256 0.000000 0.564486 -0.583095 + 2452 1.000000 1.000000 1.010000 0.609504 0.000000 0.540700 -0.579784 + 2453 1.000000 1.000000 1.010000 0.634641 0.000000 0.519592 -0.572061 + 2454 1.000000 1.000000 1.010000 0.659430 0.000000 0.499918 -0.561457 + 2455 1.000000 1.000000 1.010000 0.683598 0.000000 0.482300 -0.547796 + 2456 1.000000 1.000000 1.010000 0.707326 0.000000 0.465928 -0.531602 + 2457 1.000000 1.000000 1.010000 0.730028 0.000000 0.451551 -0.512992 + 2458 1.000000 1.000000 1.010000 0.751923 0.000000 0.438223 -0.492516 + 2459 1.000000 1.000000 1.010000 0.772973 0.000000 0.426453 -0.469735 + 2460 1.000000 1.000000 1.010000 0.793021 0.000000 0.415673 -0.445347 + 2461 1.000000 1.000000 1.010000 0.811820 0.000000 0.406049 -0.419611 + 2462 1.000000 1.000000 1.010000 0.829508 0.000000 0.397476 -0.392338 + 2463 1.000000 1.000000 1.010000 0.846103 0.000000 0.389560 -0.363803 + 2464 1.000000 1.000000 1.010000 0.861313 0.000000 0.382736 -0.334145 + 2465 1.000000 1.000000 1.010000 0.875238 0.000000 0.376452 -0.303716 + 2466 1.000000 1.000000 1.010000 0.887750 0.000000 0.371415 -0.271941 + 2467 1.000000 1.000000 1.010000 0.898983 0.000000 0.366584 -0.239678 + 2468 1.000000 1.000000 1.010000 0.908740 0.000000 0.362676 -0.206536 + 2469 1.000000 1.000000 1.010000 0.917022 0.000000 0.359301 -0.173128 + 2470 1.000000 1.000000 1.010000 0.923834 0.000000 0.356665 -0.138997 + 2471 1.000000 1.000000 1.010000 0.929088 0.000000 0.354780 -0.104526 + 2472 1.000000 1.000000 1.010000 0.932999 0.000000 0.353073 -0.069664 + 2473 1.000000 1.000000 1.010000 0.935227 0.000000 0.352314 -0.035015 + 2474 1.000000 1.000000 1.010000 0.923942 -0.000000 0.382532 0.000068 + 2475 1.000000 1.000000 1.010000 0.923213 -0.000000 0.382629 0.035675 + 2476 1.000000 1.000000 1.010000 0.920694 -0.000000 0.383788 0.070920 + 2477 1.000000 1.000000 1.010000 0.916616 -0.000000 0.385543 0.105698 + 2478 1.000000 1.000000 1.010000 0.910935 -0.000000 0.387895 0.140478 + 2479 1.000000 1.000000 1.010000 0.903649 -0.000000 0.390994 0.174760 + 2480 1.000000 1.000000 1.010000 0.894746 -0.000000 0.395049 0.208247 + 2481 1.000000 1.000000 1.010000 0.884527 -0.000000 0.399408 0.241009 + 2482 1.000000 1.000000 1.010000 0.872662 -0.000000 0.404816 0.273103 + 2483 1.000000 1.000000 1.010000 0.859253 -0.000000 0.411251 0.304232 + 2484 1.000000 1.000000 1.010000 0.844442 -0.000000 0.418457 0.334383 + 2485 1.000000 1.000000 1.010000 0.828450 -0.000000 0.426452 0.363055 + 2486 1.000000 1.000000 1.010000 0.810959 -0.000000 0.435576 0.390666 + 2487 1.000000 1.000000 1.010000 0.792447 -0.000000 0.445862 0.416214 + 2488 1.000000 1.000000 1.010000 0.772611 -0.000000 0.457431 0.440261 + 2489 1.000000 1.000000 1.010000 0.751689 -0.000000 0.470028 0.462641 + 2490 1.000000 1.000000 1.010000 0.730015 -0.000000 0.484108 0.482408 + 2491 1.000000 1.000000 1.010000 0.707285 -0.000000 0.499577 0.500170 + 2492 1.000000 1.000000 1.010000 0.683866 -0.000000 0.516962 0.514856 + 2493 1.000000 1.000000 1.010000 0.659598 -0.000000 0.535890 0.527022 + 2494 1.000000 1.000000 1.010000 0.635042 -0.000000 0.556567 0.535681 + 2495 1.000000 1.000000 1.010000 0.610337 -0.000000 0.579011 0.540588 + 2496 1.000000 1.000000 1.010000 0.585370 -0.000000 0.603869 0.541003 + 2497 1.000000 1.000000 1.010000 0.560461 -0.000000 0.630534 0.536946 + 2498 1.000000 1.000000 1.010000 0.535791 -0.000000 0.659633 0.527080 + 2499 1.000000 1.000000 1.010000 0.511746 -0.000000 0.690526 0.511166 + 2500 1.000000 1.000000 1.010000 0.488734 -0.000000 0.723145 0.488058 + 2501 1.000000 1.000000 1.010000 0.466963 -0.000000 0.757180 0.456754 + 2502 1.000000 1.000000 1.010000 0.446727 -0.000000 0.791514 0.417062 + 2503 1.000000 1.000000 1.010000 0.428557 -0.000000 0.825004 0.368384 + 2504 1.000000 1.000000 1.010000 0.412707 -0.000000 0.856409 0.310219 + 2505 1.000000 1.000000 1.010000 0.399957 -0.000000 0.883947 0.242222 + 2506 1.000000 1.000000 1.010000 0.390497 -0.000000 0.905434 0.166438 + 2507 1.000000 1.000000 1.010000 0.384683 -0.000000 0.919137 0.084890 + 2508 1.000000 1.000000 1.010000 0.382797 -0.000000 0.923832 0.000125 + 2509 1.000000 1.000000 1.010000 0.384812 0.000000 0.919104 -0.084662 + 2510 1.000000 1.000000 1.010000 0.390629 0.000000 0.905483 -0.165859 + 2511 1.000000 1.000000 1.010000 0.400114 0.000000 0.883962 -0.241911 + 2512 1.000000 1.000000 1.010000 0.412726 0.000000 0.856731 -0.309303 + 2513 1.000000 1.000000 1.010000 0.428293 0.000000 0.825528 -0.367517 + 2514 1.000000 1.000000 1.010000 0.446499 0.000000 0.791770 -0.416821 + 2515 1.000000 1.000000 1.010000 0.466753 0.000000 0.757547 -0.456359 + 2516 1.000000 1.000000 1.010000 0.488539 0.000000 0.723579 -0.487609 + 2517 1.000000 1.000000 1.010000 0.511606 0.000000 0.690929 -0.510760 + 2518 1.000000 1.000000 1.010000 0.535697 0.000000 0.659976 -0.526745 + 2519 1.000000 1.000000 1.010000 0.560224 0.000000 0.631128 -0.536495 + 2520 1.000000 1.000000 1.010000 0.585226 0.000000 0.604042 -0.540966 + 2521 1.000000 1.000000 1.010000 0.610330 0.000000 0.579463 -0.540110 + 2522 1.000000 1.000000 1.010000 0.635068 0.000000 0.556843 -0.535364 + 2523 1.000000 1.000000 1.010000 0.659638 0.000000 0.536085 -0.526774 + 2524 1.000000 1.000000 1.010000 0.683843 0.000000 0.517031 -0.514818 + 2525 1.000000 1.000000 1.010000 0.707187 0.000000 0.499968 -0.499919 + 2526 1.000000 1.000000 1.010000 0.729851 0.000000 0.484607 -0.482155 + 2527 1.000000 1.000000 1.010000 0.751763 0.000000 0.470223 -0.462323 + 2528 1.000000 1.000000 1.010000 0.772714 0.000000 0.457556 -0.439950 + 2529 1.000000 1.000000 1.010000 0.792398 0.000000 0.446026 -0.416131 + 2530 1.000000 1.000000 1.010000 0.811057 0.000000 0.435828 -0.390180 + 2531 1.000000 1.000000 1.010000 0.828465 0.000000 0.426615 -0.362830 + 2532 1.000000 1.000000 1.010000 0.844514 0.000000 0.418600 -0.334020 + 2533 1.000000 1.000000 1.010000 0.859307 0.000000 0.411244 -0.304089 + 2534 1.000000 1.000000 1.010000 0.872717 0.000000 0.405029 -0.272610 + 2535 1.000000 1.000000 1.010000 0.884429 0.000000 0.399727 -0.240840 + 2536 1.000000 1.000000 1.010000 0.894840 0.000000 0.395135 -0.207677 + 2537 1.000000 1.000000 1.010000 0.903677 0.000000 0.391203 -0.174152 + 2538 1.000000 1.000000 1.010000 0.911034 0.000000 0.387867 -0.139917 + 2539 1.000000 1.000000 1.010000 0.916658 0.000000 0.385526 -0.105391 + 2540 1.000000 1.000000 1.010000 0.920749 0.000000 0.383736 -0.070489 + 2541 1.000000 1.000000 1.010000 0.923135 0.000000 0.382855 -0.035269 + 2542 1.000000 1.000000 1.010000 0.911028 -0.000000 0.412344 0.000200 + 2543 1.000000 1.000000 1.010000 0.910042 -0.000000 0.412936 0.036161 + 2544 1.000000 1.000000 1.010000 0.907362 -0.000000 0.414125 0.072079 + 2545 1.000000 1.000000 1.010000 0.902893 -0.000000 0.416170 0.107641 + 2546 1.000000 1.000000 1.010000 0.896630 -0.000000 0.419042 0.143035 + 2547 1.000000 1.000000 1.010000 0.888654 -0.000000 0.422708 0.177795 + 2548 1.000000 1.000000 1.010000 0.878870 -0.000000 0.427572 0.211588 + 2549 1.000000 1.000000 1.010000 0.867562 -0.000000 0.433161 0.244351 + 2550 1.000000 1.000000 1.010000 0.854518 -0.000000 0.439764 0.276416 + 2551 1.000000 1.000000 1.010000 0.840160 -0.000000 0.447106 0.306965 + 2552 1.000000 1.000000 1.010000 0.824013 -0.000000 0.456014 0.336233 + 2553 1.000000 1.000000 1.010000 0.806649 -0.000000 0.465719 0.363899 + 2554 1.000000 1.000000 1.010000 0.787819 -0.000000 0.476990 0.389643 + 2555 1.000000 1.000000 1.010000 0.767823 -0.000000 0.489431 0.413407 + 2556 1.000000 1.000000 1.010000 0.746686 -0.000000 0.503181 0.435051 + 2557 1.000000 1.000000 1.010000 0.724353 -0.000000 0.518829 0.454013 + 2558 1.000000 1.000000 1.010000 0.701365 -0.000000 0.535860 0.470043 + 2559 1.000000 1.000000 1.010000 0.677728 -0.000000 0.554509 0.482912 + 2560 1.000000 1.000000 1.010000 0.653322 -0.000000 0.575138 0.492328 + 2561 1.000000 1.000000 1.010000 0.628731 -0.000000 0.597720 0.497421 + 2562 1.000000 1.000000 1.010000 0.603765 -0.000000 0.622544 0.497902 + 2563 1.000000 1.000000 1.010000 0.578973 -0.000000 0.649124 0.493385 + 2564 1.000000 1.000000 1.010000 0.554728 -0.000000 0.677621 0.482812 + 2565 1.000000 1.000000 1.010000 0.530954 -0.000000 0.707783 0.465972 + 2566 1.000000 1.000000 1.010000 0.508376 -0.000000 0.739469 0.441292 + 2567 1.000000 1.000000 1.010000 0.487158 -0.000000 0.771563 0.409106 + 2568 1.000000 1.000000 1.010000 0.467658 -0.000000 0.803734 0.367843 + 2569 1.000000 1.000000 1.010000 0.450588 -0.000000 0.834261 0.317771 + 2570 1.000000 1.000000 1.010000 0.436198 -0.000000 0.861842 0.258766 + 2571 1.000000 1.000000 1.010000 0.424781 -0.000000 0.884700 0.192009 + 2572 1.000000 1.000000 1.010000 0.417236 -0.000000 0.901110 0.117960 + 2573 1.000000 1.000000 1.010000 0.413083 -0.000000 0.909811 0.040073 + 2574 1.000000 1.000000 1.010000 0.413146 0.000000 0.909820 -0.039201 + 2575 1.000000 1.000000 1.010000 0.417253 0.000000 0.901161 -0.117511 + 2576 1.000000 1.000000 1.010000 0.424718 0.000000 0.884820 -0.191594 + 2577 1.000000 1.000000 1.010000 0.436068 0.000000 0.862039 -0.258327 + 2578 1.000000 1.000000 1.010000 0.450623 0.000000 0.834422 -0.317300 + 2579 1.000000 1.000000 1.010000 0.467512 0.000000 0.804030 -0.367380 + 2580 1.000000 1.000000 1.010000 0.486990 0.000000 0.771925 -0.408622 + 2581 1.000000 1.000000 1.010000 0.508312 0.000000 0.739686 -0.441003 + 2582 1.000000 1.000000 1.010000 0.530888 0.000000 0.708219 -0.465385 + 2583 1.000000 1.000000 1.010000 0.554761 0.000000 0.677677 -0.482695 + 2584 1.000000 1.000000 1.010000 0.578881 0.000000 0.649249 -0.493328 + 2585 1.000000 1.000000 1.010000 0.603688 0.000000 0.622724 -0.497772 + 2586 1.000000 1.000000 1.010000 0.628606 0.000000 0.598076 -0.497151 + 2587 1.000000 1.000000 1.010000 0.653302 0.000000 0.575362 -0.492093 + 2588 1.000000 1.000000 1.010000 0.677660 0.000000 0.554794 -0.482681 + 2589 1.000000 1.000000 1.010000 0.701422 0.000000 0.536077 -0.469711 + 2590 1.000000 1.000000 1.010000 0.724422 0.000000 0.519052 -0.453649 + 2591 1.000000 1.000000 1.010000 0.746539 0.000000 0.503412 -0.435035 + 2592 1.000000 1.000000 1.010000 0.767828 0.000000 0.489691 -0.413091 + 2593 1.000000 1.000000 1.010000 0.787764 0.000000 0.477157 -0.389550 + 2594 1.000000 1.000000 1.010000 0.806619 0.000000 0.466046 -0.363548 + 2595 1.000000 1.000000 1.010000 0.824143 0.000000 0.456057 -0.335858 + 2596 1.000000 1.000000 1.010000 0.840038 0.000000 0.447448 -0.306801 + 2597 1.000000 1.000000 1.010000 0.854712 0.000000 0.439565 -0.276135 + 2598 1.000000 1.000000 1.010000 0.867523 0.000000 0.433278 -0.244282 + 2599 1.000000 1.000000 1.010000 0.879062 0.000000 0.427419 -0.211101 + 2600 1.000000 1.000000 1.010000 0.888736 0.000000 0.422758 -0.177268 + 2601 1.000000 1.000000 1.010000 0.896582 0.000000 0.419322 -0.142510 + 2602 1.000000 1.000000 1.010000 0.902876 0.000000 0.416223 -0.107583 + 2603 1.000000 1.000000 1.010000 0.907456 0.000000 0.413957 -0.071853 + 2604 1.000000 1.000000 1.010000 0.910012 0.000000 0.413027 -0.035869 + 2605 1.000000 1.000000 1.010000 0.897038 -0.000000 0.441954 0.000042 + 2606 1.000000 1.000000 1.010000 0.895984 -0.000000 0.442588 0.036438 + 2607 1.000000 1.000000 1.010000 0.893184 -0.000000 0.443846 0.072274 + 2608 1.000000 1.000000 1.010000 0.888382 -0.000000 0.446234 0.107942 + 2609 1.000000 1.000000 1.010000 0.881632 -0.000000 0.449770 0.142939 + 2610 1.000000 1.000000 1.010000 0.873177 -0.000000 0.454113 0.177042 + 2611 1.000000 1.000000 1.010000 0.862844 -0.000000 0.459573 0.210458 + 2612 1.000000 1.000000 1.010000 0.850751 -0.000000 0.466181 0.242689 + 2613 1.000000 1.000000 1.010000 0.837114 -0.000000 0.473525 0.273888 + 2614 1.000000 1.000000 1.010000 0.821714 -0.000000 0.482578 0.303159 + 2615 1.000000 1.000000 1.010000 0.804757 -0.000000 0.492725 0.331041 + 2616 1.000000 1.000000 1.010000 0.786403 -0.000000 0.504291 0.356737 + 2617 1.000000 1.000000 1.010000 0.766779 -0.000000 0.517233 0.380158 + 2618 1.000000 1.000000 1.010000 0.746112 -0.000000 0.531485 0.401048 + 2619 1.000000 1.000000 1.010000 0.724182 -0.000000 0.547428 0.419385 + 2620 1.000000 1.000000 1.010000 0.701549 -0.000000 0.565198 0.434029 + 2621 1.000000 1.000000 1.010000 0.677957 -0.000000 0.584925 0.445238 + 2622 1.000000 1.000000 1.010000 0.654232 -0.000000 0.606139 0.452301 + 2623 1.000000 1.000000 1.010000 0.629882 -0.000000 0.629635 0.454762 + 2624 1.000000 1.000000 1.010000 0.605931 -0.000000 0.654454 0.452259 + 2625 1.000000 1.000000 1.010000 0.582093 -0.000000 0.681311 0.443828 + 2626 1.000000 1.000000 1.010000 0.558751 -0.000000 0.709787 0.428953 + 2627 1.000000 1.000000 1.010000 0.536347 -0.000000 0.739276 0.407190 + 2628 1.000000 1.000000 1.010000 0.515488 -0.000000 0.769292 0.377442 + 2629 1.000000 1.000000 1.010000 0.496512 -0.000000 0.799057 0.339093 + 2630 1.000000 1.000000 1.010000 0.479590 -0.000000 0.826980 0.293425 + 2631 1.000000 1.000000 1.010000 0.465285 -0.000000 0.852299 0.238949 + 2632 1.000000 1.000000 1.010000 0.454372 -0.000000 0.873070 0.176901 + 2633 1.000000 1.000000 1.010000 0.446838 -0.000000 0.887943 0.109059 + 2634 1.000000 1.000000 1.010000 0.442822 -0.000000 0.895860 0.036643 + 2635 1.000000 1.000000 1.010000 0.442766 0.000000 0.895909 -0.036127 + 2636 1.000000 1.000000 1.010000 0.446675 0.000000 0.888132 -0.108182 + 2637 1.000000 1.000000 1.010000 0.454188 0.000000 0.873363 -0.175929 + 2638 1.000000 1.000000 1.010000 0.465379 0.000000 0.852591 -0.237720 + 2639 1.000000 1.000000 1.010000 0.479501 0.000000 0.827295 -0.292681 + 2640 1.000000 1.000000 1.010000 0.496331 0.000000 0.799364 -0.338634 + 2641 1.000000 1.000000 1.010000 0.515544 0.000000 0.769543 -0.376853 + 2642 1.000000 1.000000 1.010000 0.536379 0.000000 0.739674 -0.406423 + 2643 1.000000 1.000000 1.010000 0.558543 0.000000 0.710234 -0.428482 + 2644 1.000000 1.000000 1.010000 0.581795 0.000000 0.681906 -0.443305 + 2645 1.000000 1.000000 1.010000 0.605815 0.000000 0.654862 -0.451823 + 2646 1.000000 1.000000 1.010000 0.629908 0.000000 0.629693 -0.454647 + 2647 1.000000 1.000000 1.010000 0.654093 0.000000 0.606643 -0.451827 + 2648 1.000000 1.000000 1.010000 0.677986 0.000000 0.585059 -0.445017 + 2649 1.000000 1.000000 1.010000 0.701393 0.000000 0.565490 -0.433899 + 2650 1.000000 1.000000 1.010000 0.724175 0.000000 0.547822 -0.418880 + 2651 1.000000 1.000000 1.010000 0.746089 0.000000 0.531593 -0.400948 + 2652 1.000000 1.000000 1.010000 0.766807 0.000000 0.517355 -0.379936 + 2653 1.000000 1.000000 1.010000 0.786543 0.000000 0.504313 -0.356398 + 2654 1.000000 1.000000 1.010000 0.804804 0.000000 0.492766 -0.330866 + 2655 1.000000 1.000000 1.010000 0.821647 0.000000 0.482731 -0.303096 + 2656 1.000000 1.000000 1.010000 0.836985 0.000000 0.474011 -0.273442 + 2657 1.000000 1.000000 1.010000 0.850740 0.000000 0.466241 -0.242611 + 2658 1.000000 1.000000 1.010000 0.862890 0.000000 0.459556 -0.210307 + 2659 1.000000 1.000000 1.010000 0.873137 0.000000 0.454234 -0.176925 + 2660 1.000000 1.000000 1.010000 0.881730 0.000000 0.449667 -0.142660 + 2661 1.000000 1.000000 1.010000 0.888379 0.000000 0.446378 -0.107375 + 2662 1.000000 1.000000 1.010000 0.893210 0.000000 0.443854 -0.071902 + 2663 1.000000 1.000000 1.010000 0.896056 0.000000 0.442493 -0.035832 + 2664 1.000000 1.000000 1.010000 0.882100 -0.000000 0.471061 0.000184 + 2665 1.000000 1.000000 1.010000 0.880927 -0.000000 0.471769 0.037433 + 2666 1.000000 1.000000 1.010000 0.877588 -0.000000 0.473615 0.074357 + 2667 1.000000 1.000000 1.010000 0.872185 -0.000000 0.476421 0.110977 + 2668 1.000000 1.000000 1.010000 0.864367 -0.000000 0.480913 0.146945 + 2669 1.000000 1.000000 1.010000 0.854715 -0.000000 0.486234 0.181763 + 2670 1.000000 1.000000 1.010000 0.843015 -0.000000 0.492882 0.215389 + 2671 1.000000 1.000000 1.010000 0.829304 -0.000000 0.501170 0.247152 + 2672 1.000000 1.000000 1.010000 0.813726 -0.000000 0.510661 0.277626 + 2673 1.000000 1.000000 1.010000 0.796438 -0.000000 0.521815 0.305608 + 2674 1.000000 1.000000 1.010000 0.777543 -0.000000 0.534516 0.331239 + 2675 1.000000 1.000000 1.010000 0.757187 -0.000000 0.548920 0.354055 + 2676 1.000000 1.000000 1.010000 0.735581 -0.000000 0.564952 0.373833 + 2677 1.000000 1.000000 1.010000 0.712996 -0.000000 0.582897 0.389703 + 2678 1.000000 1.000000 1.010000 0.689450 -0.000000 0.602921 0.401429 + 2679 1.000000 1.000000 1.010000 0.665534 -0.000000 0.624654 0.408501 + 2680 1.000000 1.000000 1.010000 0.641196 -0.000000 0.648152 0.410813 + 2681 1.000000 1.000000 1.010000 0.617089 -0.000000 0.673696 0.406614 + 2682 1.000000 1.000000 1.010000 0.593146 -0.000000 0.700759 0.396377 + 2683 1.000000 1.000000 1.010000 0.570246 -0.000000 0.728822 0.378996 + 2684 1.000000 1.000000 1.010000 0.548484 -0.000000 0.757893 0.353219 + 2685 1.000000 1.000000 1.010000 0.528436 -0.000000 0.786643 0.319293 + 2686 1.000000 1.000000 1.010000 0.510827 -0.000000 0.813783 0.277151 + 2687 1.000000 1.000000 1.010000 0.495952 -0.000000 0.838420 0.226016 + 2688 1.000000 1.000000 1.010000 0.484209 -0.000000 0.858670 0.168010 + 2689 1.000000 1.000000 1.010000 0.476249 -0.000000 0.873161 0.103810 + 2690 1.000000 1.000000 1.010000 0.472068 -0.000000 0.880847 0.035508 + 2691 1.000000 1.000000 1.010000 0.471924 0.000000 0.880958 -0.034647 + 2692 1.000000 1.000000 1.010000 0.476184 0.000000 0.873303 -0.102912 + 2693 1.000000 1.000000 1.010000 0.484130 0.000000 0.858863 -0.167247 + 2694 1.000000 1.000000 1.010000 0.495960 0.000000 0.838573 -0.225430 + 2695 1.000000 1.000000 1.010000 0.510748 0.000000 0.814064 -0.276472 + 2696 1.000000 1.000000 1.010000 0.528457 0.000000 0.786819 -0.318825 + 2697 1.000000 1.000000 1.010000 0.548374 0.000000 0.758117 -0.352910 + 2698 1.000000 1.000000 1.010000 0.570247 0.000000 0.729117 -0.378428 + 2699 1.000000 1.000000 1.010000 0.592973 0.000000 0.701036 -0.396147 + 2700 1.000000 1.000000 1.010000 0.616905 0.000000 0.673946 -0.406479 + 2701 1.000000 1.000000 1.010000 0.641192 0.000000 0.648355 -0.410498 + 2702 1.000000 1.000000 1.010000 0.665530 0.000000 0.624846 -0.408212 + 2703 1.000000 1.000000 1.010000 0.689455 0.000000 0.603095 -0.401158 + 2704 1.000000 1.000000 1.010000 0.713063 0.000000 0.583081 -0.389305 + 2705 1.000000 1.000000 1.010000 0.735748 0.000000 0.564951 -0.373504 + 2706 1.000000 1.000000 1.010000 0.757165 0.000000 0.549199 -0.353668 + 2707 1.000000 1.000000 1.010000 0.777545 0.000000 0.534582 -0.331127 + 2708 1.000000 1.000000 1.010000 0.796391 0.000000 0.522005 -0.305404 + 2709 1.000000 1.000000 1.010000 0.813815 0.000000 0.510831 -0.277050 + 2710 1.000000 1.000000 1.010000 0.829282 0.000000 0.501320 -0.246918 + 2711 1.000000 1.000000 1.010000 0.842933 0.000000 0.493202 -0.214978 + 2712 1.000000 1.000000 1.010000 0.854689 0.000000 0.486382 -0.181493 + 2713 1.000000 1.000000 1.010000 0.864521 0.000000 0.480705 -0.146720 + 2714 1.000000 1.000000 1.010000 0.872167 0.000000 0.476498 -0.110789 + 2715 1.000000 1.000000 1.010000 0.877673 0.000000 0.473468 -0.074283 + 2716 1.000000 1.000000 1.010000 0.880961 0.000000 0.471727 -0.037171 + 2717 1.000000 1.000000 1.010000 0.866125 -0.000000 0.499828 0.000042 + 2718 1.000000 1.000000 1.010000 0.864927 -0.000000 0.500453 0.038057 + 2719 1.000000 1.000000 1.010000 0.861221 -0.000000 0.502593 0.075485 + 2720 1.000000 1.000000 1.010000 0.854990 -0.000000 0.506412 0.111981 + 2721 1.000000 1.000000 1.010000 0.846638 -0.000000 0.511198 0.147923 + 2722 1.000000 1.000000 1.010000 0.835843 -0.000000 0.517890 0.182091 + 2723 1.000000 1.000000 1.010000 0.822694 -0.000000 0.526221 0.215096 + 2724 1.000000 1.000000 1.010000 0.807615 -0.000000 0.535995 0.245903 + 2725 1.000000 1.000000 1.010000 0.790691 -0.000000 0.547524 0.273909 + 2726 1.000000 1.000000 1.010000 0.772003 -0.000000 0.560736 0.299309 + 2727 1.000000 1.000000 1.010000 0.751584 -0.000000 0.576017 0.321445 + 2728 1.000000 1.000000 1.010000 0.729910 -0.000000 0.593006 0.339964 + 2729 1.000000 1.000000 1.010000 0.707225 -0.000000 0.612145 0.353709 + 2730 1.000000 1.000000 1.010000 0.683665 -0.000000 0.633142 0.362951 + 2731 1.000000 1.000000 1.010000 0.659796 -0.000000 0.656115 0.366310 + 2732 1.000000 1.000000 1.010000 0.636087 -0.000000 0.680656 0.363458 + 2733 1.000000 1.000000 1.010000 0.612478 -0.000000 0.706854 0.353876 + 2734 1.000000 1.000000 1.010000 0.589762 -0.000000 0.734035 0.336710 + 2735 1.000000 1.000000 1.010000 0.568684 -0.000000 0.761379 0.311289 + 2736 1.000000 1.000000 1.010000 0.549211 -0.000000 0.788169 0.277772 + 2737 1.000000 1.000000 1.010000 0.532482 -0.000000 0.813193 0.234905 + 2738 1.000000 1.000000 1.010000 0.518781 -0.000000 0.834699 0.184780 + 2739 1.000000 1.000000 1.010000 0.508489 -0.000000 0.851531 0.127805 + 2740 1.000000 1.000000 1.010000 0.502184 -0.000000 0.862284 0.065396 + 2741 1.000000 1.000000 1.010000 0.500100 -0.000000 0.865967 0.000206 + 2742 1.000000 1.000000 1.010000 0.502223 0.000000 0.862335 -0.064430 + 2743 1.000000 1.000000 1.010000 0.508512 0.000000 0.851595 -0.127284 + 2744 1.000000 1.000000 1.010000 0.518568 0.000000 0.834916 -0.184398 + 2745 1.000000 1.000000 1.010000 0.532470 0.000000 0.813385 -0.234268 + 2746 1.000000 1.000000 1.010000 0.549304 0.000000 0.788468 -0.276735 + 2747 1.000000 1.000000 1.010000 0.568709 0.000000 0.761649 -0.310580 + 2748 1.000000 1.000000 1.010000 0.589806 0.000000 0.734241 -0.336182 + 2749 1.000000 1.000000 1.010000 0.612425 0.000000 0.707093 -0.353489 + 2750 1.000000 1.000000 1.010000 0.635997 0.000000 0.681090 -0.362799 + 2751 1.000000 1.000000 1.010000 0.659872 0.000000 0.656409 -0.365645 + 2752 1.000000 1.000000 1.010000 0.683850 0.000000 0.633241 -0.362430 + 2753 1.000000 1.000000 1.010000 0.707327 0.000000 0.612345 -0.353159 + 2754 1.000000 1.000000 1.010000 0.730013 0.000000 0.593125 -0.339535 + 2755 1.000000 1.000000 1.010000 0.751642 0.000000 0.576058 -0.321234 + 2756 1.000000 1.000000 1.010000 0.771970 0.000000 0.560995 -0.298910 + 2757 1.000000 1.000000 1.010000 0.790760 0.000000 0.547498 -0.273758 + 2758 1.000000 1.000000 1.010000 0.807638 0.000000 0.536239 -0.245294 + 2759 1.000000 1.000000 1.010000 0.822732 0.000000 0.526257 -0.214864 + 2760 1.000000 1.000000 1.010000 0.835725 0.000000 0.518085 -0.182076 + 2761 1.000000 1.000000 1.010000 0.846633 0.000000 0.511290 -0.147628 + 2762 1.000000 1.000000 1.010000 0.855055 0.000000 0.506363 -0.111706 + 2763 1.000000 1.000000 1.010000 0.861212 0.000000 0.502703 -0.074852 + 2764 1.000000 1.000000 1.010000 0.864901 0.000000 0.500547 -0.037394 + 2765 1.000000 1.000000 1.010000 0.849297 -0.000000 0.527915 0.000209 + 2766 1.000000 1.000000 1.010000 0.847918 -0.000000 0.528742 0.038304 + 2767 1.000000 1.000000 1.010000 0.843687 -0.000000 0.531464 0.075744 + 2768 1.000000 1.000000 1.010000 0.836805 -0.000000 0.535827 0.112460 + 2769 1.000000 1.000000 1.010000 0.827352 -0.000000 0.541962 0.147531 + 2770 1.000000 1.000000 1.010000 0.815414 -0.000000 0.549773 0.181243 + 2771 1.000000 1.000000 1.010000 0.800971 -0.000000 0.559758 0.212405 + 2772 1.000000 1.000000 1.010000 0.784450 -0.000000 0.571540 0.240791 + 2773 1.000000 1.000000 1.010000 0.766026 -0.000000 0.585131 0.266133 + 2774 1.000000 1.000000 1.010000 0.745697 -0.000000 0.601272 0.287069 + 2775 1.000000 1.000000 1.010000 0.724037 -0.000000 0.619219 0.303872 + 2776 1.000000 1.000000 1.010000 0.701505 -0.000000 0.639123 0.315298 + 2777 1.000000 1.000000 1.010000 0.678317 -0.000000 0.660967 0.320948 + 2778 1.000000 1.000000 1.010000 0.654750 -0.000000 0.684651 0.320243 + 2779 1.000000 1.000000 1.010000 0.631551 -0.000000 0.709961 0.311606 + 2780 1.000000 1.000000 1.010000 0.609416 -0.000000 0.735680 0.295613 + 2781 1.000000 1.000000 1.010000 0.588620 -0.000000 0.761759 0.270647 + 2782 1.000000 1.000000 1.010000 0.570216 -0.000000 0.786497 0.237226 + 2783 1.000000 1.000000 1.010000 0.554332 -0.000000 0.808971 0.195656 + 2784 1.000000 1.000000 1.010000 0.541808 -0.000000 0.827730 0.145967 + 2785 1.000000 1.000000 1.010000 0.533173 -0.000000 0.841176 0.090279 + 2786 1.000000 1.000000 1.010000 0.528766 -0.000000 0.848203 0.030950 + 2787 1.000000 1.000000 1.010000 0.528720 0.000000 0.848247 -0.030529 + 2788 1.000000 1.000000 1.010000 0.533226 0.000000 0.841214 -0.089604 + 2789 1.000000 1.000000 1.010000 0.541769 0.000000 0.827822 -0.145595 + 2790 1.000000 1.000000 1.010000 0.554426 0.000000 0.809054 -0.195045 + 2791 1.000000 1.000000 1.010000 0.570139 0.000000 0.786702 -0.236732 + 2792 1.000000 1.000000 1.010000 0.588592 0.000000 0.761958 -0.270148 + 2793 1.000000 1.000000 1.010000 0.609359 0.000000 0.735968 -0.295014 + 2794 1.000000 1.000000 1.010000 0.631723 0.000000 0.710027 -0.311108 + 2795 1.000000 1.000000 1.010000 0.654730 0.000000 0.685019 -0.319496 + 2796 1.000000 1.000000 1.010000 0.678252 0.000000 0.661260 -0.320482 + 2797 1.000000 1.000000 1.010000 0.701525 0.000000 0.639294 -0.314907 + 2798 1.000000 1.000000 1.010000 0.724139 0.000000 0.619252 -0.303560 + 2799 1.000000 1.000000 1.010000 0.745779 0.000000 0.601405 -0.286575 + 2800 1.000000 1.000000 1.010000 0.765943 0.000000 0.585455 -0.265657 + 2801 1.000000 1.000000 1.010000 0.784489 0.000000 0.571648 -0.240406 + 2802 1.000000 1.000000 1.010000 0.801031 0.000000 0.559893 -0.211825 + 2803 1.000000 1.000000 1.010000 0.815514 0.000000 0.549740 -0.180896 + 2804 1.000000 1.000000 1.010000 0.827426 0.000000 0.541929 -0.147240 + 2805 1.000000 1.000000 1.010000 0.836887 0.000000 0.535804 -0.111956 + 2806 1.000000 1.000000 1.010000 0.843719 0.000000 0.531470 -0.075354 + 2807 1.000000 1.000000 1.010000 0.847982 0.000000 0.528676 -0.037785 + 2808 1.000000 1.000000 1.010000 0.831667 -0.000000 0.555275 0.000381 + 2809 1.000000 1.000000 1.010000 0.830037 -0.000000 0.556318 0.039351 + 2810 1.000000 1.000000 1.010000 0.824931 -0.000000 0.559885 0.077579 + 2811 1.000000 1.000000 1.010000 0.816872 -0.000000 0.565364 0.114382 + 2812 1.000000 1.000000 1.010000 0.805652 -0.000000 0.573285 0.149228 + 2813 1.000000 1.000000 1.010000 0.791550 -0.000000 0.583464 0.181709 + 2814 1.000000 1.000000 1.010000 0.774919 -0.000000 0.595972 0.210518 + 2815 1.000000 1.000000 1.010000 0.755986 -0.000000 0.610939 0.235029 + 2816 1.000000 1.000000 1.010000 0.735210 -0.000000 0.628108 0.254845 + 2817 1.000000 1.000000 1.010000 0.713002 -0.000000 0.647707 0.268521 + 2818 1.000000 1.000000 1.010000 0.689780 -0.000000 0.669572 0.275458 + 2819 1.000000 1.000000 1.010000 0.666330 -0.000000 0.693196 0.274742 + 2820 1.000000 1.000000 1.010000 0.643488 -0.000000 0.717854 0.265722 + 2821 1.000000 1.000000 1.010000 0.621520 -0.000000 0.743168 0.247818 + 2822 1.000000 1.000000 1.010000 0.601729 -0.000000 0.767740 0.220222 + 2823 1.000000 1.000000 1.010000 0.584402 -0.000000 0.790433 0.183548 + 2824 1.000000 1.000000 1.010000 0.570620 -0.000000 0.809421 0.138673 + 2825 1.000000 1.000000 1.010000 0.561320 -0.000000 0.823117 0.086014 + 2826 1.000000 1.000000 1.010000 0.556367 -0.000000 0.830421 0.029275 + 2827 1.000000 1.000000 1.010000 0.556398 0.000000 0.830414 -0.028875 + 2828 1.000000 1.000000 1.010000 0.561253 0.000000 0.823206 -0.085599 + 2829 1.000000 1.000000 1.010000 0.570647 0.000000 0.809511 -0.138033 + 2830 1.000000 1.000000 1.010000 0.584433 0.000000 0.790519 -0.183077 + 2831 1.000000 1.000000 1.010000 0.601777 0.000000 0.767871 -0.219633 + 2832 1.000000 1.000000 1.010000 0.621576 0.000000 0.743342 -0.247154 + 2833 1.000000 1.000000 1.010000 0.643515 0.000000 0.717920 -0.265479 + 2834 1.000000 1.000000 1.010000 0.666318 0.000000 0.693309 -0.274486 + 2835 1.000000 1.000000 1.010000 0.689934 0.000000 0.669527 -0.275180 + 2836 1.000000 1.000000 1.010000 0.713044 0.000000 0.647874 -0.268007 + 2837 1.000000 1.000000 1.010000 0.735196 0.000000 0.628325 -0.254353 + 2838 1.000000 1.000000 1.010000 0.755978 0.000000 0.611045 -0.234780 + 2839 1.000000 1.000000 1.010000 0.774906 0.000000 0.596188 -0.209955 + 2840 1.000000 1.000000 1.010000 0.791650 0.000000 0.583441 -0.181348 + 2841 1.000000 1.000000 1.010000 0.805543 0.000000 0.573475 -0.149089 + 2842 1.000000 1.000000 1.010000 0.816804 0.000000 0.565538 -0.114004 + 2843 1.000000 1.000000 1.010000 0.825081 0.000000 0.559709 -0.077247 + 2844 1.000000 1.000000 1.010000 0.829950 0.000000 0.556480 -0.038890 + 2845 1.000000 1.000000 1.010000 0.812960 -0.000000 0.582320 0.000297 + 2846 1.000000 1.000000 1.010000 0.810966 -0.000000 0.583714 0.040148 + 2847 1.000000 1.000000 1.010000 0.804879 -0.000000 0.588177 0.078846 + 2848 1.000000 1.000000 1.010000 0.795154 -0.000000 0.595237 0.115856 + 2849 1.000000 1.000000 1.010000 0.781709 -0.000000 0.605529 0.149214 + 2850 1.000000 1.000000 1.010000 0.764998 -0.000000 0.618771 0.178607 + 2851 1.000000 1.000000 1.010000 0.745764 -0.000000 0.634725 0.202384 + 2852 1.000000 1.000000 1.010000 0.724223 -0.000000 0.653688 0.219531 + 2853 1.000000 1.000000 1.010000 0.701428 -0.000000 0.674992 0.228875 + 2854 1.000000 1.000000 1.010000 0.678068 -0.000000 0.698169 0.229746 + 2855 1.000000 1.000000 1.010000 0.655183 -0.000000 0.722632 0.220312 + 2856 1.000000 1.000000 1.010000 0.633922 -0.000000 0.746874 0.200803 + 2857 1.000000 1.000000 1.010000 0.615019 -0.000000 0.769839 0.170588 + 2858 1.000000 1.000000 1.010000 0.599690 -0.000000 0.789530 0.130440 + 2859 1.000000 1.000000 1.010000 0.588938 -0.000000 0.804032 0.081757 + 2860 1.000000 1.000000 1.010000 0.583244 -0.000000 0.811804 0.028302 + 2861 1.000000 1.000000 1.010000 0.583326 0.000000 0.811763 -0.027781 + 2862 1.000000 1.000000 1.010000 0.588810 0.000000 0.804163 -0.081390 + 2863 1.000000 1.000000 1.010000 0.599648 0.000000 0.789664 -0.129820 + 2864 1.000000 1.000000 1.010000 0.614884 0.000000 0.770106 -0.169863 + 2865 1.000000 1.000000 1.010000 0.633742 0.000000 0.747098 -0.200536 + 2866 1.000000 1.000000 1.010000 0.655299 0.000000 0.722666 -0.219857 + 2867 1.000000 1.000000 1.010000 0.678152 0.000000 0.698202 -0.229399 + 2868 1.000000 1.000000 1.010000 0.701377 0.000000 0.675080 -0.228774 + 2869 1.000000 1.000000 1.010000 0.724206 0.000000 0.653807 -0.219231 + 2870 1.000000 1.000000 1.010000 0.745683 0.000000 0.634968 -0.201921 + 2871 1.000000 1.000000 1.010000 0.764990 0.000000 0.618902 -0.178186 + 2872 1.000000 1.000000 1.010000 0.781535 0.000000 0.605825 -0.148926 + 2873 1.000000 1.000000 1.010000 0.794967 0.000000 0.595584 -0.115351 + 2874 1.000000 1.000000 1.010000 0.804848 0.000000 0.588262 -0.078533 + 2875 1.000000 1.000000 1.010000 0.810948 0.000000 0.583775 -0.039639 + 2876 1.000000 1.000000 1.010000 0.793487 -0.000000 0.608587 0.000417 + 2877 1.000000 1.000000 1.010000 0.790857 -0.000000 0.610618 0.041111 + 2878 1.000000 1.000000 1.010000 0.783368 -0.000000 0.616419 0.079762 + 2879 1.000000 1.000000 1.010000 0.770939 -0.000000 0.626442 0.114997 + 2880 1.000000 1.000000 1.010000 0.754578 -0.000000 0.639939 0.145223 + 2881 1.000000 1.000000 1.010000 0.735054 -0.000000 0.656979 0.167555 + 2882 1.000000 1.000000 1.010000 0.713057 -0.000000 0.677242 0.181366 + 2883 1.000000 1.000000 1.010000 0.689757 -0.000000 0.700084 0.184709 + 2884 1.000000 1.000000 1.010000 0.667126 -0.000000 0.723956 0.175587 + 2885 1.000000 1.000000 1.010000 0.646364 -0.000000 0.747240 0.154423 + 2886 1.000000 1.000000 1.010000 0.628771 -0.000000 0.768081 0.121240 + 2887 1.000000 1.000000 1.010000 0.616370 -0.000000 0.783621 0.077630 + 2888 1.000000 1.000000 1.010000 0.609769 -0.000000 0.792116 0.027104 + 2889 1.000000 1.000000 1.010000 0.609740 0.000000 0.792158 -0.026489 + 2890 1.000000 1.000000 1.010000 0.616138 0.000000 0.783883 -0.076829 + 2891 1.000000 1.000000 1.010000 0.628794 0.000000 0.768131 -0.120797 + 2892 1.000000 1.000000 1.010000 0.646366 0.000000 0.747345 -0.153904 + 2893 1.000000 1.000000 1.010000 0.667171 0.000000 0.723990 -0.175277 + 2894 1.000000 1.000000 1.010000 0.689837 0.000000 0.700158 -0.184128 + 2895 1.000000 1.000000 1.010000 0.712978 0.000000 0.677428 -0.180977 + 2896 1.000000 1.000000 1.010000 0.734907 0.000000 0.657228 -0.167220 + 2897 1.000000 1.000000 1.010000 0.754702 0.000000 0.639965 -0.144463 + 2898 1.000000 1.000000 1.010000 0.771155 0.000000 0.626265 -0.114511 + 2899 1.000000 1.000000 1.010000 0.783381 0.000000 0.616433 -0.079526 + 2900 1.000000 1.000000 1.010000 0.790847 0.000000 0.610663 -0.040644 + 2901 1.000000 1.000000 1.010000 0.773191 -0.000000 0.634173 0.000385 + 2902 1.000000 1.000000 1.010000 0.769667 -0.000000 0.637099 0.041438 + 2903 1.000000 1.000000 1.010000 0.759822 -0.000000 0.645327 0.078894 + 2904 1.000000 1.000000 1.010000 0.743898 -0.000000 0.659177 0.110010 + 2905 1.000000 1.000000 1.010000 0.723899 -0.000000 0.677346 0.131043 + 2906 1.000000 1.000000 1.010000 0.701578 -0.000000 0.698943 0.138807 + 2907 1.000000 1.000000 1.010000 0.678853 -0.000000 0.722359 0.131741 + 2908 1.000000 1.000000 1.010000 0.658843 -0.000000 0.744326 0.109108 + 2909 1.000000 1.000000 1.010000 0.643791 -0.000000 0.761785 0.072228 + 2910 1.000000 1.000000 1.010000 0.635580 -0.000000 0.771615 0.025479 + 2911 1.000000 1.000000 1.010000 0.635443 0.000000 0.771744 -0.024966 + 2912 1.000000 1.000000 1.010000 0.643689 0.000000 0.761892 -0.072005 + 2913 1.000000 1.000000 1.010000 0.658793 0.000000 0.744431 -0.108693 + 2914 1.000000 1.000000 1.010000 0.678948 0.000000 0.722369 -0.131193 + 2915 1.000000 1.000000 1.010000 0.701524 0.000000 0.699039 -0.138595 + 2916 1.000000 1.000000 1.010000 0.723886 0.000000 0.677488 -0.130381 + 2917 1.000000 1.000000 1.010000 0.744094 0.000000 0.659040 -0.109501 + 2918 1.000000 1.000000 1.010000 0.759753 0.000000 0.645433 -0.078686 + 2919 1.000000 1.000000 1.010000 0.769639 0.000000 0.637177 -0.040762 + 2920 1.000000 1.000000 1.010000 0.751985 -0.000000 0.659180 0.000043 + 2921 1.000000 1.000000 1.010000 0.747056 -0.000000 0.663504 0.040862 + 2922 1.000000 1.000000 1.010000 0.733033 -0.000000 0.676223 0.073383 + 2923 1.000000 1.000000 1.010000 0.712808 -0.000000 0.695442 0.090910 + 2924 1.000000 1.000000 1.010000 0.690660 -0.000000 0.717727 0.088640 + 2925 1.000000 1.000000 1.010000 0.671720 -0.000000 0.737958 0.064884 + 2926 1.000000 1.000000 1.010000 0.660897 -0.000000 0.750095 0.023927 + 2927 1.000000 1.000000 1.010000 0.660839 0.000000 0.750169 -0.023214 + 2928 1.000000 1.000000 1.010000 0.671739 0.000000 0.737987 -0.064354 + 2929 1.000000 1.000000 1.010000 0.690767 0.000000 0.717697 -0.088049 + 2930 1.000000 1.000000 1.010000 0.712855 0.000000 0.695407 -0.090812 + 2931 1.000000 1.000000 1.010000 0.733036 0.000000 0.676245 -0.073147 + 2932 1.000000 1.000000 1.010000 0.747072 0.000000 0.663502 -0.040604 + 2933 1.000000 1.000000 1.010000 0.729918 -0.000000 0.683535 0.000321 + 2934 1.000000 1.000000 1.010000 0.718702 -0.000000 0.694175 0.039867 + 2935 1.000000 1.000000 1.010000 0.695596 -0.000000 0.717258 0.041086 + 2936 1.000000 1.000000 1.010000 0.683802 -0.000000 0.729668 0.000369 + 2937 1.000000 1.000000 1.010000 0.695606 0.000000 0.717284 -0.040462 + 2938 1.000000 1.000000 1.010000 0.718673 0.000000 0.694236 -0.039301 + + diff --git a/examples/COUPLE/fortran/libfwrapper.c b/examples/COUPLE/fortran/libfwrapper.c index e25cdc94c8..6c44906a59 100644 --- a/examples/COUPLE/fortran/libfwrapper.c +++ b/examples/COUPLE/fortran/libfwrapper.c @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/fortran2/LAMMPS-wrapper.cpp b/examples/COUPLE/fortran2/LAMMPS-wrapper.cpp index eb6f421606..4774cb6b49 100644 --- a/examples/COUPLE/fortran2/LAMMPS-wrapper.cpp +++ b/examples/COUPLE/fortran2/LAMMPS-wrapper.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/ - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/fortran2/LAMMPS-wrapper.h b/examples/COUPLE/fortran2/LAMMPS-wrapper.h index 479af91738..02e1a651a9 100644 --- a/examples/COUPLE/fortran2/LAMMPS-wrapper.h +++ b/examples/COUPLE/fortran2/LAMMPS-wrapper.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/fortran_dftb/LAMMPS-wrapper.cpp b/examples/COUPLE/fortran_dftb/LAMMPS-wrapper.cpp index eb6f421606..4774cb6b49 100644 --- a/examples/COUPLE/fortran_dftb/LAMMPS-wrapper.cpp +++ b/examples/COUPLE/fortran_dftb/LAMMPS-wrapper.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/ - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/fortran_dftb/LAMMPS-wrapper.h b/examples/COUPLE/fortran_dftb/LAMMPS-wrapper.h index 553466d138..e1eec9fc72 100644 --- a/examples/COUPLE/fortran_dftb/LAMMPS-wrapper.h +++ b/examples/COUPLE/fortran_dftb/LAMMPS-wrapper.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/fortran_dftb/LAMMPS-wrapper2.cpp b/examples/COUPLE/fortran_dftb/LAMMPS-wrapper2.cpp index 44d7b5bca4..83d594df60 100644 --- a/examples/COUPLE/fortran_dftb/LAMMPS-wrapper2.cpp +++ b/examples/COUPLE/fortran_dftb/LAMMPS-wrapper2.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/ - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/fortran_dftb/LAMMPS-wrapper2.h b/examples/COUPLE/fortran_dftb/LAMMPS-wrapper2.h index d3705179ed..45c41b569a 100644 --- a/examples/COUPLE/fortran_dftb/LAMMPS-wrapper2.h +++ b/examples/COUPLE/fortran_dftb/LAMMPS-wrapper2.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/multiple/multiple.cpp b/examples/COUPLE/multiple/multiple.cpp index 1b6bb66485..43dc90323b 100644 --- a/examples/COUPLE/multiple/multiple.cpp +++ b/examples/COUPLE/multiple/multiple.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/ - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/plugin/.gitignore b/examples/COUPLE/plugin/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/examples/COUPLE/plugin/.gitignore @@ -0,0 +1 @@ +/build diff --git a/examples/COUPLE/plugin/CMakeLists.txt b/examples/COUPLE/plugin/CMakeLists.txt new file mode 100644 index 0000000000..f4064d3f65 --- /dev/null +++ b/examples/COUPLE/plugin/CMakeLists.txt @@ -0,0 +1,47 @@ +########################################## +# CMake build system for coupling to the LAMMPS library +# where the library is loaded dynamically at runtime. +########################################## + +cmake_minimum_required(VERSION 3.10) + +# enforce out-of-source build +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) + message(FATAL_ERROR "In-source builds are not allowed. You must create and use a build directory. " + "Please remove CMakeCache.txt and CMakeFiles first.") +endif() + +project(liblammpsplugin VERSION 1.0 LANGUAGES C) + +# by default, install into $HOME/.local (not /usr/local), +# so that no root access (and sudo) is needed +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Default install path" FORCE) +endif() + +# 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) + if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") + if(LAMMPS_EXCEPTIONS) + add_compile_options(/EHsc) + endif() + endif() + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) +endif() + +find_package(MPI REQUIRED) +# do not include the (obsolete) MPI C++ bindings which makes +# for leaner object files and avoids namespace conflicts +set(MPI_CXX_SKIP_MPICXX TRUE) + +########################## + +add_executable(simple-plugin simple.c liblammpsplugin.c) +target_link_libraries(simple-plugin PRIVATE MPI::MPI_C) +target_compile_definitions(simple-plugin PRIVATE LAMMPS_LIB_MPI) + +# link with -ldl or equivalent for plugin loading; except on Windows +if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + target_link_libraries(simple-plugin PRIVATE ${CMAKE_DL_LIBS}) +endif() diff --git a/examples/COUPLE/plugin/README b/examples/COUPLE/plugin/README index bced08b6d7..beed549d3f 100644 --- a/examples/COUPLE/plugin/README +++ b/examples/COUPLE/plugin/README @@ -11,32 +11,39 @@ liblammpsplugin.c is the LAMMPS library plugin loader You can then build the driver executable codes with a compile line like below. -mpicc -c -O -Wall -g -I$HOME/lammps/src liblammpsplugin.c -mpicc -c -O -Wall -g simple.c -mpicc simple.o liblammpsplugin.o -ldl -o simpleC +mpicc -c -O -DLAMMPS_LIB_MPI -Wall -g liblammpsplugin.c +mpicc -c -O -DLAMMPS_LIB_MPI -Wall -g simple.c +mpicc simple.o liblammpsplugin.o -ldl -o simple-plugin + +or using the provided CMake file with: + +mkdir build +cd build +cmake ../ +cmake --build . You also need to build LAMMPS as a shared library -(see examples/COUPLE/README), e.g. +(see examples/COUPLE/README), e.g. cd $HOME/lammps/src make mode=shlib mpi -or +or cd $HOME/lammps mkdir build-shared cd build-shared -cmake -D BUILD_LIB=on -D BUILD_SHARED_LIBS=on ../cmake +cmake -D BUILD_MPI=on -D BUILD_SHARED_LIBS=on ../cmake make -You then run simpleC on a parallel machine +You then run simple-plugin on a parallel machine on some number of processors Q with 3 arguments: -% mpirun -np Q simpleC P in.lj $HOME/lammps/src/liblammps.so +% mpirun -np Q simple-plugin P in.lj $HOME/lammps/src/liblammps.so or -% mpirun -np Q simpleC P in.lj $HOME/lammps/build-shared/liblammps.so +% mpirun -np Q simple-plugin P in.lj $HOME/lammps/build-shared/liblammps.so P is the number of procs you want LAMMPS to run on (must be <= Q) and in.lj is a LAMMPS input script and the last argument is the path to diff --git a/examples/COUPLE/plugin/liblammpsplugin.c b/examples/COUPLE/plugin/liblammpsplugin.c index ea2e2ab536..996a27524f 100644 --- a/examples/COUPLE/plugin/liblammpsplugin.c +++ b/examples/COUPLE/plugin/liblammpsplugin.c @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains @@ -18,10 +18,29 @@ a LAMMPS plugin to some other software. */ -#include "library.h" #include "liblammpsplugin.h" -#include + +#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 +#else #include +#endif + +#include + liblammpsplugin_t *liblammpsplugin_load(const char *lib) { @@ -29,14 +48,29 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) void *handle; if (lib == NULL) return NULL; + +#ifdef _WIN32 + handle = (void *) LoadLibrary(lib); +#else handle = dlopen(lib,RTLD_NOW|RTLD_GLOBAL); +#endif if (handle == NULL) return NULL; lmp = (liblammpsplugin_t *) malloc(sizeof(liblammpsplugin_t)); lmp->handle = handle; -#define ADDSYM(symbol) lmp->symbol = dlsym(handle,"lammps_" #symbol) +#ifdef _WIN32 +#define ADDSYM(symbol) *(void **) (&lmp->symbol) = (void *) GetProcAddress((HINSTANCE) handle, "lammps_" #symbol) +#else +#define ADDSYM(symbol) *(void **) (&lmp->symbol) = dlsym(handle,"lammps_" #symbol) +#endif + +#if defined(LAMMPS_LIB_MPI) ADDSYM(open); +#else + lmp->open = NULL; +#endif + ADDSYM(open_no_mpi); ADDSYM(open_fortran); ADDSYM(close); @@ -46,6 +80,8 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) ADDSYM(kokkos_finalize); ADDSYM(python_finalize); + ADDSYM(error); + ADDSYM(file); ADDSYM(command); ADDSYM(commands_list); @@ -70,6 +106,7 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) ADDSYM(extract_compute); ADDSYM(extract_fix); ADDSYM(extract_variable); + ADDSYM(extract_variable_datatype); ADDSYM(set_variable); ADDSYM(gather_atoms); @@ -77,8 +114,15 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) ADDSYM(gather_atoms_subset); ADDSYM(scatter_atoms); ADDSYM(scatter_atoms_subset); + ADDSYM(gather_bonds); + ADDSYM(gather); + ADDSYM(gather_concat); + ADDSYM(gather_subset); + ADDSYM(scatter); + ADDSYM(scatter_subset); + ADDSYM(create_atoms); ADDSYM(find_pair_neighlist); @@ -116,6 +160,9 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) ADDSYM(plugin_count); ADDSYM(plugin_name); + ADDSYM(encode_image_flags); + ADDSYM(decode_image_flags); + ADDSYM(set_fix_external_callback); ADDSYM(fix_external_get_force); ADDSYM(fix_external_set_energy_global); @@ -125,6 +172,8 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) ADDSYM(fix_external_set_vector_length); ADDSYM(fix_external_set_vector); + ADDSYM(flush_buffers); + ADDSYM(free); ADDSYM(is_running); @@ -139,6 +188,8 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) lmp->has_error = NULL; lmp->get_last_error_message = NULL; #endif + + ADDSYM(python_api_version); return lmp; } @@ -147,7 +198,11 @@ int liblammpsplugin_release(liblammpsplugin_t *lmp) if (lmp == NULL) return 1; if (lmp->handle == NULL) return 2; +#ifdef _WIN32 + FreeLibrary((HINSTANCE) handle); +#else dlclose(lmp->handle); +#endif free((void *)lmp); return 0; } diff --git a/examples/COUPLE/plugin/liblammpsplugin.h b/examples/COUPLE/plugin/liblammpsplugin.h index 219ddb2574..eb63ca6807 100644 --- a/examples/COUPLE/plugin/liblammpsplugin.h +++ b/examples/COUPLE/plugin/liblammpsplugin.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains @@ -28,11 +28,71 @@ #define LAMMPS_SMALLBIG #endif +#if defined(LAMMPS_LIB_MPI) #include -#if defined(LAMMPS_BIGBIG) || defined(LAMMPS_SMALLBIG) -#include /* for int64_t */ #endif +#if defined(LAMMPS_BIGBIG) || defined(LAMMPS_SMALLBIG) +#include /* for int64_t */ +#endif + +/* The following enums must be kept in sync with the equivalent enums + * or constants in python/lammps/constants.py, fortran/lammps.f90, + * tools/swig/lammps.i, and examples/COUPLE/plugin/liblammpsplugin.h */ + +/* Data type constants for extracting data from atoms, computes and fixes */ + +enum _LMP_DATATYPE_CONST { + LAMMPS_INT = 0, /*!< 32-bit integer (array) */ + LAMMPS_INT_2D = 1, /*!< two-dimensional 32-bit integer array */ + LAMMPS_DOUBLE = 2, /*!< 64-bit double (array) */ + LAMMPS_DOUBLE_2D = 3, /*!< two-dimensional 64-bit double array */ + LAMMPS_INT64 = 4, /*!< 64-bit integer (array) */ + LAMMPS_INT64_2D = 5, /*!< two-dimensional 64-bit integer array */ + LAMMPS_STRING = 6 /*!< C-String */ +}; + +/* Style constants for extracting data from computes and fixes. */ + +enum _LMP_STYLE_CONST { + LMP_STYLE_GLOBAL = 0, /*!< return global data */ + LMP_STYLE_ATOM = 1, /*!< return per-atom data */ + LMP_STYLE_LOCAL = 2 /*!< return local data */ +}; + +/* Type and size constants for extracting data from computes and fixes. */ + +enum _LMP_TYPE_CONST { + LMP_TYPE_SCALAR = 0, /*!< return scalar */ + LMP_TYPE_VECTOR = 1, /*!< return vector */ + LMP_TYPE_ARRAY = 2, /*!< return array */ + LMP_SIZE_VECTOR = 3, /*!< return length of vector */ + LMP_SIZE_ROWS = 4, /*!< return number of rows */ + LMP_SIZE_COLS = 5 /*!< return number of columns */ +}; + +/* Error codes to select the suitable function in the Error class */ + +enum _LMP_ERROR_CONST { + LMP_ERROR_WARNING = 0, /*!< call Error::warning() */ + LMP_ERROR_ONE = 1, /*!< called from one MPI rank */ + LMP_ERROR_ALL = 2, /*!< called from all MPI ranks */ + LMP_ERROR_WORLD = 4, /*!< error on Comm::world */ + LMP_ERROR_UNIVERSE = 8 /*!< error on Comm::universe */ +}; + +/** Variable style constants for extracting data from variables. + * + * Must be kept in sync with the equivalent constants in python/lammps/constants.py, + * fortran/lammps.f90, and tools/swig/lammps.i */ + +enum _LMP_VAR_CONST { + LMP_VAR_EQUAL = 0, /*!< compatible with equal-style variables */ + LMP_VAR_ATOM = 1, /*!< compatible with atom-style variables */ + LMP_VAR_VECTOR = 2, /*!< compatible with vector-style variables */ + LMP_VAR_STRING = 3 /*!< return value will be a string (catch-all) */ +}; + #ifdef __cplusplus extern "C" { #endif @@ -49,7 +109,11 @@ struct _liblammpsplugin { int abiversion; int has_exceptions; void *handle; +#if defined(LAMMPS_LIB_MPI) void *(*open)(int, char **, MPI_Comm, void **); +#else + void *open; +#endif void *(*open_no_mpi)(int, char **, void **); void *(*open_fortran)(int, char **, void **, int); void (*close)(void *); @@ -59,13 +123,15 @@ struct _liblammpsplugin { void (*kokkos_finalize)(); void (*python_finalize)(); + void (*error)(void *, int, const char *); + void (*file)(void *, char *); char *(*command)(void *, const char *); void (*commands_list)(void *, int, const char **); void (*commands_string)(void *, const char *); double (*get_natoms)(void *); - double (*get_thermo)(void *, char *); + double (*get_thermo)(void *, const char *); void (*extract_box)(void *, double *, double *, double *, double *, double *, int *, int *); @@ -78,12 +144,13 @@ struct _liblammpsplugin { int *(*extract_global_datatype)(void *, const char *); void *(*extract_global)(void *, const char *); - void *(*extract_atom_datatype)(void *, const char *); + int *(*extract_atom_datatype)(void *, const char *); void *(*extract_atom)(void *, const char *); void *(*extract_compute)(void *, const char *, int, int); void *(*extract_fix)(void *, const char *, int, int, int, int); void *(*extract_variable)(void *, const char *, char *); + int (*extract_variable_datatype)(void *, const char *); int (*set_variable)(void *, char *, char *); void (*gather_atoms)(void *, char *, int, int, void *); @@ -93,22 +160,26 @@ struct _liblammpsplugin { void (*scatter_atoms_subset)(void *, char *, int, int, int, int *, void *); void (*gather_bonds)(void *, void *); - -// lammps_create_atoms() takes tagint and imageint as args -// ifdef insures they are compatible with rest of LAMMPS -// caller must match to how LAMMPS library is built + + void (*gather)(void *, char *, int, int, void *); + void (*gather_concat)(void *, char *, int, int, void *); + void (*gather_subset)(void *, char *, int, int, int, int *,void *); + void (*scatter)(void *, char *, int, int, void *); + void (*scatter_subset)(void *, char *, int, int, int, int *, void *); + +/* lammps_create_atoms() takes tagint and imageint as args + * the ifdef insures they are compatible with rest of LAMMPS + * caller must match to how LAMMPS library is built */ #ifndef LAMMPS_BIGBIG - void (*create_atoms)(void *, int, int *, int *, double *, - double *, int *, int); + void (*create_atoms)(void *, int, int *, int *, double *, double *, int *, int); #else - void (*create_atoms)(void *, int, int64_t *, int *, double *, - double *, int64_t *, int); + void (*create_atoms)(void *, int, int64_t *, int *, double *, double *, int64_t *, int); #endif int (*find_pair_neighlist)(void *, const char *, int, int, int); int (*find_fix_neighlist)(void *, const char *, int); - int (*find_compute_neighlist)(void *, char *, int); + int (*find_compute_neighlist)(void *, const char *, int); int (*neighlist_num_elements)(void *, int); void (*neighlist_element_neighbors)(void *, int, int, int *, int *, int **); @@ -141,8 +212,16 @@ struct _liblammpsplugin { int (*plugin_count)(); int (*plugin_name)(int, char *, char *, int); - void (*set_fix_external_callback)(void *, const char *, FixExternalFnPtr, void*); - void (*fix_external_get_force)(void *, const char *); +#if !defined(LAMMPS_BIGBIG) + int (*encode_image_flags)(int, int, int); + void (*decode_image_flags)(int, int *); +#else + int64_t (*encode_image_flags)(int, int, int); + void (*decode_image_flags)(int64_t, int *); +#endif + + void (*set_fix_external_callback)(void *, const char *, FixExternalFnPtr, void *); + double **(*fix_external_get_force)(void *, const char *); void (*fix_external_set_energy_global)(void *, const char *, double); void (*fix_external_set_energy_peratom)(void *, const char *, double *); void (*fix_external_set_virial_global)(void *, const char *, double *); @@ -150,6 +229,8 @@ struct _liblammpsplugin { void (*fix_external_set_vector_length)(void *, const char *, int); void (*fix_external_set_vector)(void *, const char *, int, double); + void (*flush_buffers)(void *); + void (*free)(void *); void (*is_running)(void *); @@ -157,6 +238,8 @@ struct _liblammpsplugin { int (*has_error)(void *); int (*get_last_error_message)(void *, char *, int); + + int (*python_api_version)(); }; typedef struct _liblammpsplugin liblammpsplugin_t; diff --git a/examples/COUPLE/plugin/simple.c b/examples/COUPLE/plugin/simple.c index dc3934b40c..8383584a38 100644 --- a/examples/COUPLE/plugin/simple.c +++ b/examples/COUPLE/plugin/simple.c @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains @@ -19,10 +19,16 @@ in.lammps = LAMMPS input script See README for compilation instructions */ +#include + #include #include #include -#include + +/* define so interface to lammps_open() is available, + since we will run on split communicator */ +#define LAMMPS_LIB_MPI 1 + #include "liblammpsplugin.h" /* this is the include for the plugin loader */ int main(int narg, char **arg) @@ -87,7 +93,13 @@ int main(int narg, char **arg) MPI_Abort(MPI_COMM_WORLD,1); } } - if (lammps == 1) lmp = plugin->open(0,NULL,comm_lammps,NULL); + if (lammps == 1) { + if (plugin->open == NULL) { + printf("ERROR: liblammpsmpi.c must be compiled with -DLAMMPS_LIB_MPI=1 for this program\n"); + MPI_Abort(MPI_COMM_WORLD,2); + } + lmp = plugin->open(0,NULL,comm_lammps,NULL); + } while (1) { if (me == 0) { @@ -112,23 +124,23 @@ int main(int narg, char **arg) int natoms = plugin->get_natoms(lmp); x = (double *) malloc(3*natoms*sizeof(double)); - plugin->gather_atoms(lmp,"x",1,3,x); + plugin->gather_atoms(lmp,(char *)"x",1,3,x); v = (double *) malloc(3*natoms*sizeof(double)); - plugin->gather_atoms(lmp,"v",1,3,v); + plugin->gather_atoms(lmp,(char *)"v",1,3,v); double epsilon = 0.1; x[0] += epsilon; - plugin->scatter_atoms(lmp,"x",1,3,x); + plugin->scatter_atoms(lmp,(char *)"x",1,3,x); plugin->command(lmp,"run 1"); } - // extract force on single atom two different ways + /* extract force on single atom two different ways */ if (lammps == 1) { double **f = (double **) plugin->extract_atom(lmp,"f"); printf("Force on 1 atom via extract_atom: %g\n",f[0][0]); - double *fx = (double *) plugin->extract_variable(lmp,"fx","all"); + double *fx = (double *) plugin->extract_variable(lmp,"fx",(char *)"all"); printf("Force on 1 atom via extract_variable: %g\n",fx[0]); } @@ -160,7 +172,7 @@ int main(int narg, char **arg) if (v) free(v); if (type) free(type); - // close down LAMMPS + /* close down LAMMPS */ if (lammps == 1) { plugin->close(lmp); diff --git a/examples/COUPLE/simple/CMakeLists.txt b/examples/COUPLE/simple/CMakeLists.txt index 4112eaa4e7..d9b877ec76 100644 --- a/examples/COUPLE/simple/CMakeLists.txt +++ b/examples/COUPLE/simple/CMakeLists.txt @@ -1,17 +1,44 @@ cmake_minimum_required(VERSION 3.10) -project(simple CXX) -set(LAMMPS_SRC_DIRECTORY "" CACHE PATH "Path for lammps source") -if(NOT LAMMPS_SRC_DIRECTORY STREQUAL "" AND EXISTS ${LAMMPS_SRC_DIRECTORY}/cmake/CMakeLists.txt) - option(BUILD_LIB "Build LAMMPS library" ON) - add_subdirectory(${LAMMPS_SRC_DIRECTORY}/cmake lammps) -else() +# enforce out-of-source build +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) + message(FATAL_ERROR "In-source builds are not allowed. You must create and use a build directory. " + "Please remove CMakeCache.txt and CMakeFiles first.") +endif() + +project(couple-simple VERSION 1.0 LANGUAGES C CXX) + +# by default, install into $HOME/.local (not /usr/local), +# so that no root access (and sudo) is needed +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Default install path" FORCE) +endif() + +# 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) + if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") + if(LAMMPS_EXCEPTIONS) + add_compile_options(/EHsc) + endif() + endif() + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) +endif() + +find_package(MPI QUIET) +# do not include the (obsolete) MPI C++ bindings which makes +# for leaner object files and avoids namespace conflicts +set(MPI_CXX_SKIP_MPICXX TRUE) + +########################## + +# build within LAMMPS build system +if(NOT LAMMPS_SOURCE_DIR) find_package(LAMMPS REQUIRED) endif() add_executable(simpleCC simple.cpp) target_link_libraries(simpleCC LAMMPS::lammps) -enable_language(C) add_executable(simpleC simple.c) target_link_libraries(simpleC LAMMPS::lammps) diff --git a/examples/COUPLE/simple/simple.c b/examples/COUPLE/simple/simple.c index 603ff270b7..fe2864f41e 100644 --- a/examples/COUPLE/simple/simple.c +++ b/examples/COUPLE/simple/simple.c @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/simple/simple.cpp b/examples/COUPLE/simple/simple.cpp index c05266975e..bf1174267e 100644 --- a/examples/COUPLE/simple/simple.cpp +++ b/examples/COUPLE/simple/simple.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/ - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/simple/simple.f90 b/examples/COUPLE/simple/simple.f90 index 56b1534c40..8902104e47 100644 --- a/examples/COUPLE/simple/simple.f90 +++ b/examples/COUPLE/simple/simple.f90 @@ -1,6 +1,6 @@ ! LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator -! www.cs.sandia.gov/~sjplimp/lammps.html -! Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories +! https://www.lammps.org/, Sandia National Laboratories +! LAMMPS development team: developers@lammps.org ! ! Copyright (2003) Sandia Corporation. Under the terms of Contract ! DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/COUPLE/simple/simple_f77.f90 b/examples/COUPLE/simple/simple_f77.f90 index 374a0748ee..ac1c03f061 100644 --- a/examples/COUPLE/simple/simple_f77.f90 +++ b/examples/COUPLE/simple/simple_f77.f90 @@ -1,6 +1,6 @@ ! LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator -! www.cs.sandia.gov/~sjplimp/lammps.html -! Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories +! https://www.lammps.org/, Sandia National Laboratories +! LAMMPS development team: developers@lammps.org ! ! Copyright (2003) Sandia Corporation. Under the terms of Contract ! DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/PACKAGES/cgdna/examples/oxDNA2/unique_bp/generate_unique.py b/examples/PACKAGES/cgdna/examples/oxDNA2/unique_bp/generate_unique.py index 2cd6f46aec..330215bd80 100644 --- a/examples/PACKAGES/cgdna/examples/oxDNA2/unique_bp/generate_unique.py +++ b/examples/PACKAGES/cgdna/examples/oxDNA2/unique_bp/generate_unique.py @@ -3,7 +3,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS Development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/PACKAGES/cgdna/util/generate.py b/examples/PACKAGES/cgdna/util/generate.py index d2ba3ba980..cd7465acdb 100644 --- a/examples/PACKAGES/cgdna/util/generate.py +++ b/examples/PACKAGES/cgdna/util/generate.py @@ -3,7 +3,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS Development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/PACKAGES/dielectric/README b/examples/PACKAGES/dielectric/README index 1d5f30263c..ef775e479f 100644 --- a/examples/PACKAGES/dielectric/README +++ b/examples/PACKAGES/dielectric/README @@ -2,7 +2,7 @@ This folder contains some example data and input scripts for the DIELECTRIC pack Nguyen TD, Li H, Bagchi D, Solis FJ, Olvera de la Cruz, Incorporating surface polarization effects into large-scale coarse-grained molecular dynamics simulation, Computer Physics Communications 2019, 241, 80--91. -- data.confined : two point opposite charges confined between two interfaces (epsilon1=2/epsilon2=10/epsilon2=2) +- data.confined : two point opposite charges confined between two interfaces (epsilon2=2/epsilon1=10/epsilon2=2) - data.sphere : two point opposite charges outside a spherical interface (epsilon_in=1/epsilon2=10) - in.confined : read in data.confined @@ -10,7 +10,7 @@ Nguyen TD, Li H, Bagchi D, Solis FJ, Olvera de la Cruz, Incorporating surface po For "atom_style dielectric" the Atoms section in the data file contains 15 following columns: -id mol type q x y z normx normy normz area_per_patch ed em epsilon curvature +id mol type q x y z normx normy normz area/patch ed em epsilon curvature where @@ -34,9 +34,13 @@ where For interface particles, epsilon is set to be em (the mean dielectric value above). -* area_per_patch: the surface area of the patch (element). +* area/patch: the surface area of the patch (element). For real charges, this value is irrelevant, can be 1.0. * curvature: surface mean curvature at the patch. For example, for spherical interfaces, curvature = 1/spherical radius. For planar interfaces, curvature = 0. + +Note that the properties normx, normy, normz, area/patch, ed, em, and curvature are not +used for the non-interface beads. epsilon is used to scale the charge of any non-interface +ion, see the documentation for pair styles with the dielectric suffix and fix polarize. diff --git a/examples/PACKAGES/dielectric/in.confined b/examples/PACKAGES/dielectric/in.confined index beb5b9a2b0..0f9dab7bba 100644 --- a/examples/PACKAGES/dielectric/in.confined +++ b/examples/PACKAGES/dielectric/in.confined @@ -7,7 +7,7 @@ # Dielectric constants can be set to be different from the input data file variable epsilon1 index 20 -variable epsilon2 index 8 +variable epsilon2 index 10 variable data index data.confined diff --git a/examples/SPIN/test_problems/README b/examples/SPIN/test_problems/README index 17e0935a35..66de9fa88e 100644 --- a/examples/SPIN/test_problems/README +++ b/examples/SPIN/test_problems/README @@ -44,7 +44,9 @@ directory. energy versus temperature. Comparison to the Langevin function results (computed by the python script). Note: This example is a reworked version of a test problem - provided by Martin Kroger (ETHZ). + provided by Martin Kroger (ETHZ). + Note 2: Two versions of this test are deployed, one at low + damping (0.01) and one at large damping (1.0). - validation_nve: simulates a small assembly of magnetic atoms (54). The atoms are diff --git a/examples/SPIN/test_problems/run_all.sh b/examples/SPIN/test_problems/run_all.sh index fb682e3ef5..51f11dc6d6 100755 --- a/examples/SPIN/test_problems/run_all.sh +++ b/examples/SPIN/test_problems/run_all.sh @@ -12,13 +12,19 @@ cd validation_damped_precession/ rm res_lammps.dat res_llg.dat cd .. -# test 3: langevin, damping and Zeeman -cd validation_langevin_precession/ +# test 3: langevin, damping and Zeeman, low damping (0.01) +cd validation_langevin_precession_d0.01/ ./run-test-prec.sh rm average_spin test-prec-spin.in res_lammps.dat res_langevin.dat cd .. -# test 4: NVE run, test Etot preservation +# test 4: langevin, damping and Zeeman, large damping (1.0) +cd validation_langevin_precession_d1.0/ +./run-test-prec.sh +rm average_spin test-prec-spin.in res_lammps.dat res_langevin.dat +cd .. + +# test 5: NVE run, test Etot preservation cd validation_nve/ ./run-test-nve.sh rm nve_spin_lattice.pdf res_lammps.dat diff --git a/examples/SPIN/test_problems/validation_langevin_precession/langevin.py b/examples/SPIN/test_problems/validation_langevin_precession_d0.01/langevin.py similarity index 100% rename from examples/SPIN/test_problems/validation_langevin_precession/langevin.py rename to examples/SPIN/test_problems/validation_langevin_precession_d0.01/langevin.py diff --git a/examples/SPIN/test_problems/validation_langevin_precession/plot_precession.py b/examples/SPIN/test_problems/validation_langevin_precession_d0.01/plot_precession.py similarity index 100% rename from examples/SPIN/test_problems/validation_langevin_precession/plot_precession.py rename to examples/SPIN/test_problems/validation_langevin_precession_d0.01/plot_precession.py diff --git a/examples/SPIN/test_problems/validation_langevin_precession/run-test-prec.sh b/examples/SPIN/test_problems/validation_langevin_precession_d0.01/run-test-prec.sh similarity index 100% rename from examples/SPIN/test_problems/validation_langevin_precession/run-test-prec.sh rename to examples/SPIN/test_problems/validation_langevin_precession_d0.01/run-test-prec.sh diff --git a/examples/SPIN/test_problems/validation_langevin_precession/test-prec-spin.template b/examples/SPIN/test_problems/validation_langevin_precession_d0.01/test-prec-spin.template similarity index 100% rename from examples/SPIN/test_problems/validation_langevin_precession/test-prec-spin.template rename to examples/SPIN/test_problems/validation_langevin_precession_d0.01/test-prec-spin.template diff --git a/examples/SPIN/test_problems/validation_langevin_precession_d1.0/langevin.py b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/langevin.py new file mode 100755 index 0000000000..0e9b634eeb --- /dev/null +++ b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/langevin.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 + +import numpy as np, pylab, tkinter +import matplotlib.pyplot as plt +import mpmath as mp + +mub=5.78901e-5 # Bohr magneton (eV/T) +kb=8.617333262145e-5 # Boltzman constant (eV/K) +g=2.0 # Lande factor (adim) + +Hz=10.0 # mag. field (T) + +#Definition of the Langevin function +def func(t): + return mp.coth(g*mub*Hz/(kb*t))-1.0/(g*mub*Hz/(kb*t)) + +npoints=200 +ti=0.01 +tf=20.0 +for i in range (0,npoints): + temp=ti+i*(tf-ti)/npoints + print('%lf %lf %lf' % (temp,func(temp),-g*mub*Hz*func(temp))) diff --git a/examples/SPIN/test_problems/validation_langevin_precession_d1.0/plot_precession.py b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/plot_precession.py new file mode 100755 index 0000000000..0141af56a0 --- /dev/null +++ b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/plot_precession.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +#Program fitting the exchange interaction +#Model curve: Bethe-Slater function +import numpy as np, pylab, tkinter +import matplotlib.pyplot as plt +from scipy.optimize import curve_fit +from decimal import * +import sys, string, os + + +argv = sys.argv +if len(argv) != 3: + print("Syntax: ./plot_precession.py res_lammps.dat res_langevin.dat") + sys.exit() + +lammps_file = sys.argv[1] +langevin_file = sys.argv[2] + +T_lmp,S_lmp,E_lmp = np.loadtxt(lammps_file, skiprows=0, usecols=(0,2,3),unpack=True) +T_lan,S_lan,E_lan = np.loadtxt(langevin_file, skiprows=0, usecols=(0,1,2),unpack=True) + +plt.figure() +plt.subplot(211) +plt.ylabel('') +plt.plot(T_lmp, S_lmp, 'b-', label='LAMMPS') +plt.plot(T_lan, S_lan, 'r--', label='Langevin') + +plt.subplot(212) +plt.ylabel('E (in eV)') +plt.plot(T_lmp, E_lmp, 'b-', label='LAMMPS') +plt.plot(T_lan, E_lan, 'r--', label='Langevin') + +plt.xlabel('T (in K)') +pylab.xlim([0,20.0]) +plt.legend() +plt.show() diff --git a/examples/SPIN/test_problems/validation_langevin_precession_d1.0/run-test-prec.sh b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/run-test-prec.sh new file mode 100755 index 0000000000..ecdbb2c156 --- /dev/null +++ b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/run-test-prec.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +tempi=0.0 +tempf=20.0 + +rm res_*.dat + +# compute Lammps +N=20 +for (( i=0; i<$N; i++ )) +do + temp="$(echo "$tempi+$i*($tempf-$tempi)/$N" | bc -l)" + sed s/temperature/${temp}/g test-prec-spin.template > \ + test-prec-spin.in + + # test standard Lammps + ./../../../../src/lmp_serial -in test-prec-spin.in + + # test spin/kk with Kokkos Lammps + # mpirun -np 1 ../../../../src/lmp_kokkos_mpi_only \ + # -k on -sf kk -in test-prec-spin.in + + Hz="$(tail -n 1 average_spin | awk -F " " '{print $3}')" + sz="$(tail -n 1 average_spin | awk -F " " '{print $5}')" + en="$(tail -n 1 average_spin | awk -F " " '{print $6}')" + echo $temp $Hz $sz $en >> res_lammps.dat +done + +# compute Langevin +python3 langevin.py > res_langevin.dat + +# plot results +python3 plot_precession.py res_lammps.dat res_langevin.dat diff --git a/examples/SPIN/test_problems/validation_langevin_precession_d1.0/test-prec-spin.template b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/test-prec-spin.template new file mode 100644 index 0000000000..94e7a02fee --- /dev/null +++ b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/test-prec-spin.template @@ -0,0 +1,48 @@ +#LAMMPS in.run + +units metal +atom_style spin +# atom_style spin/kk +atom_modify map array +boundary p p p + +# read_data singlespin.data + +lattice sc 3.0 +region box block 0.0 1.0 0.0 1.0 0.0 1.0 +create_box 1 box +create_atoms 1 box + +mass 1 1.0 +set type 1 spin 1.0 0.0 0.0 1.0 + +# defines a pair/style for neighbor list, but do not use it +pair_style spin/exchange 4.0 +pair_coeff * * exchange 1.0 0.0 0.0 1.0 + +group bead type 1 + +variable H equal 10.0 +variable Kan equal 0.0 +variable Temperature equal temperature +variable RUN equal 1000000 + +fix 1 all nve/spin lattice no +fix 2 all precession/spin zeeman ${H} 0.0 0.0 1.0 anisotropy ${Kan} 0.0 0.0 1.0 +fix_modify 2 energy yes +# fix 3 all langevin/spin ${Temperature} 0.01 12345 +fix 3 all langevin/spin ${Temperature} 1.0 12345 + +compute compute_spin all spin +compute outsp all property/atom spx spy spz sp +compute magsz all reduce ave c_outsp[3] + +thermo 50000 +thermo_style custom step time temp vol pe c_compute_spin[5] etotal + +variable magnetic_energy equal c_compute_spin[5] + +fix avespin all ave/time 1 ${RUN} ${RUN} v_Temperature v_H v_Kan c_magsz v_magnetic_energy file average_spin + +timestep 0.1 +run ${RUN} diff --git a/examples/bpm/impact/brokenDump b/examples/bpm/impact/brokenDump index ef78518c91..0a2316cd5e 100644 --- a/examples/bpm/impact/brokenDump +++ b/examples/bpm/impact/brokenDump @@ -1,3173 +1,3914 @@ -276 5469 5471 -288 1815 1931 -290 1810 1815 -293 1815 1816 -295 5350 5351 -300 1813 1815 -288 1815 1931 -276 5469 5471 -278 5475 5477 -283 5349 5350 -287 5470 5477 -290 5472 5477 -292 5350 5352 -294 5477 5478 -295 5350 5351 -305 1702 1704 -308 1705 5351 -313 1699 1704 -324 1820 5471 -327 1813 1814 -332 1937 1938 -339 5228 5349 -350 1811 1818 -353 1817 5348 -361 1588 1700 -362 1700 5348 -364 1817 5469 -368 1700 5228 -368 1704 1819 -372 1817 5467 -373 5351 5470 -374 1701 1818 -374 1817 5468 -377 1584 1694 -380 5231 5349 -383 1588 5349 -383 5231 5350 -386 1458 1574 -388 1811 1812 -399 1464 1580 -399 1817 1822 -306 1938 5471 -308 1928 1933 -309 1933 1934 -310 1933 2048 -311 5712 5830 -313 1931 1933 -332 1937 1938 -333 1938 1939 -333 2056 2171 -338 1938 1940 -340 2172 2174 -352 2172 5712 -353 2056 2057 -355 2056 2172 -359 5712 5831 -362 2057 2169 -367 1932 1938 -368 2052 5709 -372 2052 2053 -375 5712 5713 -375 2172 2173 -377 2174 2286 -385 5711 5712 -385 2169 5709 -386 1935 1936 -387 2054 2055 -387 2169 5829 -398 2277 2278 -399 2057 2171 -303 5232 5350 -303 5477 5595 -304 5352 5470 -306 1938 5471 -306 5483 5484 -312 5350 5355 -312 5481 5483 -312 5471 5591 -316 5471 5590 -318 5357 5470 -324 1820 5471 -330 5470 5475 -331 5354 5473 -332 5476 5481 -332 5471 5589 -332 5483 5601 -339 5228 5349 -341 5473 5474 -343 5358 5476 -346 5349 5352 -346 5355 5357 -347 5237 5350 -350 5357 5358 -351 5354 5467 -353 1817 5348 -358 5348 5467 -362 1700 5348 -362 5601 5602 -366 5470 5471 -367 5472 5475 -371 5476 5477 -372 1817 5467 -372 5480 5593 -373 5351 5470 -373 5601 5603 -374 1817 5468 -380 5231 5349 -383 1588 5349 -383 5231 5350 -387 5478 5481 -388 5234 5353 -389 5596 5601 -397 5484 5486 -400 5593 5601 -303 5477 5595 -311 5712 5830 -312 5471 5591 -316 5471 5590 -319 5717 5719 -325 5831 5833 -332 5471 5589 -349 5603 5604 -355 5717 5722 -359 5712 5831 -368 2052 5709 -370 5720 5722 -372 5480 5593 -372 5600 5603 -373 5600 5604 -373 5601 5603 -374 5587 5594 -375 5712 5713 -379 5588 5708 -381 5600 5714 -383 5720 5721 -385 5711 5712 -385 2169 5709 -387 2169 5829 -388 5722 5723 -391 5828 5829 -394 5833 5948 -398 5710 5712 -400 5593 5601 -401 1820 1822 -403 1817 1819 -404 1586 1588 -405 1569 1685 -410 1821 1938 -411 1822 5469 -412 1568 1575 -413 1822 1937 -421 1699 1819 -421 5232 5349 -422 1704 1814 -423 1582 1584 -431 1565 1572 -431 1578 1688 -431 1812 1929 -433 5469 5472 -435 1467 1585 -442 1809 1810 -448 1685 1692 -448 1698 1808 -451 1703 5349 -454 1563 1679 -454 1935 1937 -455 1703 5351 -457 1582 1694 -458 1813 1816 -459 1695 1805 -460 1926 1927 -461 1699 1814 -468 1810 1816 -471 1814 1819 -476 1701 1819 -478 1566 1682 -480 1818 1929 -481 1920 1925 -482 1580 1587 -485 5468 5469 -486 1689 1805 -490 1457 1464 -490 1806 1810 -493 1587 1588 -493 1814 1816 -497 1682 1689 -498 1699 1816 -500 1688 1805 -500 1689 1695 -402 2049 2051 -402 2054 2057 -410 1821 1938 -416 2052 5588 -417 2055 2056 -420 1939 2049 -423 1923 1930 -423 2161 2271 -426 2050 2160 -431 1812 1929 -431 2044 2154 -437 2284 2393 -441 1940 2054 -441 2174 5832 -442 2166 2173 -448 1927 1928 -449 2286 5949 -451 2163 2170 -452 2037 2038 -457 2396 2397 -460 1926 1927 -461 1936 2046 -461 2406 2513 -464 1930 1934 -465 2055 5712 -471 1931 1934 -473 1940 5710 -474 2154 2159 -475 2274 2275 -477 1933 2049 -478 1923 2040 -479 2037 2039 -479 2399 2400 -480 1818 1929 -481 1920 1925 -482 1930 2048 -482 2039 2042 -482 2164 2280 -482 2174 5830 -485 1930 1931 -486 1930 1936 -486 2046 2053 -487 1928 1930 -488 2167 2283 -495 2156 2159 -498 1928 1934 -403 5368 5369 -407 5484 5601 -409 5601 5604 -412 5232 5352 -414 5476 5596 -416 5123 5236 -419 5484 5602 -421 5232 5349 -421 5472 5595 -422 5129 5242 -425 5362 5363 -426 5347 5354 -426 5352 5355 -430 5246 5359 -433 5469 5472 -434 5481 5484 -437 5135 5248 -438 5365 5366 -439 5358 5478 -439 5483 5596 -441 5362 5369 -450 5363 5482 -450 5484 5487 -456 5484 5607 -458 5480 5599 -459 5242 5243 -461 5235 5236 -463 5479 5486 -464 5482 5483 -467 5234 5347 -467 5361 5362 -469 5232 5355 -470 5474 5475 -474 5116 5117 -475 5356 5363 -480 5234 5240 -481 5485 5487 -484 5480 5484 -485 5468 5469 -488 5476 5478 -493 5233 5238 -494 5356 5361 -495 5118 5238 -496 5363 5483 -497 5018 5128 -498 5233 5240 -500 5370 5488 -406 5591 5711 -406 5722 5724 -406 5969 5976 -407 5721 5725 -408 5600 5720 -409 5601 5604 -413 5597 5717 -419 5970 6089 -421 5472 5595 -421 6074 6081 -425 5719 5722 -425 5964 6083 -426 5594 5598 -426 5831 5838 -429 5840 5841 -436 5833 5838 -437 5724 5843 -439 5593 5595 -441 5951 5958 -444 5830 5831 -446 5713 5831 -449 5831 5951 -449 2286 5949 -453 5722 5725 -453 5709 5829 -454 5599 5600 -454 5591 5710 -455 5834 5842 -458 5480 5599 -459 5724 5837 -462 5589 5592 -462 6084 6202 -464 5598 5603 -465 2055 5712 -472 5954 5955 -473 1940 5710 -476 5594 5708 -477 5856 5975 -482 2174 5830 -482 5844 5963 -484 5714 5721 -488 5592 5708 -490 6083 6090 -501 1802 1807 -503 1805 1807 -504 1689 1806 -507 1569 1679 -507 1693 1805 -510 1688 1693 -511 1575 1690 -518 1799 1807 -520 1227 1340 -521 1803 1804 -522 1347 1463 -525 1575 1691 -528 1804 1925 -529 1581 1697 -531 1446 1562 -531 1573 1576 -535 1574 1575 -536 1802 1809 -548 1692 1693 -552 1693 1807 -553 1575 1692 -553 1819 1821 -555 1699 1813 -560 1922 1925 -569 5109 5111 -569 1705 1819 -576 1570 1690 -580 1808 1809 -584 1581 1696 -586 1471 5111 -589 1459 1576 -599 1702 1705 -502 2160 2167 -503 1922 1924 -503 2036 2037 -504 1922 2037 -504 2169 5830 -505 2057 2174 -505 2168 2283 -507 1924 2040 -507 2281 2390 -514 2162 2167 -514 2167 2168 -515 1929 1934 -515 2044 2159 -524 1929 1936 -530 2165 2167 -536 2167 2282 -549 2158 2274 -549 2519 2520 -560 1922 1925 -560 2035 2039 -560 2158 2276 -561 2289 5832 -562 1932 1939 -562 2263 2372 -567 2041 2157 -567 2381 2382 -581 1920 2037 -583 1920 1927 -583 5950 5953 -586 2042 2045 -593 5951 5952 -596 5833 5950 -600 2158 2159 -502 5254 5255 -507 5232 5237 -508 5473 5478 -511 5239 5240 -512 5111 5112 -513 5233 5353 -519 4901 5011 -519 5012 5122 -522 5235 5238 -522 5240 5241 -523 5260 5261 -523 5364 5369 -525 5490 5608 -528 5237 5238 -538 5479 5480 -542 5488 5493 -553 5611 5613 -555 5246 5365 -555 5489 5608 -557 4895 5005 -561 5481 5601 -564 5140 5141 -569 5109 5111 -571 5114 5235 -572 5488 5495 -573 5230 5237 -582 5490 5492 -584 5024 5134 -586 1471 5111 -587 5244 5367 -587 5352 5354 -587 5490 5495 -591 5486 5599 -594 5347 5348 -502 5959 6077 -504 2169 5830 -507 5606 5726 -519 5835 5948 -521 5967 6086 -523 5733 5852 -524 5719 5842 -529 5609 5728 -529 5833 5836 -541 5956 5958 -541 5968 5971 -547 5717 5723 -549 5961 6074 -551 6071 6190 -553 5611 5613 -554 5588 5710 -558 5594 5714 -559 5592 5713 -561 5481 5601 -564 5970 6083 -568 5853 5972 -569 5592 5716 -574 5606 5727 -574 5835 5955 -579 5592 5710 -583 5950 5953 -590 5855 5862 -591 5486 5599 -591 5718 5831 -593 5951 5952 -596 5605 5726 -596 5833 5950 -602 1820 1821 -603 1461 1571 -606 1683 1793 -607 1808 1815 -609 1322 1329 -610 1583 1585 -615 1576 1579 -616 1699 1811 -621 1557 1673 -622 1583 5229 -630 1468 1470 -634 1470 1471 -634 5111 5229 -635 1469 1471 -635 1469 1586 -639 1572 1576 -639 1698 1814 -639 1809 1926 -644 5229 5230 -645 1588 1702 -649 1690 1693 -652 1696 1813 -656 1574 1579 -657 1693 1813 -658 1819 1820 -659 1467 1577 -661 1455 1565 -669 1695 1811 -677 1100 1107 -678 1221 1334 -679 1433 1440 -679 1688 1696 -680 1687 1807 -682 1812 1816 -683 1689 1799 -689 1585 5229 -690 1701 1811 -692 1007 1014 -693 1466 1471 -696 1328 1335 -699 1582 1585 -601 1928 2048 -606 2619 2620 -610 2162 2165 -613 2387 2388 -615 2040 2047 -615 2266 2375 -619 2039 2159 -622 2053 2057 -624 2151 2156 -626 2053 2171 -627 2169 2174 -627 2287 2402 -628 2172 5830 -629 2291 2402 -634 2619 2621 -637 2034 2042 -639 1809 1926 -641 2613 2614 -646 1924 2034 -649 2145 2152 -649 2136 2137 -652 2626 2730 -653 2148 2155 -654 1932 1933 -655 1934 2048 -656 2501 2502 -660 2274 2276 -662 2253 2254 -672 1934 1937 -673 2369 2370 -675 2146 2262 -678 1917 1924 -685 2052 2054 -689 1929 1930 -697 1917 2034 -700 2057 5709 -604 5611 5618 -605 4907 5017 -611 5244 5359 -628 5245 5252 -634 5111 5229 -644 5229 5230 -647 5023 5024 -648 5012 5128 -651 4897 4898 -658 5111 5230 -659 5267 5380 -660 5608 5613 -661 5602 5603 -667 5236 5238 -675 5159 5272 -675 5247 5250 -681 5604 5607 -684 5386 5387 -684 5475 5478 -603 5953 5956 -604 5611 5618 -605 6076 6078 -617 6440 6447 -622 5716 5717 -625 5966 5973 -627 5956 6076 -628 2172 5830 -631 6071 6078 -634 5610 5612 -640 5592 5598 -643 5595 5598 -645 5599 5604 -646 5987 5994 -647 5610 5615 -648 5959 6076 -658 5605 5606 -658 5729 5734 -660 5608 5613 -661 5602 5603 -662 5593 5598 -664 6331 6338 -676 5615 5734 -681 5604 5607 -689 5726 5727 -690 5603 5723 -690 5604 5723 -690 5833 5953 -691 5867 5874 -694 5598 5717 -697 5714 5716 -700 2057 5709 -701 1448 1449 -710 1810 1813 -711 1467 1583 -714 1574 1581 -727 1459 1573 -749 1453 1459 -753 1571 1573 -755 1442 1449 -755 1799 1806 -759 1661 1668 -759 1685 1690 -762 1453 1456 -764 1804 1920 -770 1571 1572 -772 1442 1448 -774 1581 1691 -778 1319 1326 -778 1699 1702 -778 1698 1813 -784 1587 1697 -788 1570 1576 -789 1684 1690 -791 1796 1803 -792 1106 1113 -794 1583 1586 -797 1335 1445 -797 5107 5109 -799 1451 1452 -800 1806 1809 -702 5829 5948 -704 1919 1920 -708 2376 2483 -711 2291 5949 -716 2037 2044 -721 2160 2162 -724 2489 2490 -728 1918 1919 -728 1927 2042 -730 2496 2601 -731 5832 5950 -732 1928 1931 -734 2279 2281 -738 2020 2130 -750 1918 2034 -752 2055 5710 -757 2608 2712 -764 1804 1920 -772 2276 2277 -773 2153 2156 -775 2275 2390 -783 2401 2403 -787 2286 5829 -791 1929 1937 -792 2035 2151 -798 1932 1934 -708 4793 4900 -709 5036 5146 -711 5243 5356 -724 5152 5153 -726 5239 5246 -733 5483 5602 -746 5245 5253 -754 5236 5243 -756 5245 5250 -758 5230 5232 -762 4919 5029 -764 5607 5610 -770 5347 5355 -771 5364 5487 -787 5234 5235 -789 5125 5132 -791 5364 5484 -797 5107 5109 -702 5829 5948 -703 5732 5734 -710 6227 6343 -711 2291 5949 -711 6221 6337 -719 5597 5711 -719 5846 5847 -725 5753 5760 -730 5618 5732 -731 5832 5950 -734 5853 5966 -734 6080 6081 -745 5958 6071 -751 6101 6108 -752 2055 5710 -754 5598 5601 -755 5721 5834 -755 6107 6114 -759 5965 6088 -764 5607 5610 -770 5725 5728 -771 5954 6074 -772 5963 5965 -774 5965 6082 -775 5845 5848 -793 6199 6200 -793 6446 6453 -795 5727 5840 -795 5961 6082 -799 5734 5737 -804 1454 1455 -805 1098 1211 -807 1687 1689 -809 1331 1332 -810 984 1094 -817 1332 1450 -820 1326 1442 -826 1442 1444 -827 1221 1333 -834 1911 1918 -846 1095 1208 -846 1821 1822 -851 1691 1692 -855 1800 1804 -858 1574 1580 -865 1338 1448 -867 995 1002 -871 1703 1704 -872 1196 1203 -872 1687 1799 -876 1819 1822 -880 1197 1310 -882 1332 1333 -883 881 989 -883 1687 1801 -886 1082 1089 -887 1587 1704 -887 1689 1807 -888 1704 5351 -890 1818 1937 -897 1690 1691 -804 1919 1922 -809 2149 2265 -824 1921 2037 -825 2052 5710 -834 1911 1918 -834 2041 2158 -835 2041 2045 -849 1921 2031 -856 2037 2042 -872 1917 1919 -888 5950 5952 -890 1818 1937 -803 5467 5468 -807 5011 5018 -808 5130 5250 -808 5254 5261 -813 5130 5253 -819 5131 5132 -819 5485 5492 -819 5488 5490 -834 4882 4883 -842 5364 5370 -845 5352 5467 -847 5227 5234 -848 5370 5490 -853 5125 5131 -855 5485 5493 -862 5020 5021 -863 5228 5348 -871 5599 5601 -874 5108 5114 -876 5366 5370 -878 5008 5015 -878 5369 5488 -879 5015 5133 -885 5021 5131 -888 1704 5351 -890 5125 5133 -890 5366 5485 -812 6081 6085 -814 5850 5968 -818 6452 6459 -819 5725 5730 -820 5723 5725 -825 2052 5710 -826 5604 5728 -832 5725 5842 -837 6102 6220 -846 5959 6082 -846 5973 6086 -861 6084 6201 -870 5598 5716 -871 5599 5601 -871 5725 5845 -871 6085 6201 -887 6233 6349 -892 6077 6196 -899 6337 6344 -903 1576 1578 -904 1336 1339 -909 1704 1705 -909 1806 1917 -913 1218 1325 -913 1700 1705 -923 1470 1586 -924 1304 1311 -929 880 887 -929 978 1088 -931 875 983 -934 1325 1330 -936 1459 1574 -940 1571 1576 -948 1695 1813 -950 1325 1332 -955 1821 1937 -962 1212 1325 -968 1421 1428 -970 1336 1450 -972 1816 1821 -974 1817 1818 -978 1076 1083 -980 1806 1807 -986 1577 1579 -987 1325 1333 -994 1457 1458 -995 1216 1328 -999 1214 1215 -1000 1810 1925 -904 2162 2277 -907 1923 1924 -907 2172 5832 -909 1806 1917 -909 2396 2403 -916 2291 6070 -917 2391 2504 -918 5829 5830 -919 2157 2158 -921 2405 5952 -923 1915 1916 -923 2259 2266 -940 2043 2050 -948 1913 1916 -951 2040 2048 -952 2279 2398 -955 1821 1937 -955 2405 2519 -964 2276 2282 -964 2498 2505 -967 2256 2263 -973 2043 2160 -979 1932 1937 -984 2390 2392 -998 2392 2395 -1000 1810 1925 -902 5132 5251 -904 5131 5251 -911 4786 4787 -922 5242 5249 -934 5360 5479 -939 5136 5138 -946 5488 5489 -969 5249 5362 -976 5364 5367 -979 5257 5259 -979 5257 5264 -981 5249 5368 -983 5243 5362 -988 5393 5506 -994 5248 5255 -906 5966 5974 -907 2172 5832 -916 2291 6070 -918 5829 5830 -926 6092 6093 -936 5600 5722 -936 5963 5968 -937 5963 5964 -940 5853 5974 -941 5851 5856 -946 5966 5971 -948 5858 5859 -951 5840 5960 -963 5847 5960 -966 5605 5612 -973 5838 5951 -979 5852 5857 -987 5851 5974 -988 5730 5843 -993 5841 5845 -994 6355 6362 -996 5851 5854 -997 5965 5968 -1007 1683 1801 -1015 1575 1581 -1016 1693 1696 -1017 1465 1582 -1018 1676 1677 -1019 1332 1336 -1024 1464 1574 -1026 1532 1539 -1027 1212 1319 -1036 1442 1559 -1042 1087 1090 -1043 1790 1797 -1044 1678 1681 -1044 1804 1919 -1059 1330 1444 -1059 1458 1568 -1066 1690 1692 -1071 1792 1905 -1073 1692 1807 -1074 1212 1216 -1077 1690 1807 -1080 1071 1184 -1083 1326 1436 -1090 1705 5469 -1098 1681 1684 -1003 2505 2610 -1004 2168 2288 -1013 2257 2372 -1029 2372 2373 -1037 2154 2161 -1037 2162 2168 -1040 2279 2282 -1044 1804 1919 -1050 1933 1939 -1055 2276 2279 -1064 2389 2506 -1071 1792 1905 -1073 2162 2282 -1078 2278 2392 -1084 2156 2161 -1085 6072 6190 -1089 2719 2820 -1014 5512 5513 -1019 5370 5487 -1026 5010 5013 -1032 5228 5347 -1032 5244 5362 -1033 5130 5135 -1059 5009 5013 -1064 5240 5244 -1070 5488 5608 -1076 5480 5481 -1078 5015 5016 -1085 5029 5030 -1088 5252 5253 -1089 5130 5133 -1090 5127 5128 -1090 1705 5469 -1091 5118 5241 -1094 5487 5490 -1096 5235 5237 -1002 6081 6199 -1004 5962 5964 -1008 5955 5956 -1010 5841 5847 -1011 5968 5969 -1014 5961 6080 -1015 5954 5961 -1016 6206 6316 -1018 5948 5956 -1020 6671 6678 -1022 5844 5845 -1023 5714 5715 -1023 5841 5842 -1032 5843 5844 -1032 5841 5844 -1033 5967 5968 -1038 5963 5969 -1039 5972 5973 -1041 6238 6245 -1044 5844 5962 -1048 5966 5968 -1052 5839 5841 -1053 6428 6435 -1054 5953 5958 -1056 5961 5967 -1060 6076 6079 -1071 6083 6084 -1071 6322 6323 -1072 5839 5954 -1082 6433 6435 -1085 6072 6190 -1088 5754 5873 -1088 5834 5841 -1097 5728 5729 -1098 5843 5849 -1102 1336 1456 -1113 1688 1695 -1117 1801 1802 -1118 731 738 -1118 1696 1698 -1121 1335 1450 -1132 1327 1330 -1136 1453 1455 -1139 1330 1442 -1139 1686 1801 -1142 646 653 -1149 1802 1803 -1155 1327 1444 -1157 953 960 -1158 1216 1327 -1169 1341 1451 -1173 643 650 -1176 1806 1923 -1178 1696 1699 -1181 552 652 -1184 1216 1330 -1185 1330 1335 -1186 1686 1796 -1198 640 647 -1101 2839 2937 -1102 2044 2160 -1107 2274 2279 -1112 6069 6073 -1114 2152 2268 -1128 1912 2028 -1131 2165 2168 -1144 2043 2048 -1148 2402 6068 -1152 2269 2384 -1156 2051 2171 -1159 2150 2270 -1174 2269 2378 -1176 1806 1923 -1176 2269 2386 -1181 2385 2492 -1193 2404 2407 -1194 2516 2521 -1198 1930 2046 -1199 2384 2385 -1103 5611 5616 -1105 5015 5019 -1111 5014 5021 -1113 5493 5496 -1114 4892 5010 -1115 5250 5253 -1127 4891 4892 -1128 5248 5250 -1131 5132 5245 -1133 5136 5259 -1133 5256 5371 -1135 5253 5256 -1139 5495 5496 -1142 4890 4892 -1144 4880 4884 -1146 5014 5022 -1156 5014 5016 -1157 5244 5249 -1159 5011 5128 -1163 5258 5377 -1164 4483 4582 -1174 4360 4361 -1174 5015 5131 -1176 5014 5019 -1178 5239 5247 -1179 5262 5265 -1181 5247 5249 -1187 4772 4885 -1187 5016 5019 -1187 5130 5248 -1190 4588 4589 -1194 4476 4477 -1200 5247 5248 -1103 5611 5616 -1103 6107 6108 -1105 6204 6207 -1111 6201 6202 -1112 6069 6073 -1112 6210 6324 -1114 5739 5860 -1128 5597 5716 -1135 5852 5858 -1141 6084 6090 -1148 2402 6068 -1148 6200 6204 -1150 5865 5978 -1150 6206 6323 -1152 5720 5727 -1157 5854 5857 -1160 5833 5951 -1168 5604 5606 -1168 5849 5850 -1173 6074 6075 -1175 5743 5860 -1180 5959 5962 -1181 5610 5728 -1190 5960 5967 -1195 5951 5956 -1195 6204 6318 -1212 641 743 -1212 1692 1808 -1213 1680 1796 -1215 557 564 -1216 664 671 -1216 737 744 -1220 1098 1205 -1231 1680 1681 -1234 1451 1457 -1237 1681 1795 -1245 1179 1292 -1247 1576 1690 -1249 1092 1199 -1249 1324 1436 -1254 473 480 -1260 468 563 -1260 551 558 -1260 1695 1696 -1265 1211 1212 -1265 1693 1695 -1269 1332 1442 -1272 1808 1810 -1277 1670 1677 -1280 1178 1185 -1287 1320 1430 -1289 1679 1685 -1291 1694 1696 -1294 1212 1218 -1294 1564 1678 -1296 844 851 -1297 549 649 -1298 1324 1438 -1298 1670 1675 -1210 2165 2171 -1211 2500 2506 -1214 2279 2284 -1227 6068 6069 -1233 2269 2273 -1233 2492 2499 -1235 2153 2270 -1248 2385 2498 -1258 2263 2378 -1267 2516 6187 -1268 2050 2166 -1268 2146 2264 -1268 3111 3198 -1269 1906 1907 -1272 2500 2501 -1273 2493 2604 -1277 2497 2499 -1277 2521 6306 -1280 2395 2398 -1283 2054 2171 -1283 2501 2508 -1292 2401 2407 -1295 2800 2898 -1299 3034 3125 -1201 5258 5379 -1203 4902 5014 -1204 5256 5258 -1207 5248 5249 -1209 4595 4698 -1213 5242 5362 -1214 4704 4705 -1214 4784 4897 -1216 5131 5133 -1220 4367 4464 -1222 5359 5360 -1231 5467 5475 -1232 5244 5361 -1234 4373 4470 -1234 5500 5501 -1235 4168 4255 -1239 5490 5613 -1244 5129 5247 -1254 5607 5608 -1255 5131 5136 -1260 4261 4262 -1262 5124 5241 -1262 5260 5262 -1271 5611 5612 -1272 5124 5129 -1273 5120 5241 -1281 5128 5129 -1282 5020 5027 -1283 5264 5265 -1286 5262 5267 -1293 4370 4467 -1296 4363 4364 -1299 4711 4816 -1202 5957 5958 -1203 5723 5728 -1214 5969 5971 -1215 6329 6437 -1217 5837 5842 -1220 5730 5848 -1221 5610 5731 -1221 5853 5854 -1227 5957 5959 -1227 6068 6069 -1228 6684 6791 -1230 6379 6386 -1230 6477 6590 -1230 6902 6909 -1236 5849 5851 -1239 5490 5613 -1243 5729 5736 -1245 6077 6078 -1253 5610 5734 -1257 5609 5723 -1265 5963 6083 -1267 2516 6187 -1271 5611 5612 -1273 5956 5959 -1278 5745 5858 -1278 5863 5866 -1279 5962 5965 -1279 6079 6082 -1279 6262 6269 -1281 6690 6797 -1284 5840 5847 -1285 6992 7088 -1288 5966 5967 -1288 6584 6591 -1288 6579 6689 -1290 6090 6202 -1293 6780 6884 -1296 5721 5840 -1297 5597 5598 -1297 5853 5857 -1300 5745 5749 -1302 1235 1236 -1303 1455 1573 -1304 1222 1333 -1311 1678 1679 -1313 1210 1216 -1324 548 555 -1328 1796 1797 -1329 1329 1439 -1331 1670 1671 -1341 1210 1213 -1342 1584 1700 -1344 1678 1680 -1356 4995 5109 -1361 1801 1804 -1366 1807 1808 -1367 459 554 -1374 1314 1424 -1374 1287 1403 -1376 1215 1322 -1377 750 856 -1382 1328 1330 -1388 647 749 -1395 1096 1207 -1399 1330 1445 -1307 2689 2790 -1308 2497 2612 -1315 2154 2156 -1316 2521 6188 -1318 2171 2173 -1320 2264 2267 -1325 2695 2796 -1326 2898 2899 -1328 3028 3119 -1329 2799 2800 -1331 3138 3225 -1332 2908 3003 -1334 2045 2048 -1334 2045 2047 -1337 2500 2503 -1338 2161 2277 -1343 2261 2380 -1343 2910 2911 -1349 2045 2051 -1352 2264 2270 -1353 1922 2042 -1353 2565 2566 -1356 2454 2559 -1356 2676 2677 -1358 1917 1918 -1358 2803 2901 -1360 2057 2172 -1364 2577 2578 -1366 2815 2913 -1370 3131 3132 -1374 2707 2808 -1384 2229 2230 -1397 3031 3122 -1399 2162 2274 -1302 4473 4474 -1304 5370 5493 -1305 4364 4461 -1307 4271 4363 -1308 4990 4995 -1310 5263 5270 -1311 4592 4695 -1316 5122 5129 -1316 5133 5136 -1317 5072 5182 -1317 5256 5261 -1318 4274 4366 -1320 4701 4702 -1320 4828 4829 -1321 5375 5493 -1325 4480 4579 -1326 5489 5490 -1330 5241 5242 -1330 5374 5375 -1333 4717 4822 -1333 5024 5141 -1350 4364 4368 -1352 4262 4360 -1355 4363 4368 -1356 4995 5109 -1357 4585 4586 -1362 5370 5373 -1367 5496 5613 -1369 4155 4156 -1369 5239 5241 -1375 5473 5480 -1375 5617 5622 -1376 4708 4813 -1377 4835 4942 -1380 4585 4695 -1388 5132 5138 -1389 4162 4249 -1389 4265 4357 -1393 5241 5247 -1398 5107 5114 -1309 6327 6330 -1310 5898 6017 -1314 6578 6585 -1319 5725 5848 -1321 5717 5718 -1324 5739 5745 -1333 6208 6209 -1341 6322 6437 -1343 5832 5951 -1354 5590 5595 -1363 5957 5964 -1367 5496 5613 -1368 5604 5722 -1374 5745 5866 -1375 5617 5622 -1380 5732 5852 -1380 5839 5845 -1387 5839 5956 -1388 5594 5595 -1393 5749 5866 -1395 5751 5864 -1395 6443 6444 -1401 1286 1293 -1403 1096 1205 -1404 1205 1213 -1407 554 561 -1407 1327 1328 -1410 474 569 -1411 1800 1801 -1420 1575 1576 -1422 1328 1333 -1422 1397 1404 -1426 1448 1450 -1433 1458 1573 -1448 1327 1329 -1451 1070 1077 -1454 560 567 -1454 850 857 -1463 1564 1684 -1464 1684 1687 -1467 1664 1781 -1479 1453 1458 -1481 1324 1326 -1481 1585 1588 -1486 1587 1702 -1489 1468 1471 -1497 1564 1569 -1405 2919 2920 -1407 2157 2162 -1413 2393 2399 -1418 2700 2707 -1435 3021 3022 -1436 2809 2907 -1437 2375 2380 -1442 2391 2392 -1454 2925 2926 -1461 2598 2605 -1463 2157 2164 -1465 2034 2041 -1483 2259 2265 -1483 2393 2395 -1483 2497 2502 -1493 2393 2400 -1405 5246 5250 -1434 5253 5255 -1436 5107 5115 -1449 5373 5493 -1458 5254 5374 -1470 4367 4368 -1476 5467 5469 -1476 5372 5491 -1483 4899 4902 -1485 5116 5123 -1493 5263 5264 -1496 4790 4903 -1499 4707 4708 -1409 5743 5861 -1415 6333 6445 -1419 5616 5737 -1421 5742 5855 -1422 5970 6088 -1434 6367 6374 -1435 6330 6445 -1441 5739 5858 -1451 5856 5969 -1456 5618 5740 -1459 5624 5744 -1459 5739 5852 -1460 5731 5851 -1469 5971 5974 -1473 6356 6470 -1480 5999 6006 -1484 5993 6000 -1486 5840 5842 -1491 5737 5740 -1492 5844 5957 -1496 5871 5984 -1498 5732 5737 -1500 5829 5833 -1502 1450 1451 -1514 1227 1334 -1514 1324 1329 -1515 1464 1465 -1518 1085 1086 -1518 1448 1453 -1532 1085 1087 -1537 1081 1084 -1537 1552 1672 -1543 1093 1096 -1546 1693 1808 -1551 1800 1911 -1556 973 1087 -1559 1676 1683 -1563 1096 1101 -1563 1329 1444 -1566 1086 1087 -1571 1101 1208 -1576 1090 1093 -1576 1466 5108 -1577 985 1099 -1580 1094 1101 -1581 1085 1199 -1583 974 975 -1587 1082 1084 -1600 983 990 -1505 2379 2380 -1506 2049 2056 -1512 3128 3129 -1516 2383 2385 -1519 2700 2701 -1521 2155 2271 -1526 2384 2391 -1532 2606 2609 -1534 2156 2270 -1535 2402 5949 -1536 2170 2286 -1537 2053 2169 -1538 2036 2039 -1539 2507 2508 -1551 1800 1911 -1553 2604 2606 -1555 2498 2500 -1560 2931 2932 -1561 2599 2709 -1562 2035 2041 -1568 2713 2814 -1571 2389 2500 -1577 2694 2701 -1597 2383 2492 -1598 2701 2808 -1503 5491 5493 -1505 5260 5380 -1510 5013 5127 -1526 4889 4999 -1530 5376 5491 -1531 5118 5124 -1532 5142 5259 -1536 4897 4904 -1548 5131 5138 -1550 5246 5367 -1553 4706 4708 -1566 5136 5142 -1571 5371 5379 -1576 1466 5108 -1579 5165 5278 -1580 5352 5475 -1580 5382 5385 -1582 5478 5483 -1501 5977 6094 -1506 6005 6012 -1515 5869 5872 -1526 5954 5959 -1535 2402 5949 -1536 5842 5845 -1537 5871 5991 -1543 5766 5885 -1548 5965 5967 -1550 5849 5856 -1576 5632 5633 -1585 5875 5992 -1590 5844 5850 -1590 6244 6251 -1595 5742 5861 -1595 5990 5991 -1596 5748 5861 -1605 1207 1208 -1614 1235 1237 -1618 1088 1090 -1621 1210 1215 -1652 1088 1095 -1652 1330 1332 -1653 979 981 -1665 1208 1210 -1668 1092 1205 -1672 876 988 -1689 1683 1799 -1700 1451 1453 -1605 2256 2261 -1613 2045 2165 -1625 2155 2272 -1629 2389 2498 -1632 2038 2039 -1644 2381 2388 -1654 2493 2606 -1660 2144 2261 -1660 2279 2392 -1679 2278 2279 -1683 2151 2159 -1689 2254 2255 -1700 2261 2264 -1609 5136 5139 -1612 4789 4796 -1620 5123 5124 -1622 5232 5234 -1645 5237 5355 -1646 4902 5022 -1675 5255 5373 -1679 4905 4908 -1693 5255 5256 -1695 4889 4890 -1609 5621 5735 -1620 5750 5752 -1631 6074 6082 -1632 6098 6099 -1633 5855 5857 -1638 5743 5866 -1639 5725 5727 -1653 5854 5856 -1667 5960 5961 -1670 5977 6092 -1672 5749 5751 -1698 5970 5971 -1699 6080 6085 -1704 979 982 -1707 1106 1108 -1746 1002 1113 -1756 1227 1339 -1759 1685 1686 -1764 1793 1800 -1765 1122 1236 -1771 866 968 -1774 1216 1333 -1779 1689 1693 -1792 1187 1188 -1702 2250 2257 -1704 2387 2394 -1716 2153 2154 -1729 2258 2261 -1744 1903 2013 -1755 2517 2622 -1757 2039 2153 -1759 2045 2050 -1762 2521 2628 -1770 2251 2366 -1772 2265 2272 -1774 2151 2153 -1780 2395 2397 -1786 1922 2036 -1793 2593 2703 -1800 2631 2632 -1702 5251 5252 -1707 5504 5510 -1710 5384 5390 -1711 5254 5256 -1715 5390 5503 -1724 5258 5371 -1726 5503 5504 -1727 5018 5134 -1728 4905 5022 -1728 5121 5124 -1739 5503 5505 -1740 4544 4647 -1759 4996 5004 -1759 5384 5503 -1765 5256 5374 -1767 4431 4432 -1767 4896 5010 -1769 4772 4886 -1778 5384 5504 -1785 5114 5115 -1787 5470 5472 -1790 5149 5150 -1790 5267 5385 -1794 5119 5121 -1795 4886 4890 -1799 5123 5241 -1704 5839 5962 -1716 6217 6218 -1722 5960 5968 -1723 6084 6085 -1726 6080 6088 -1738 6078 6195 -1738 6317 6318 -1741 5720 5725 -1753 6077 6083 -1761 6317 6321 -1763 6090 6091 -1764 6092 6094 -1765 5965 6080 -1771 5974 5975 -1776 6097 6100 -1782 5737 5742 -1789 5967 5973 -1789 6092 6097 -1796 5976 5977 -1796 6215 6325 -1806 1100 1102 -1814 1354 5109 -1825 1324 1327 -1825 1570 1685 -1829 1798 1800 -1832 1575 1685 -1834 1563 1678 -1843 1352 4994 -1844 1576 1581 -1844 1799 1801 -1849 1208 1209 -1851 1579 1582 -1856 1339 1341 -1860 1198 1203 -1860 1218 1333 -1865 1122 1237 -1868 1210 1327 -1877 1554 1670 -1892 1230 1345 -1894 1670 1678 -1898 973 976 -1900 1222 1339 -1807 6305 6306 -1814 2616 2617 -1815 2011 2017 -1816 2034 2035 -1820 2625 2632 -1824 2015 2017 -1833 2264 2266 -1833 2282 2284 -1840 2017 2018 -1841 2017 2133 -1847 2016 2017 -1848 2603 2608 -1851 2010 2018 -1857 2377 2380 -1858 2017 2135 -1859 2603 2717 -1863 2742 6308 -1869 2164 2168 -1871 2608 2717 -1871 2626 2735 -1881 2375 2382 -1890 2150 2153 -1890 2606 2607 -1898 2133 2134 -1804 5266 5268 -1805 5265 5268 -1810 5352 5357 -1813 5259 5260 -1814 1354 5109 -1814 5257 5262 -1814 5377 5379 -1821 5006 5122 -1824 4895 5010 -1831 4759 4760 -1837 5268 5271 -1843 1352 4994 -1843 5270 5271 -1848 4663 4768 -1850 5269 5276 -1850 5268 5273 -1852 5629 5634 -1867 5251 5258 -1877 4992 4995 -1881 5267 5268 -1883 5510 5631 -1884 5256 5373 -1887 5271 5274 -1888 5386 5506 -1889 5635 5636 -1894 5112 5114 -1894 5114 5233 -1803 5977 6097 -1807 6305 6306 -1811 6090 6207 -1812 5972 5974 -1814 6073 6187 -1830 6426 6430 -1833 6331 6332 -1834 6099 6211 -1836 6088 6090 -1837 6093 6094 -1846 6089 6090 -1847 6223 6224 -1848 5630 5750 -1852 5629 5634 -1857 6309 6419 -1860 5960 5965 -1860 6085 6207 -1867 6310 6318 -1872 5865 5986 -1872 5973 5974 -1872 6218 6328 -1874 6444 6448 -1875 6211 6219 -1875 6216 6219 -1880 6310 6311 -1883 5510 5631 -1889 5635 5636 -1889 6230 6340 -1894 6311 6419 -1896 6311 6427 -1897 6098 6105 -1910 1349 4991 -1915 975 1086 -1915 1115 1120 -1922 1463 1464 -1923 1350 4991 -1925 989 990 -1926 990 1094 -1938 1084 1087 -1942 1085 1090 -1942 1089 1196 -1945 1570 1575 -1946 1466 5109 -1950 1213 1215 -1979 860 962 -1980 1095 1202 -1997 1096 1208 -1999 1332 1449 -1918 2168 2282 -1921 2384 2386 -1923 2134 2252 -1923 2520 2631 -1931 2260 2376 -1932 1918 2028 -1933 2255 2374 -1936 2156 2276 -1938 2625 2627 -1939 2519 6189 -1951 2496 2607 -1951 2515 2630 -1955 6191 6307 -1959 2163 2164 -1962 2152 2270 -1967 2056 5712 -1974 2516 2518 -1975 2377 2489 -1977 2028 2035 -1988 2605 2715 -1992 2626 2736 -1994 2493 2598 -1998 2238 2245 -1906 5119 5120 -1910 1349 4991 -1910 5274 5389 -1915 5156 5275 -1920 4760 4761 -1923 1350 4991 -1925 5388 5505 -1929 5017 5024 -1929 5117 5236 -1931 4874 4992 -1931 5508 5511 -1933 5233 5235 -1937 5375 5494 -1943 5011 5012 -1946 1466 5109 -1951 5385 5505 -1953 5386 5393 -1964 5154 5274 -1967 4873 4881 -1976 5508 5513 -1980 5113 5120 -1989 5266 5273 -1991 4886 4996 -1994 5269 5270 -1995 5371 5373 -1904 6434 6441 -1905 6339 6451 -1906 6222 6225 -1906 6445 6446 -1910 5719 5724 -1922 5985 6104 -1924 6085 6090 -1925 6325 6332 -1935 6448 6559 -1937 5867 5868 -1937 6107 6109 -1948 6217 6222 -1955 6191 6307 -1956 5959 5961 -1962 6081 6082 -1965 6456 6563 -1966 6236 6346 -1966 6310 6315 -1979 5730 5849 -1979 6446 6447 -1985 6228 6231 -2002 984 990 -2009 1216 1325 -2019 984 1088 -2024 1081 1195 -2025 1091 1092 -2038 1080 1081 -2039 1078 1189 -2046 1565 1570 -2047 864 970 -2048 752 753 -2057 1079 1080 -2062 1329 1445 -2064 968 976 -2070 1331 1338 -2075 1802 1804 -2076 1073 1074 -2083 974 979 -2088 980 981 -2098 1224 1331 -2014 2389 2394 -2015 2601 2608 -2017 2255 2371 -2017 2379 2494 -2022 2711 2714 -2026 2609 2612 -2034 2709 2716 -2038 2249 2368 -2044 2140 2144 -2044 2156 2271 -2052 2251 2368 -2054 2613 2615 -2056 2282 2398 -2056 2710 2817 -2058 2155 2270 -2059 2489 2495 -2060 2369 2371 -2063 2379 2486 -2067 2028 2034 -2074 2486 2487 -2074 2496 2497 -2086 2491 2494 -2088 2371 2374 -2092 2260 2375 -2092 2374 2375 -2100 2390 2391 -2004 5277 5280 -2006 5386 5392 -2007 5014 5015 -2008 5382 5384 -2021 5138 5259 -2023 5259 5262 -2027 5269 5274 -2027 5490 5493 -2030 5155 5162 -2033 5122 5128 -2040 5378 5379 -2043 5009 5119 -2046 5271 5272 -2061 5277 5279 -2064 5268 5391 -2073 4996 5003 -2074 5162 5163 -2076 5160 5283 -2080 5274 5277 -2089 5233 5234 -2094 4993 5000 -2098 5268 5385 -2014 5850 5969 -2016 6203 6318 -2018 6557 6558 -2021 5849 5854 -2028 5721 5842 -2032 5729 5849 -2034 6449 6450 -2045 5731 5854 -2060 6203 6204 -2070 6663 6764 -2090 6559 6560 -2098 5730 5736 -2099 6210 6325 -2099 6327 6329 -2102 1082 1083 -2105 1330 1450 -2114 1093 1094 -2129 971 976 -2132 1088 1093 -2138 1336 1338 -2159 863 864 -2162 1067 1068 -2166 977 978 -2168 759 859 -2173 861 864 -2173 1076 1078 -2188 869 971 -2198 861 867 -2199 1090 1095 -2103 2704 2811 -2105 2602 2712 -2106 2285 2398 -2107 2503 2615 -2108 2607 2612 -2114 2259 2261 -2117 2368 2369 -2123 2615 2618 -2128 2282 2285 -2129 2255 2369 -2130 2377 2382 -2135 2706 2713 -2136 2382 2495 -2136 2611 2721 -2156 2150 2264 -2159 2255 2368 -2172 2604 2605 -2182 2805 2812 -2195 2708 2819 -2196 2811 2817 -2199 2262 2264 -2103 5153 5272 -2108 5045 5161 -2109 4878 4993 -2110 5278 5285 -2111 5256 5379 -2112 5160 5275 -2113 5161 5162 -2118 5629 5636 -2121 4648 4759 -2121 5044 5051 -2139 5159 5277 -2148 5163 5166 -2156 5273 5392 -2159 5386 5388 -2165 5168 5281 -2176 5166 5169 -2179 5158 5278 -2180 4907 5023 -2185 4794 4911 -2196 5164 5166 -2198 4880 4998 -2114 6353 6461 -2118 5629 5636 -2123 6079 6201 -2125 6327 6332 -2130 6454 6565 -2131 5610 5726 -2137 6564 6668 -2150 6569 6570 -2154 6558 6559 -2158 6234 6237 -2162 5846 5848 -2168 5882 5883 -2172 6322 6324 -2177 6453 6560 -2177 6558 6564 -2184 5964 5965 -2184 6202 6207 -2187 6199 6201 -2187 6562 6670 -2192 6203 6209 -2194 6557 6564 -2196 6207 6209 -2197 6685 6796 -2203 1803 1920 -2206 981 1091 -2211 62 63 -2220 757 861 -2223 860 861 -2223 1079 1086 -2228 1088 1094 -2231 976 978 -2233 859 866 -2233 1095 1207 -2238 419 420 -2239 1321 1327 -2240 1074 1075 -2251 335 419 -2257 413 414 -2258 757 859 -2262 751 754 -2266 1073 1080 -2267 420 509 -2270 145 146 -2271 1319 1327 -2273 414 503 -2273 650 746 -2274 329 413 -2274 979 1093 -2275 328 329 -2275 1797 1914 -2278 1322 1327 -2290 648 650 -2294 753 853 -2202 2265 2267 -2203 1803 1920 -2206 2811 2818 -2207 2621 2729 -2227 2377 2494 -2230 2814 2819 -2234 2602 2713 -2236 2360 2367 -2240 2033 2150 -2243 2609 2723 -2244 2813 2816 -2254 2806 2910 -2256 2361 2474 -2261 2812 2816 -2263 1918 2036 -2265 1916 2030 -2271 2817 2818 -2275 1797 1914 -2281 2373 2379 -2285 2609 2614 -2288 2810 2918 -2291 2148 2150 -2294 2145 2150 -2295 2383 2388 -2201 5159 5278 -2214 5165 5166 -2214 5373 5376 -2224 5165 5284 -2230 5000 5115 -2233 5154 5277 -2234 5465 5578 -2235 5007 5121 -2235 5504 5508 -2238 5168 5287 -2244 5578 5580 -2247 5165 5283 -2247 5168 5289 -2253 4906 4913 -2253 5464 5465 -2254 5273 5391 -2255 4438 4543 -2268 4995 5000 -2273 4990 4991 -2273 5268 5383 -2276 4875 4877 -2280 5003 5113 -2285 5162 5281 -2295 5160 5278 -2297 5173 5180 -2212 6445 6448 -2220 6209 6210 -2226 6080 6082 -2231 6582 6686 -2232 6448 6560 -2232 6568 6571 -2248 5705 5825 -2248 6562 6671 -2261 6580 6582 -2262 6688 6691 -2263 6205 6206 -2265 6575 6576 -2273 6676 6679 -2276 6574 6682 -2277 6557 6559 -2284 5730 5731 -2285 6562 6567 -2286 6582 6694 -2289 6202 6203 -2295 6325 6330 -2296 6451 6565 -2302 1075 1078 -2304 324 327 -2305 859 867 -2307 1092 1207 -2309 1210 1212 -2310 975 1085 -2312 1072 1075 -2317 752 859 -2325 746 751 -2326 1072 1189 -2328 330 418 -2331 1072 1078 -2336 1326 1444 -2340 1576 1688 -2346 757 867 -2348 325 326 -2354 1658 1665 -2355 864 867 -2355 1087 1089 -2356 421 424 -2359 326 410 -2360 1067 1074 -2363 247 325 -2365 756 856 -2371 418 420 -2385 416 417 -2386 420 421 -2396 864 866 -2397 521 522 -2398 975 1079 -2301 3570 3572 -2303 2733 2740 -2303 2814 2821 -2306 2810 2816 -2307 2904 2911 -2315 2261 2266 -2315 2382 2388 -2315 2824 2922 -2325 2922 2930 -2328 2816 2918 -2336 2256 2257 -2340 2804 2912 -2343 3606 3613 -2344 2494 2497 -2352 2147 2150 -2353 2929 3024 -2359 2918 2921 -2373 1942 1948 -2375 2366 2372 -2379 2383 2389 -2383 2264 2265 -2383 2700 2808 -2385 2494 2495 -2389 1942 1947 -2392 1942 1946 -2392 2273 2386 -2395 2267 2272 -2396 2918 2920 -2397 3500 3505 -2398 1948 2064 -2400 2703 2709 -2304 4764 4881 -2304 5167 5174 -2307 5141 5260 -2311 5172 5289 -2323 5170 5171 -2335 5608 5609 -2340 5001 5116 -2346 5287 5288 -2362 5118 5236 -2364 5172 5295 -2365 5372 5485 -2371 5463 5465 -2383 5458 5465 -2384 5276 5277 -2385 5054 5171 -2392 5154 5271 -2395 5290 5297 -2397 4790 4796 -2399 5459 5465 -2304 6329 6443 -2306 6204 6319 -2309 6680 6681 -2319 6204 6321 -2322 6567 6671 -2328 6447 6448 -2335 5608 5609 -2337 7478 7479 -2339 6676 6784 -2344 6332 6440 -2349 6443 6445 -2350 6675 6776 -2351 6448 6450 -2351 6568 6682 -2354 2057 5830 -2361 6570 6574 -2373 7289 7361 -2376 6447 6560 -2378 6444 6557 -2379 6322 6327 -2380 6580 6688 -2390 6077 6082 -2393 6449 6563 -2393 6673 6676 -2396 6680 6685 -2400 6206 6210 -2404 1334 1336 -2410 862 863 -2424 427 520 -2453 421 514 -2456 527 528 -2457 324 412 -2459 861 862 -2464 1181 1188 -2477 749 750 -2488 1183 1186 -2493 326 330 -2497 748 749 -2497 753 754 -2497 1205 1206 -2407 2257 2366 -2408 3430 3500 -2413 3505 3568 -2421 2909 3014 -2422 2496 2608 -2423 2383 2500 -2423 3484 3546 -2439 2468 2475 -2444 3599 3600 -2449 3341 3343 -2451 1954 2064 -2452 2703 2710 -2457 1831 1946 -2464 2711 2712 -2479 3478 3546 -2482 2263 2267 -2483 3702 7498 -2485 2708 2713 -2494 2711 2713 -2413 5272 5279 -2418 5175 5295 -2426 5578 5583 -2434 4684 4795 -2434 5175 5178 -2435 5155 5161 -2435 5272 5274 -2437 5334 5452 -2444 5141 5259 -2451 5452 5459 -2460 4794 4799 -2467 5164 5171 -2469 5451 5452 -2480 5453 5566 -2482 5290 5291 -2482 5605 5613 -2494 4905 4906 -2496 4906 4912 -2499 5127 5129 -2500 5049 5169 -2403 6450 6565 -2408 6674 6680 -2412 6082 6083 -2412 6554 6560 -2434 6329 6445 -2434 6679 6784 -2439 6573 6677 -2444 7144 7230 -2445 6561 6665 -2449 7252 7253 -2451 5833 5956 -2452 6557 6565 -2455 6206 6322 -2461 5592 5711 -2461 7144 7145 -2462 6450 6557 -2463 6668 6675 -2467 6680 6682 -2468 6562 6568 -2468 7221 7222 -2477 7379 7380 -2478 7204 7282 -2478 7416 7472 -2479 7253 7325 -2480 6640 6642 -2482 5605 5613 -2482 6668 6676 -2496 7434 7490 -2502 523 526 -2504 1182 1295 -2512 331 332 -2513 979 984 -2519 648 651 -2535 1199 1205 -2543 425 426 -2544 432 521 -2546 1235 4874 -2556 1074 1187 -2560 864 976 -2562 507 601 -2563 426 520 -2565 427 523 -2568 1079 1084 -2569 644 740 -2573 424 426 -2578 1379 1380 -2582 1092 1096 -2587 751 756 -2594 1573 1574 -2600 648 754 -2513 3702 3703 -2518 2383 2495 -2522 2599 2710 -2527 2808 2810 -2531 2812 2916 -2544 3506 3570 -2551 2703 2811 -2573 2603 2712 -2585 3701 3702 -2587 3504 3511 -2598 2606 2608 -2505 5452 5457 -2510 5583 5586 -2512 5447 5560 -2522 4544 4653 -2524 5446 5447 -2526 5292 5295 -2528 4789 4797 -2542 5243 5361 -2546 1235 4874 -2551 5019 5139 -2555 5119 5126 -2561 5290 5292 -2565 4684 4688 -2567 5008 5014 -2567 5446 5448 -2569 4903 4904 -2572 5440 5447 -2583 5459 5460 -2589 5446 5453 -2590 4647 4654 -2590 5289 5290 -2594 5295 5296 -2597 5445 5447 -2501 5843 5845 -2505 6532 6642 -2508 7307 7379 -2513 5860 5863 -2513 6794 6795 -2515 6562 6676 -2515 7409 7410 -2516 6669 6776 -2517 7264 7265 -2524 6316 6317 -2539 5615 5735 -2539 6554 6561 -2548 6670 6673 -2550 7475 7477 -2556 6562 6668 -2568 5717 5724 -2568 6531 6642 -2568 6782 6783 -2569 7343 7344 -2571 7414 7416 -2572 6784 6785 -2581 6776 6782 -2581 7479 7480 -2585 6321 6324 -2591 6559 6561 -2592 7345 7414 -2592 7480 7526 -2594 5855 5860 -2598 6199 6204 -2607 1289 1296 -2609 601 602 -2616 417 421 -2619 1072 1077 -2621 245 327 -2627 1730 1731 -2628 1180 1186 -2629 512 513 -2629 534 628 -2631 330 333 -2632 1183 1297 -2633 1180 1297 -2641 529 627 -2643 1077 1184 -2644 746 754 -2644 1485 1602 -2647 1731 1842 -2650 547 651 -2658 326 327 -2661 653 755 -2668 1183 1184 -2668 1291 1294 -2669 1290 1406 -2686 653 749 -2695 1731 1848 -2607 2611 2715 -2612 2386 2500 -2612 3437 3509 -2615 3600 3607 -2619 2822 2825 -2628 2497 2604 -2630 2905 3006 -2631 3257 3340 -2635 2614 2723 -2640 3540 3547 -2647 1731 1842 -2653 2822 2827 -2654 2391 2395 -2667 2492 2500 -2668 3567 3570 -2683 2815 2919 -2695 1731 1848 -2615 5460 5575 -2617 5328 5451 -2620 5440 5441 -2631 4103 4110 -2631 5281 5287 -2631 5333 5451 -2634 4462 4567 -2638 4794 4797 -2643 5018 5019 -2658 5440 5442 -2661 5434 5435 -2662 5442 5445 -2665 5260 5267 -2666 5008 5013 -2666 5330 5451 -2669 5233 5241 -2678 5459 5572 -2678 5465 5583 -2679 4902 5016 -2679 5270 5389 -2679 5292 5297 -2682 5328 5445 -2684 5147 5267 -2685 5337 5339 -2687 4682 4797 -2687 5322 5445 -2687 5327 5445 -2688 5122 5127 -2690 5460 5577 -2692 5164 5170 -2694 5324 5445 -2698 5294 5407 -2609 6787 6895 -2618 7436 7437 -2625 7320 7391 -2640 7371 7436 -2643 7435 7437 -2646 6788 6789 -2647 6782 6784 -2654 6890 6897 -2659 6330 6332 -2663 7375 7443 -2665 6781 6889 -2666 6684 6790 -2672 6638 6640 -2674 7409 7414 -2676 6082 6085 -2678 7416 7478 -2692 6638 6642 -2705 645 651 -2710 553 652 -2712 332 416 -2713 1731 1847 -2717 1072 1184 -2722 93 157 -2726 1400 1407 -2731 645 648 -2740 896 1004 -2740 1400 1401 -2744 421 512 -2744 753 757 -2745 546 646 -2748 328 330 -2748 336 424 -2749 553 657 -2750 1290 1296 -2754 422 423 -2755 634 635 -2756 112 113 -2756 429 518 -2762 325 328 -2763 1730 1737 -2767 528 622 -2769 1205 1207 -2770 113 179 -2770 1088 1089 -2771 864 869 -2775 552 651 -2775 1081 1083 -2776 1092 1093 -2786 330 336 -2787 553 649 -2791 111 181 -2791 1078 1083 -2792 1208 1213 -2798 1076 1077 -2800 1288 1408 -2703 2721 2722 -2712 2497 2607 -2714 1916 1918 -2723 2152 2153 -2737 2372 2377 -2744 2052 2057 -2750 2912 2915 -2752 3501 3508 -2793 2495 2502 -2702 5135 5254 -2708 4904 5020 -2716 4683 4690 -2717 5454 5457 -2719 5440 5445 -2728 5251 5259 -2732 5578 5579 -2737 5320 5321 -2739 4891 4898 -2742 5339 5452 -2745 5435 5554 -2748 5137 5138 -2749 5298 5415 -2755 5054 5170 -2756 4685 4688 -2756 4794 4796 -2757 4684 4796 -2759 4684 4797 -2778 5466 5583 -2779 5052 5169 -2783 5460 5462 -2786 4573 4580 -2786 5454 5456 -2787 5300 5413 -2790 5257 5258 -2796 5052 5055 -2797 4903 4910 -2798 5454 5572 -2704 6678 6785 -2707 6206 6324 -2725 7411 7414 -2731 7337 7339 -2733 6684 6785 -2747 6770 6777 -2761 6570 6674 -2763 6784 6787 -2770 6677 6678 -2770 6667 6778 -2771 6085 6202 -2776 5843 5848 -2777 7344 7414 -2788 6691 6694 -2793 7343 7350 -2799 6562 6565 -2806 1189 1192 -2810 111 113 -2810 528 629 -2818 433 526 -2820 250 328 -2821 553 555 -2822 111 114 -2825 1075 1077 -2834 1078 1081 -2841 113 187 -2854 1718 1720 -2858 642 740 -2861 556 559 -2869 640 641 -2872 554 556 -2873 1484 1491 -2874 555 556 -2874 1182 1186 -2890 556 657 -2894 463 554 -2813 2146 2150 -2855 2810 2913 -2869 2257 2374 -2898 2814 2816 -2809 5251 5256 -2809 5583 5584 -2813 5263 5268 -2818 5320 5322 -2826 5294 5415 -2828 4898 5016 -2828 5297 5410 -2837 5275 5282 -2841 5457 5460 -2846 5448 5451 -2846 5460 5465 -2848 5315 5434 -2852 5454 5571 -2852 5582 5583 -2855 4677 4683 -2864 5294 5413 -2871 5171 5290 -2875 4574 4683 -2883 5386 5391 -2884 5243 5244 -2890 5462 5583 -2801 6332 6445 -2812 7339 7342 -2814 6685 6688 -2815 7480 7485 -2832 6692 6693 -2832 6882 6976 -2836 7259 7337 -2842 6982 6983 -2844 6562 6564 -2849 5681 5801 -2849 7406 7414 -2851 6556 6561 -2866 6786 6890 -2866 7265 7266 -2868 7480 7483 -2875 6686 6688 -2876 6670 6778 -2877 7263 7265 -2889 7265 7343 -2891 6881 6889 -2893 7417 7477 -2899 7260 7265 -2901 638 734 -2904 1289 1294 -2910 1183 1185 -2911 1288 1405 -2917 463 562 -2918 1397 1402 -2919 1188 1189 -2926 1212 1213 -2927 1073 1078 -2929 647 743 -2934 1485 1600 -2937 462 557 -2937 1400 1405 -2938 157 164 -2941 1282 1402 -2943 1187 1194 -2953 1205 1210 -2968 642 648 -2969 1399 1402 -2984 1184 1186 -2988 648 748 -2990 1278 1394 -2994 1596 1712 -2994 1718 1725 -2919 2361 2476 -2922 1921 1922 -2927 2262 2263 -2938 2810 2912 -2979 2255 2366 -2985 2809 2913 -2901 4578 4691 -2905 4474 4579 -2905 5277 5278 -2907 5259 5261 -2917 5161 5166 -2921 5419 5420 -2924 5460 5583 -2936 5454 5460 -2938 5560 5567 -2944 4474 4478 -2948 5436 5439 -2950 5273 5386 -2958 5434 5439 -2959 5554 5555 -2963 5436 5554 -2965 5326 5446 -2970 5436 5553 -2973 5333 5446 -2974 5438 5439 -2980 5436 5438 -2982 5428 5435 -2989 5265 5267 -2989 5435 5548 -2993 5431 5436 -2999 5431 5439 -2909 6570 6681 -2909 6772 6775 -2909 6776 6783 -2909 7180 7258 -2922 6783 6889 -2922 7262 7265 -2928 7258 7263 -2934 6675 6784 -2943 7265 7342 -2953 6204 6206 -2954 6665 6672 -2961 6883 6886 -2964 6673 6675 -2973 7260 7336 -2975 6558 6562 -2978 6668 6673 -2981 7256 7260 -2984 6880 6886 -2989 6786 6884 -2990 5957 5962 -2993 5954 5962 -3002 1181 1186 -3005 1290 1408 -3029 1403 1404 -3030 981 1093 -3030 1182 1297 -3034 157 162 -3036 642 647 -3062 981 985 -3063 1085 1092 -3067 756 863 -3067 1723 1725 -3075 1078 1195 -3077 1597 1712 -3080 645 646 -3090 467 468 -3096 469 568 -3006 2909 3009 -3009 2806 2912 -3029 2153 2155 -3039 1800 1919 -3064 2812 2813 -3065 2914 3015 -3006 5298 5413 -3010 5318 5438 -3016 4904 5022 -3020 5452 5453 -3021 5441 5447 -3027 4904 4908 -3031 5321 5322 -3033 5130 5247 -3033 5296 5297 -3034 5241 5244 -3037 5169 5171 -3038 5431 5438 -3048 5453 5454 -3056 5327 5440 -3069 5419 5426 -3073 5166 5168 -3083 5418 5421 -3085 5256 5259 -3085 5419 5424 -3093 5306 5425 -3001 7079 7080 -3026 7339 7414 -3037 6667 6670 -3047 7083 7089 -3053 7422 7478 -3057 6764 6771 -3072 6662 6670 -3073 6881 6883 -3078 7476 7480 -3082 6886 6984 -3084 6085 6088 -3089 6982 6984 -3089 7480 7525 -3091 6884 6886 -3092 6878 6883 -3093 6667 6669 -3099 6777 6883 -3100 5839 5842 -3133 469 563 -3135 560 562 -3139 1607 1614 -3152 464 471 -3152 465 560 -3156 1723 1726 -3157 1597 1717 -3164 1080 1193 -3166 471 560 -3171 472 568 -3174 465 471 -3190 1292 1299 -3103 2709 2710 -3121 2793 2898 -3132 2904 2905 -3149 3000 3007 -3176 2804 2906 -3106 5287 5292 -3106 5421 5423 -3127 4904 4905 -3135 5421 5424 -3137 5304 5424 -3146 5420 5421 -3157 5156 5162 -3157 5295 5297 -3167 5427 5428 -3101 6780 6878 -3107 6775 6878 -3107 6882 6883 -3110 6663 6770 -3113 6878 6880 -3114 6884 6891 -3116 6775 6875 -3119 6875 6878 -3124 6987 7081 -3126 6671 6672 -3126 6880 6883 -3128 6780 6883 -3147 6877 6878 -3149 7480 7527 -3152 7477 7480 -3156 6678 6679 -3191 6986 7082 -3197 6885 6886 -3203 1289 1297 -3205 1180 1185 -3215 552 646 -3215 642 742 -3246 553 651 -3246 631 632 -3249 1290 1294 -3255 636 639 -3264 1404 1405 -3280 756 861 -3284 1520 1521 -3218 2055 2057 -3280 2034 2036 -3220 5419 5425 -3222 5310 5425 -3224 5318 5437 -3236 5266 5267 -3251 5377 5378 -3253 5304 5427 -3254 5276 5280 -3265 5431 5432 -3274 5432 5433 -3285 5312 5425 -3290 5309 5427 -3297 5298 5416 -3298 5160 5162 -3248 6981 6987 -3257 6560 6561 -3273 5837 5844 -3285 6785 6786 -3300 6769 6869 -3303 464 472 -3318 463 557 -3318 636 638 -3318 1083 1196 -3322 380 464 -3338 638 742 -3341 966 1070 -3347 1402 1404 -3366 1077 1190 -3377 469 475 -3377 1640 1647 -3380 1284 1394 -3395 1402 1519 -3397 961 1069 -3302 5592 5594 -3301 5416 5421 -3310 5271 5273 -3314 5306 5427 -3314 5428 5429 -3321 5303 5422 -3324 5310 5427 -3327 5303 5416 -3350 5310 5433 -3358 5174 5287 -3364 5312 5433 -3369 5171 5172 -3302 5592 5594 -3304 6671 6676 -3305 6976 6984 -3309 6983 6987 -3311 6882 6982 -3319 6869 6877 -3335 6769 6877 -3347 7170 7171 -3366 6987 7079 -3367 7080 7084 -3376 6881 6888 -3387 6874 6877 -3389 7080 7170 -3392 6890 6891 -3397 7172 7174 -3402 647 748 -3410 373 374 -3415 1069 1075 -3430 373 375 -3438 647 750 -3441 1399 1519 -3456 1388 1395 -3463 633 639 -3467 1277 1278 -3469 1282 1285 -3471 465 554 -3471 642 645 -3475 961 1072 -3480 535 633 -3482 1168 1279 -3419 2362 2363 -3430 5304 5422 -3456 5421 5422 -3457 5437 5438 -3409 6783 6887 -3434 7255 7256 -3454 7262 7334 -3459 6787 6790 -3459 6984 6986 -3490 6559 6562 -3496 6783 6787 -3501 1164 1271 -3518 1173 1280 -3523 1286 1287 -3527 957 1061 -3532 540 634 -3537 749 754 -3546 1291 1293 -3565 1180 1292 -3569 958 1069 -3589 955 958 -3592 531 625 -3502 2005 2115 -3507 5258 5259 -3529 5316 5439 -3562 5318 5439 -3581 5275 5276 -3597 5293 5294 -3505 6787 6789 -3511 6884 6889 -3524 5622 5624 -3541 7169 7172 -3549 5593 5594 -3561 6983 7079 -3571 6985 6986 -3598 7076 7083 -3604 1280 1286 -3608 533 634 -3639 533 534 -3655 1288 1402 -3658 1162 1271 -3665 1388 1393 -3677 642 743 -3681 1265 1382 -3685 1167 1279 -3625 5462 5575 -3634 5316 5433 -3637 5204 5323 -3646 5508 5510 -3652 5324 5443 -3697 5503 5508 -3674 5839 5844 -3711 529 532 -3718 1167 1274 -3720 1162 1273 -3728 1277 1282 -3730 950 951 -3752 1157 1158 -3759 1067 1069 -3766 527 529 -3795 641 737 -3703 5596 5598 -3714 6581 6582 -3812 1044 1151 -3816 642 748 -3840 1293 1409 -3843 643 648 -3873 1186 1189 -3878 1230 1337 -3830 5593 5600 -3812 5271 5277 -3840 5304 5421 -3827 5598 5600 -3830 5593 5600 -3903 1403 1408 -3910 957 1067 -3918 978 1082 -3960 646 651 -3965 1283 1284 -3968 958 961 -3978 646 647 -3909 5303 5421 -3967 5154 5272 -3974 5459 5578 -3981 5309 5422 -3995 5275 5280 -3979 7252 7259 -4028 1463 1468 -4040 1260 1370 -4064 1071 1072 -4070 1184 1190 -4057 2922 2923 -4038 5321 5440 -4013 7337 7344 -4023 7344 7409 -4041 5968 5970 -4047 7342 7344 -4061 7344 7415 -4129 944 945 -4131 851 958 -4154 1250 1251 -4169 1143 1250 -4171 918 1022 -4186 1138 1250 -4191 1244 1250 -4197 1072 1074 -4122 2614 2718 -4144 1818 1822 -4171 5596 5603 -4114 5434 5441 -4122 5172 5287 -4173 5434 5436 -4178 5453 5572 -4110 7174 7252 -4112 7260 7342 -4171 5596 5603 -4183 7257 7260 -4222 1250 1255 -4280 1229 1237 -4294 1233 1340 -4299 1344 1460 -4218 2139 2140 -4244 2140 2250 -4255 2010 2011 -4202 5171 5289 -4209 5572 5577 -4221 5448 5566 -4242 5178 5295 -4254 5415 5417 -4262 5297 5298 -4280 5417 5418 -4289 5177 5295 -4292 5445 5446 -4211 7413 7477 -4216 7416 7477 -4239 6328 6335 -4245 7409 7416 -4263 7411 7416 -4269 7472 7477 -4272 7417 7475 -4296 7483 7485 -4307 1003 1109 -4317 1149 1256 -4325 1265 1266 -4329 1256 1257 -4336 1137 1244 -4347 999 1109 -4359 1189 1190 -4360 1116 1120 -4365 1228 1339 -4393 1265 1273 -4349 2055 5591 -4377 6078 6079 -4386 2822 2922 -4376 5425 5433 -4381 5442 5447 -4392 5430 5433 -4301 7417 7422 -4304 7416 7417 -4343 7260 7263 -4356 6787 6887 -4367 6578 6689 -4377 6078 6079 -4385 7341 7406 -4425 1224 1230 -4431 1265 1270 -4484 2138 2253 -4427 5439 5442 -4433 5298 5421 -4444 4878 4880 -4449 5433 5553 -4455 4877 4878 -4457 4878 4990 -4464 4880 4883 -4473 4880 4881 -4499 5444 5557 -4452 7413 7469 -4566 1035 1142 -4547 5450 5563 -4614 1136 1137 -4666 1023 1130 -4623 2920 3021 -4626 1887 1888 -4655 1818 1935 -4656 2137 2247 -4665 1770 1881 -4626 5428 5430 -4666 5439 5559 -4703 2808 2815 -4729 1894 2004 -4731 2135 2137 -4750 1897 2007 -4775 1891 2001 -4701 5444 5448 -4731 5456 5569 -4752 5448 5453 -4758 5454 5569 -4733 7082 7089 -4736 6676 6678 -4819 2397 2504 -4822 1886 1891 -4844 2013 2014 -4854 1891 2006 -4825 5444 5563 -4895 5450 5569 -4819 6985 6992 -4957 1532 1533 -4959 1579 1580 -4991 1469 1470 -5003 461 468 -5019 524 525 -5019 1082 1087 -5042 955 960 -5008 5615 5729 -5041 7349 7350 -5046 7258 7265 -5112 960 1064 -5115 846 952 -5145 650 753 -5180 1284 1400 -5183 1398 1514 -5188 973 975 -5197 851 953 -5127 1799 1805 -5167 1937 1940 -5223 518 524 -5226 836 938 -5228 646 648 -5265 1515 1631 -5272 862 864 -5290 421 426 -5257 3001 3098 -5231 6991 6998 -5319 537 631 -5320 1396 1399 -5321 1284 1285 -5336 524 529 -5340 543 643 -5342 530 531 -5360 644 748 -5392 975 976 -5372 5054 5164 -5392 5047 5054 -5401 524 526 -5403 419 424 -5410 429 526 -5410 974 981 -5425 1085 1093 -5431 638 740 -5470 648 653 -5490 973 978 -5447 5272 5277 -5427 6893 6894 -5453 6981 7081 -5523 631 636 -5582 524 531 -5583 427 518 -5503 5585 5698 -5555 4936 4937 -5566 4934 5050 -5573 5052 5053 -5586 5203 5210 -5504 6698 6699 -5563 6984 6987 -5602 631 638 -5607 423 512 -5627 427 432 -5644 427 521 -5646 427 526 -5646 4820 4933 -5673 4933 4934 -5697 5586 5701 -5704 529 531 -5733 416 512 -5740 1920 1921 -5716 4934 4938 -5764 5096 5212 -5772 5212 5219 -5776 5089 5096 -5789 5094 5096 -5800 5212 5214 -5850 535 538 -5853 526 527 -5859 1799 1804 -5802 5091 5096 -5814 5096 5102 -5816 5049 5054 -5862 5101 5106 -5865 5206 5213 -5887 6878 6885 -5901 431 432 -5932 633 634 -5970 341 432 -5992 529 534 -5932 5102 5218 -5966 5103 5223 -6089 2051 2166 -6092 5217 5220 -6574 418 419 -6597 4707 4714 -6640 334 335 -6664 4701 4708 -6773 4713 4720 -6791 4477 4582 -6753 5984 5991 -6773 5991 6110 -6845 534 635 -6812 4689 4696 -6824 4576 4583 -6828 4476 4483 -6854 4586 4695 -6953 6882 6886 -7017 522 616 -7051 2397 2401 -7009 7262 7340 -7033 5865 5866 -7050 6984 6985 -7092 5608 5615 -7114 1282 1399 -7170 5852 5860 -7249 426 427 -7296 979 1087 -7247 5864 5871 -7399 2401 2406 -7387 5048 5054 -7448 1406 1407 -7427 2400 2406 -7443 2406 2518 -7442 4938 5052 -7496 4823 4930 +599 1817 5468 +600 1808 1815 +554 1938 5471 +548 5471 5591 +554 1938 5471 +571 5471 5590 +572 5471 5589 +599 1817 5468 +548 5471 5591 +571 5471 5590 +572 5471 5589 +608 1814 1815 +616 1815 1926 +622 5231 5350 +622 1818 1935 +635 1818 1929 +638 5468 5469 +648 1806 1923 +648 1818 1937 +649 1811 1812 +650 1822 5468 +650 1822 1935 +652 5469 5472 +655 1822 5589 +660 1812 1813 +662 1816 1929 +666 1810 1923 +672 1935 1937 +676 1810 1812 +676 1822 1938 +677 1806 1917 +677 1822 1937 +679 1812 1816 +683 1819 1937 +683 1816 1931 +684 1816 1937 +686 1810 1931 +695 1583 1584 +699 1821 1822 +700 1812 1929 +616 1815 1926 +635 1818 1929 +648 1806 1923 +650 1822 1935 +660 1923 1930 +662 1816 1929 +666 1810 1923 +671 1935 1936 +672 1935 1937 +676 1822 1938 +677 1806 1917 +683 1816 1931 +686 1810 1931 +687 2052 5709 +692 1923 2040 +692 2169 5709 +694 2052 5588 +696 1936 1940 +700 1812 1929 +605 5477 5596 +610 5467 5468 +611 5237 5350 +622 5231 5350 +628 5467 5474 +629 5473 5474 +635 5467 5472 +637 5473 5480 +638 5468 5469 +640 5474 5475 +646 5354 5467 +647 5467 5475 +650 1822 5468 +652 5347 5354 +652 5469 5472 +653 5479 5480 +658 5473 5478 +661 5472 5475 +661 5474 5478 +663 5480 5481 +665 5358 5478 +668 5227 5234 +669 5480 5593 +670 5347 5355 +671 5234 5347 +672 5479 5486 +674 5352 5354 +674 5475 5478 +677 5471 5472 +678 5478 5593 +679 5478 5481 +681 5352 5355 +682 5352 5475 +682 5468 5471 +687 5352 5357 +687 5486 5599 +689 5232 5234 +689 5481 5601 +690 5476 5478 +691 5480 5484 +693 5484 5599 +694 5471 5477 +700 5479 5484 +655 1822 5589 +669 5480 5593 +678 5478 5593 +687 5486 5599 +687 2052 5709 +692 2169 5709 +693 5484 5599 +693 5594 5600 +694 2052 5588 +695 5600 5714 +699 5828 5829 +700 5951 5958 +704 1806 1925 +706 1810 1925 +711 1816 1932 +711 1937 1940 +712 1800 1917 +716 1926 1931 +720 1457 1464 +721 1804 1917 +722 5469 5470 +722 1803 1920 +728 1820 5471 +729 1802 1809 +730 1925 1928 +734 1353 1469 +735 1923 1925 +737 5230 5231 +738 1804 1925 +739 1810 1926 +739 1816 1821 +740 1911 1918 +743 1822 5471 +745 1821 1937 +746 1458 1574 +755 1586 5231 +756 1469 4994 +756 1463 1470 +756 1467 1577 +756 1815 1931 +757 1804 1919 +758 1683 1793 +758 1800 1919 +760 1809 1810 +762 1692 1808 +763 5469 5471 +763 1932 1937 +765 1808 1810 +766 1914 1915 +769 1804 1806 +769 1821 1938 +771 1806 1809 +774 1926 1933 +776 1459 1574 +776 1568 1575 +776 1573 1574 +779 4994 5110 +779 5111 5229 +779 5229 5230 +781 1804 1807 +783 1797 1908 +783 1800 1806 +784 5112 5229 +787 1799 1804 +788 1799 1805 +789 1464 1580 +789 1802 1807 +795 1807 1810 +800 1674 1790 +800 1790 1797 +703 2057 5709 +704 5952 6071 +711 1816 1932 +711 1937 1940 +711 2052 5710 +712 1800 1917 +716 1926 1931 +717 2169 5829 +719 2277 2278 +721 1804 1917 +722 1803 1920 +724 2037 2038 +727 1940 2052 +730 1925 1928 +730 1940 2054 +731 1928 1930 +734 2169 5830 +735 1923 1925 +736 1928 1931 +736 1924 2040 +736 2044 2154 +736 2057 5710 +740 1911 1918 +745 1928 1934 +746 1923 1928 +746 1923 1931 +748 1921 2031 +749 1939 1940 +750 2170 2286 +751 1928 2048 +754 1928 2040 +755 1931 1933 +756 1917 1919 +756 1815 1931 +757 1804 1919 +758 1800 1919 +758 1933 2043 +759 1930 2040 +761 2057 5830 +762 1921 2038 +762 2283 2284 +763 1932 1937 +764 2287 2402 +766 1914 1915 +766 2040 2047 +769 1821 1938 +771 2161 2271 +774 1926 1933 +774 2406 2513 +778 2040 2042 +782 1930 1931 +784 2174 5829 +785 1912 2028 +788 2043 2048 +788 2041 2157 +790 1923 1924 +793 1940 2055 +795 2038 2039 +796 2174 5830 +799 1931 1934 +799 1937 1938 +799 2286 2287 +702 5114 5233 +702 5484 5601 +703 5470 5472 +704 5116 5117 +704 5255 5368 +707 5352 5470 +707 5495 5608 +710 5232 5237 +711 5232 5355 +713 5483 5602 +714 5478 5483 +716 5476 5477 +717 5232 5235 +718 5470 5471 +720 5227 5235 +721 5230 5232 +721 5599 5607 +722 5469 5470 +722 5482 5483 +725 5364 5484 +726 5123 5236 +728 1820 5471 +729 5366 5485 +729 5483 5601 +734 5350 5355 +737 5230 5231 +737 5350 5357 +739 5234 5235 +741 5374 5375 +742 5488 5495 +743 1822 5471 +745 5481 5484 +746 5114 5227 +749 5500 5501 +749 5606 5607 +751 5486 5605 +751 5604 5607 +751 5614 5615 +753 5479 5487 +760 5601 5602 +762 5113 5120 +763 5000 5110 +763 5469 5471 +763 5492 5605 +765 5108 5114 +767 5112 5227 +771 5472 5477 +773 5476 5596 +775 5381 5494 +778 5486 5487 +779 4994 5110 +779 5111 5229 +779 5229 5230 +779 5375 5488 +779 5470 5477 +781 5107 5108 +783 5116 5118 +784 5112 5229 +784 5242 5243 +784 5602 5604 +787 5368 5369 +787 5475 5477 +789 5233 5235 +791 5129 5242 +791 5602 5603 +792 5248 5249 +794 5485 5486 +795 5477 5478 +702 5484 5601 +703 2057 5709 +704 5952 6071 +708 5957 5964 +709 5593 5600 +711 2052 5710 +717 2169 5829 +718 5709 5829 +720 5736 5855 +721 5593 5601 +721 5599 5607 +722 5720 5721 +729 5483 5601 +730 5598 5600 +730 5828 5830 +733 5735 5742 +733 5709 5830 +733 5958 6077 +734 2169 5830 +736 2057 5710 +738 5714 5722 +740 5598 5601 +747 5605 5606 +749 5606 5607 +751 5486 5605 +751 5604 5607 +751 5614 5615 +751 5849 5856 +757 5841 5954 +759 5621 5741 +760 5601 5602 +761 5721 5722 +761 2057 5830 +761 5828 5833 +763 5492 5605 +769 5835 5948 +772 5721 5725 +776 5615 5735 +784 5602 5604 +784 2174 5829 +785 5833 5835 +786 5969 5976 +790 5726 5727 +791 5602 5603 +795 5831 5951 +796 2174 5830 +798 5605 5726 +799 5960 5961 +801 1568 1685 +801 1586 5229 +802 1463 1465 +802 1799 1800 +803 4991 5107 +803 1673 1680 +803 1685 1692 +803 5108 5112 +804 1799 1806 +804 1806 1807 +804 1911 1916 +805 1799 1802 +807 1807 1809 +808 1573 1575 +808 1586 1588 +808 5350 5351 +808 5351 5352 +810 1354 1469 +813 4994 5109 +813 1353 1468 +816 1580 1587 +816 1819 1821 +818 5351 5470 +819 1685 1690 +820 1689 1799 +821 1463 1468 +821 1911 1912 +823 1464 1574 +823 1575 1685 +823 1689 1806 +824 1471 5229 +824 1685 1687 +824 1799 1801 +825 1570 1575 +827 1583 1586 +827 1676 1677 +831 1463 1464 +833 1683 1801 +835 1805 1806 +836 5108 5109 +841 1586 1587 +841 1687 1807 +842 1686 1687 +843 1686 1802 +845 1681 1793 +847 1676 1681 +848 1471 5108 +849 1570 1690 +849 1687 1689 +849 1692 1802 +850 1684 1690 +851 1808 1809 +852 1676 1678 +853 1348 1465 +853 1464 1465 +854 1462 1464 +854 1464 1579 +854 1471 1583 +856 1348 1468 +857 1684 1687 +857 1687 1801 +857 1687 1799 +858 1570 1576 +859 1806 1810 +860 1585 5229 +860 1585 1588 +864 1462 1465 +865 1354 5109 +868 1681 1683 +870 1459 1576 +871 1573 1576 +872 1354 1468 +872 1683 1799 +873 1686 1801 +876 1585 1587 +877 1459 1579 +879 1687 1802 +882 1683 1686 +885 1584 1585 +885 1681 1801 +886 1466 5108 +886 1583 1585 +893 4995 5109 +896 1459 1464 +900 1354 1466 +900 1682 1684 +801 2045 2047 +802 2041 2158 +802 2396 2403 +803 1929 1931 +803 2039 2154 +804 1911 1916 +805 2045 2048 +805 2154 2159 +808 2040 2048 +812 1918 1919 +812 2045 2051 +812 2045 2157 +814 2040 2045 +814 2154 2161 +817 1928 1933 +818 1932 1938 +819 1932 1934 +819 2047 2050 +821 1911 1912 +821 2045 2165 +821 2156 2161 +822 2048 2050 +823 2286 5829 +825 2055 5710 +825 2047 2157 +828 2036 2038 +829 2156 2159 +829 2172 5830 +831 2161 2276 +831 2274 2281 +838 2167 2277 +839 1931 1932 +839 2022 2029 +841 1938 1939 +842 2159 2161 +842 2164 2280 +844 2276 2277 +848 2039 2153 +849 6191 6307 +852 2049 2050 +855 2050 2051 +856 2047 2165 +859 2161 2162 +861 5710 5712 +861 2157 2164 +863 5830 5832 +868 2162 2276 +869 2050 2165 +873 2631 6191 +874 5831 5832 +875 2276 2282 +876 2031 2036 +876 2290 2399 +879 2044 2161 +879 5712 5830 +881 2163 2165 +881 2161 2277 +884 2051 2165 +884 2507 2508 +885 2055 5591 +887 2051 2166 +889 2277 2279 +890 2160 2161 +890 2519 2520 +892 1933 1934 +896 2163 2164 +897 2393 2394 +897 2394 2501 +898 2282 2284 +898 2405 5952 +803 4991 5107 +803 5108 5112 +803 5118 5123 +803 5366 5487 +806 5477 5590 +808 5350 5351 +808 5351 5352 +812 5507 5620 +818 5351 5470 +822 5115 5116 +822 5122 5123 +822 5483 5596 +822 5484 5602 +824 5247 5248 +825 5365 5372 +825 5364 5487 +826 5129 5247 +829 5255 5373 +829 5364 5370 +832 5477 5595 +832 5483 5484 +832 5484 5486 +832 5611 5612 +834 5123 5241 +837 5124 5129 +840 5373 5374 +841 5000 5115 +842 5250 5255 +843 5130 5247 +843 5349 5350 +844 5122 5124 +846 5366 5370 +848 5248 5250 +848 5363 5483 +850 5249 5250 +853 5499 5500 +856 5365 5370 +859 5118 5121 +859 5235 5238 +859 5481 5482 +862 5124 5127 +865 5230 5237 +865 5256 5373 +865 5367 5370 +869 4995 5110 +869 5476 5483 +874 5350 5352 +875 5250 5256 +876 5374 5376 +877 5364 5482 +877 5376 5381 +879 5130 5250 +884 5250 5253 +884 5365 5373 +888 5001 5115 +891 5364 5369 +891 5381 5499 +891 5481 5483 +893 4995 5109 +894 4990 4997 +897 4997 5113 +898 5245 5250 +899 4995 5115 +900 5245 5247 +900 5371 5378 +803 5604 5609 +803 5970 6089 +805 5620 5627 +806 5477 5590 +810 5606 5610 +811 6196 6203 +812 5507 5620 +813 5612 5726 +815 6197 6313 +816 5856 5975 +816 6083 6090 +823 2286 5829 +825 2055 5710 +829 2172 5830 +832 5477 5595 +832 5611 5612 +832 5854 5855 +833 6084 6202 +833 6197 6307 +836 5971 5976 +837 5835 5955 +840 5971 6089 +840 6084 6090 +841 5732 5733 +843 5969 5974 +847 5737 5742 +847 5958 6071 +848 6075 6187 +849 6201 6202 +849 6085 6202 +849 6191 6307 +850 5727 5840 +852 5954 5955 +853 5855 5862 +855 5609 5723 +856 5610 5726 +858 6201 6203 +859 5740 5741 +861 5710 5712 +862 5604 5728 +862 5955 6074 +862 5955 5959 +863 5830 5832 +863 5954 5956 +864 5737 5855 +865 5955 5956 +865 5953 6071 +865 6088 6089 +866 5970 6088 +866 6083 6085 +866 6197 6312 +867 5835 5956 +867 5974 5976 +867 6083 6088 +868 5961 5967 +869 6085 6090 +871 5610 5728 +871 5954 5959 +872 5606 5728 +872 5740 5742 +872 5954 6074 +873 5857 5862 +873 6088 6090 +874 5831 5832 +877 5857 5975 +877 5948 5956 +877 6068 6075 +878 6074 6076 +879 5712 5830 +880 5974 5975 +881 5833 5836 +882 6192 6307 +883 5955 6076 +885 2055 5591 +888 5954 5957 +888 6201 6204 +891 6198 6203 +893 5961 6074 +894 5609 5728 +895 6198 6313 +897 5740 5743 +898 5830 5833 +898 5959 5961 +900 6068 6076 +901 1683 1684 +904 1570 1682 +906 1815 1816 +907 1677 1793 +913 1570 1572 +916 1571 1573 +918 1572 1573 +925 1467 1583 +928 1459 1571 +931 1582 1585 +937 1459 1461 +938 1810 1815 +942 1580 1582 +943 1566 1683 +944 1465 1582 +945 1560 1670 +949 1821 1932 +953 1461 1462 +958 1821 1939 +962 1577 1585 +965 1676 1683 +967 1566 1682 +968 1460 1465 +978 1460 1462 +979 1813 1815 +984 1348 1460 +986 1350 1468 +989 1565 1572 +994 1455 1571 +902 2165 2171 +904 2284 2285 +905 2277 2284 +907 2279 2282 +908 6191 6306 +910 2164 2165 +910 2285 2399 +912 1933 2048 +912 2400 2513 +914 2282 2398 +915 2163 2168 +916 2162 2164 +918 2033 2036 +920 2274 2276 +921 2401 2513 +923 2166 2171 +923 2164 2274 +925 1915 1916 +925 2274 2279 +926 2289 2290 +928 2056 2166 +929 1916 2031 +929 5712 5713 +929 2156 2158 +929 2158 2276 +931 2151 2156 +931 2279 2281 +932 2151 2158 +933 2030 2036 +935 2285 2398 +936 2162 2168 +936 2168 2170 +938 2165 2168 +940 2513 2518 +941 2399 2404 +949 1821 1932 +949 2274 2275 +949 2518 2520 +954 2056 2173 +957 2166 2168 +958 1821 1939 +958 5711 5712 +958 2274 2282 +959 2520 6191 +960 2399 2405 +961 2281 2398 +964 1932 1939 +964 1933 1939 +965 2170 2280 +967 2151 2153 +969 2168 2171 +969 2171 2173 +969 2512 2513 +970 2396 2398 +970 2521 2631 +971 1933 2049 +974 5712 5832 +974 2151 2152 +974 5832 5833 +977 2158 2268 +977 6192 6306 +985 2519 2521 +987 2289 5832 +990 2035 2153 +991 2281 2390 +995 5829 5833 +996 5712 5831 +997 2512 2514 +999 2172 2173 +904 5123 5242 +904 5252 5253 +904 5250 5252 +905 5245 5248 +906 5376 5379 +911 5245 5253 +912 5501 5502 +913 5245 5252 +913 5371 5372 +916 5121 5124 +917 5113 5121 +919 5118 5124 +920 5252 5256 +921 5130 5245 +922 5246 5250 +925 5367 5369 +926 5120 5121 +926 5245 5246 +926 5371 5374 +929 5123 5124 +935 5367 5368 +938 5363 5482 +939 5119 5124 +943 5132 5245 +944 5126 5130 +944 5256 5371 +945 5382 5499 +946 5363 5369 +948 5126 5247 +948 5502 5620 +953 5119 5239 +956 5117 5230 +956 5362 5368 +956 5499 5502 +957 5232 5350 +960 4995 5107 +961 5502 5619 +963 5001 5113 +963 5119 5120 +965 5118 5233 +965 5378 5381 +968 5371 5379 +971 5126 5127 +972 5116 5123 +974 5378 5379 +992 5125 5126 +902 5737 5860 +904 5728 5729 +905 5726 5734 +906 5971 6094 +907 5723 5730 +908 5732 5852 +911 5831 5833 +912 5728 5734 +912 5852 5855 +915 5829 5830 +916 5974 5977 +921 5742 5855 +923 5833 5838 +925 5833 5956 +926 5953 5956 +926 6198 6318 +927 5620 5625 +927 5723 5843 +927 5953 5955 +929 5712 5713 +929 5857 5980 +930 5728 5730 +930 5974 5980 +930 6088 6094 +932 6085 6207 +933 5733 5734 +933 5961 6082 +934 6088 6207 +934 6085 6091 +935 5953 6076 +936 5965 6088 +937 5728 5731 +939 5833 5951 +939 6073 6075 +939 6198 6312 +940 5956 6076 +944 6088 6091 +946 5726 5731 +946 5733 5737 +948 5502 5620 +949 5621 5622 +949 5831 5838 +950 5857 5860 +951 5724 5843 +951 6192 6312 +952 5727 5731 +952 5959 5962 +954 5852 5860 +955 6080 6081 +957 5718 5838 +957 5730 5736 +958 5711 5712 +959 5729 5730 +961 5502 5619 +964 5836 5838 +966 5739 5852 +966 5951 5953 +967 5855 5860 +967 6192 6309 +968 5620 5622 +970 5731 5846 +971 5958 6076 +974 5739 5860 +974 5832 5833 +974 5953 5958 +975 5724 5844 +975 5837 5838 +977 5725 5730 +977 6192 6306 +979 5737 5852 +980 5731 5733 +985 5730 5849 +986 5725 5843 +987 6199 6207 +987 2289 5832 +988 5837 5844 +989 5619 5625 +993 5843 5849 +993 6193 6194 +995 5730 5731 +995 5837 5839 +995 5829 5833 +996 5712 5831 +999 5619 5622 +1000 6199 6204 +1004 1460 1461 +1006 1465 1577 +1020 1580 1581 +1026 1574 1581 +1027 1454 1461 +1028 1344 1460 +1033 1579 1580 +1043 1574 1579 +1047 1461 1465 +1047 1465 1579 +1049 1350 1460 +1056 1350 1466 +1057 1681 1684 +1062 1799 1807 +1085 1343 1460 +1086 1574 1576 +1093 1466 4991 +1002 2401 2404 +1004 2170 2288 +1005 2507 2514 +1006 2404 2406 +1007 2172 5832 +1008 2173 2174 +1010 2033 2035 +1010 2405 2406 +1014 5950 5951 +1019 2521 6189 +1021 2521 6191 +1024 2035 2145 +1024 2510 2517 +1028 2396 2401 +1032 2028 2145 +1032 2515 2518 +1034 2162 2282 +1034 2512 2515 +1034 2518 2521 +1039 5829 5950 +1039 2510 2515 +1042 2028 2033 +1047 2167 2168 +1048 2401 2403 +1051 2507 2509 +1057 2509 2512 +1058 2028 2029 +1059 1916 2030 +1060 2401 2407 +1061 2396 2397 +1061 2506 2507 +1062 2174 2289 +1062 2406 2407 +1071 2504 2507 +1073 2517 2518 +1074 5832 5950 +1077 2507 2512 +1080 2274 2277 +1081 2028 2030 +1085 2511 2512 +1086 2403 2510 +1088 2394 2506 +1091 2395 2507 +1092 2162 2277 +1092 2516 2517 +1092 6190 6191 +1093 2166 2173 +1100 2516 2518 +1003 5003 5113 +1006 5252 5365 +1008 5118 5120 +1010 5119 5126 +1014 5251 5252 +1017 5378 5382 +1025 5258 5371 +1037 5126 5245 +1040 5377 5378 +1046 5362 5369 +1047 5498 5502 +1049 5118 5238 +1064 5235 5237 +1073 5382 5497 +1075 5118 5241 +1080 4997 5001 +1088 5497 5502 +1091 4995 4997 +1094 5497 5505 +1095 5236 5237 +1001 5730 5850 +1001 5848 5849 +1004 5730 5848 +1005 6087 6207 +1006 5729 5731 +1007 5739 5858 +1007 5835 5838 +1007 5972 5975 +1008 5622 5740 +1009 5731 5848 +1009 5739 5743 +1010 5727 5730 +1010 5731 5849 +1013 5733 5854 +1014 5950 5951 +1017 5725 5848 +1017 5846 5849 +1019 5731 5736 +1019 5848 5854 +1019 5973 6094 +1019 2521 6189 +1020 5842 5843 +1020 5973 5977 +1020 6087 6091 +1021 5731 5851 +1021 6086 6091 +1023 6086 6094 +1024 5852 5858 +1025 5725 5845 +1026 5849 5854 +1026 5849 5850 +1028 5852 5859 +1029 5736 5854 +1031 5731 5854 +1031 5842 5844 +1034 5849 5851 +1037 5730 5843 +1038 6200 6204 +1039 6198 6310 +1048 5836 5839 +1049 5731 5734 +1049 5842 5845 +1049 5733 5852 +1049 5972 5977 +1053 6068 6073 +1056 5736 5737 +1059 5736 5849 +1059 5737 5854 +1060 5839 5842 +1064 5610 5731 +1067 5727 5848 +1068 5729 5849 +1069 5857 5859 +1071 5841 5842 +1072 5972 5980 +1073 5834 5839 +1074 6200 6318 +1076 5859 5972 +1077 6199 6205 +1078 6194 6312 +1079 5738 5743 +1083 5835 5839 +1084 5972 5978 +1086 6075 6195 +1089 5972 5979 +1089 6193 6310 +1092 5618 5622 +1092 5857 5972 +1092 6190 6191 +1115 1349 1466 +1131 4991 4995 +1133 1574 1575 +1143 1354 4991 +1150 1350 4991 +1154 4990 4991 +1157 4991 4992 +1158 1908 1913 +1167 1905 1906 +1171 1349 4991 +1179 1349 4874 +1180 1905 1910 +1184 4874 4991 +1184 5107 5109 +1186 1349 4992 +1194 1905 1907 +1194 1905 1908 +1197 1574 1580 +1199 4991 5109 +1102 2277 2282 +1105 2167 2282 +1107 1912 2030 +1107 2174 2288 +1107 2400 2507 +1108 5951 5952 +1108 2394 2507 +1110 2510 2511 +1115 2403 2518 +1119 1913 2030 +1120 2174 5950 +1120 2405 2519 +1121 2516 2521 +1122 2041 2159 +1126 5829 5948 +1129 1913 1915 +1133 2407 2518 +1137 1912 2022 +1137 2151 2159 +1138 2166 2283 +1138 2521 6188 +1146 6069 6073 +1152 1910 1912 +1158 1908 1913 +1165 6188 6306 +1167 1905 1906 +1168 1910 1913 +1180 1905 1910 +1181 2407 2519 +1181 6069 6187 +1186 2045 2159 +1187 2174 2286 +1188 2504 2511 +1192 2628 6188 +1194 1905 1907 +1198 2519 6072 +1200 1899 1906 +1200 2039 2159 +1113 5230 5235 +1114 5502 5617 +1117 4996 4997 +1130 5236 5238 +1131 4991 4995 +1136 5249 5368 +1138 5247 5250 +1154 4990 4991 +1155 5384 5497 +1156 5617 5622 +1166 4997 4998 +1171 5250 5367 +1184 5107 5109 +1184 5236 5243 +1185 5617 5625 +1199 5118 5236 +1103 6192 6304 +1108 5951 5952 +1109 6194 6310 +1114 6070 6071 +1114 6070 6076 +1115 5834 5841 +1115 6087 6205 +1119 5972 6092 +1122 5840 5842 +1124 5972 5974 +1126 5829 5948 +1126 5973 6092 +1128 5745 5858 +1130 5725 5840 +1135 5622 5738 +1145 5855 5857 +1146 6069 6073 +1153 5739 5745 +1153 5853 5972 +1156 5617 5622 +1157 6200 6310 +1159 5973 6093 +1160 6086 6093 +1165 5855 5856 +1167 5727 5846 +1174 5738 5745 +1181 6069 6187 +1185 5617 5625 +1186 6070 6073 +1188 5738 5746 +1198 2519 6072 +1200 5721 5840 +1200 5835 5954 +1205 1349 1354 +1214 1809 1920 +1217 1240 1349 +1229 1792 1907 +1229 1792 1908 +1235 1686 1796 +1236 1804 1809 +1244 5109 5112 +1245 1788 1907 +1246 5109 5110 +1246 1809 1925 +1251 1809 1926 +1253 1788 1899 +1254 1350 1354 +1254 1925 1926 +1256 1791 1792 +1278 1348 1350 +1280 1680 1797 +1280 1790 1792 +1288 1680 1796 +1290 1788 1791 +1300 1349 1350 +1205 6188 6304 +1208 2174 5832 +1211 2519 6189 +1214 1809 1920 +1215 2041 2045 +1229 1792 1907 +1243 1926 1927 +1245 1788 1907 +1251 1809 1926 +1253 1788 1899 +1254 1925 1926 +1258 5832 5838 +1259 2042 2045 +1262 2167 2283 +1263 2039 2044 +1267 2040 2041 +1274 1927 1928 +1278 2282 2283 +1282 2166 2167 +1215 5617 5624 +1228 5504 5617 +1231 5236 5241 +1243 5250 5365 +1244 5109 5112 +1246 5109 5110 +1268 5497 5504 +1205 6188 6304 +1211 2519 6189 +1212 6194 6304 +1214 5624 5738 +1215 5617 5624 +1224 6189 6191 +1228 6194 6311 +1258 5832 5838 +1259 6191 6192 +1261 5958 5959 +1269 5726 5728 +1276 6199 6206 +1301 1681 1796 +1305 1790 1795 +1315 1680 1795 +1319 1343 1350 +1323 1681 1795 +1329 1782 1899 +1333 1350 1351 +1354 1789 1795 +1354 1789 1792 +1354 5110 5111 +1355 1675 1795 +1359 1786 1788 +1367 1675 1792 +1372 1787 1790 +1378 1786 1899 +1380 1786 1907 +1390 1782 1893 +1393 1788 1789 +1306 1924 1928 +1309 2519 6191 +1310 1928 2043 +1312 5832 5951 +1313 2165 2167 +1320 2162 2167 +1321 1928 2042 +1329 1782 1899 +1378 1786 1899 +1380 1786 1907 +1316 5111 5112 +1354 5110 5111 +1382 5501 5619 +1384 5501 5620 +1309 2519 6191 +1312 5832 5951 +1317 6200 6316 +1338 5733 5846 +1364 5606 5726 +1368 5619 5620 +1372 5620 5621 +1378 5614 5620 +1382 5501 5619 +1384 5501 5620 +1396 5619 5621 +1403 1782 1901 +1405 1677 1681 +1410 1804 1920 +1415 1787 1789 +1427 1677 1678 +1445 1675 1677 +1447 1787 1788 +1450 5111 5230 +1451 1675 1787 +1472 1671 1787 +1477 1670 1677 +1495 1462 1463 +1499 1469 5110 +1410 1804 1920 +1416 2279 2284 +1425 2044 2159 +1445 2284 2393 +1458 2516 6187 +1472 2031 2038 +1484 2284 2398 +1486 2032 2038 +1488 2042 2043 +1495 1927 2043 +1404 5368 5370 +1430 5006 5116 +1446 5116 5121 +1450 5111 5230 +1479 4999 5116 +1489 5129 5248 +1499 1469 5110 +1416 5621 5740 +1420 5614 5621 +1435 5616 5621 +1439 5733 5853 +1458 2516 6187 +1516 1347 1463 +1520 1781 1788 +1557 1338 1448 +1558 1348 1463 +1580 1560 1678 +1593 1454 1455 +1594 1782 1788 +1598 1564 1678 +1504 2398 2399 +1510 2038 2148 +1512 2033 2038 +1512 6069 6189 +1516 2393 2399 +1521 2284 2399 +1543 2033 2153 +1556 2037 2044 +1567 2038 2154 +1568 2038 2153 +1598 2042 2044 +1598 2504 2509 +1508 5000 5116 +1516 5129 5130 +1530 5127 5130 +1538 5001 5116 +1550 4880 4996 +1567 5128 5129 +1568 5128 5135 +1574 5128 5130 +1589 5009 5125 +1512 6069 6189 +1574 6072 6073 +1606 1459 1462 +1610 1353 1463 +1612 1558 1560 +1618 1553 1670 +1626 1679 1684 +1630 1448 1456 +1631 1684 1686 +1635 1553 1554 +1637 1455 1456 +1642 1553 1558 +1644 1554 1664 +1645 1558 1561 +1654 1557 1673 +1661 1439 1446 +1661 1440 1446 +1664 1440 1556 +1666 1455 1459 +1669 1547 1548 +1671 1553 1555 +1675 1556 1557 +1676 1680 1790 +1678 1673 1674 +1680 1554 1555 +1684 1437 1547 +1685 1564 1679 +1690 1331 1332 +1690 1555 1558 +1690 1679 1685 +1694 1453 1456 +1699 1563 1564 +1620 2275 2390 +1630 2390 2391 +1630 2518 2519 +1630 2506 2509 +1631 2275 2279 +1632 2511 2616 +1637 2390 2392 +1637 2399 2400 +1638 2275 2391 +1640 2397 2504 +1647 2262 2269 +1648 2384 2391 +1649 2505 2509 +1662 2276 2279 +1662 2504 2512 +1664 2029 2030 +1675 2279 2392 +1677 2395 2506 +1677 2505 2616 +1678 2406 2519 +1681 2392 2395 +1683 2263 2378 +1686 2278 2279 +1693 2391 2395 +1698 2506 2508 +1699 2504 2616 +1700 2510 2518 +1603 5121 5123 +1604 5125 5127 +1620 5013 5125 +1628 5009 5013 +1633 5251 5258 +1650 5008 5009 +1655 5010 5013 +1660 5127 5128 +1660 5256 5374 +1669 5122 5128 +1670 5256 5379 +1672 5013 5127 +1673 5008 5010 +1676 5255 5374 +1678 5256 5261 +1679 5012 5128 +1680 4892 5008 +1682 5138 5257 +1682 5255 5261 +1684 5258 5379 +1691 5377 5382 +1693 5254 5255 +1694 5012 5127 +1697 5258 5377 +1700 5254 5256 +1607 6071 6072 +1702 1561 1563 +1704 1569 1679 +1709 1554 1672 +1710 1336 1338 +1715 1437 1555 +1717 1563 1569 +1719 1672 1673 +1720 1556 1561 +1720 1557 1558 +1722 1440 1441 +1723 1441 1555 +1723 1547 1554 +1723 1552 1664 +1724 1329 1445 +1726 1439 1441 +1734 1563 1679 +1741 1439 1444 +1742 1674 1675 +1744 1675 1790 +1745 1441 1556 +1747 1681 1686 +1748 1435 1441 +1749 1435 1437 +1751 1569 1686 +1755 1217 1218 +1756 1329 1444 +1763 1679 1686 +1766 1329 1335 +1770 1438 1441 +1771 1224 1331 +1773 1562 1563 +1776 1670 1671 +1781 1453 1459 +1783 1331 1338 +1791 1437 1438 +1792 1430 1547 +1793 1555 1556 +1794 1436 1438 +1800 1459 1573 +1800 1563 1678 +1701 2394 2395 +1701 2385 2498 +1701 2492 2499 +1703 2030 2033 +1703 2610 2616 +1705 2278 2394 +1710 2027 2029 +1711 2023 2139 +1711 2512 2518 +1714 2506 2618 +1714 2505 2618 +1715 2391 2504 +1715 2407 6189 +1719 2389 2391 +1719 2501 2508 +1722 2250 2257 +1730 2610 2617 +1736 2385 2500 +1737 2504 2506 +1739 2503 2508 +1740 2399 2406 +1742 2389 2506 +1743 2389 2501 +1744 2401 2518 +1745 2401 2406 +1746 2031 2033 +1748 2610 2618 +1752 2503 2618 +1753 2389 2498 +1756 2400 2406 +1757 2391 2392 +1757 2493 2604 +1758 2612 2618 +1759 2389 2500 +1761 2386 2500 +1762 2492 2500 +1762 2504 2505 +1762 2503 2613 +1763 2610 2615 +1764 2615 2618 +1765 2140 2256 +1766 2388 2389 +1767 2611 2721 +1771 2503 2615 +1772 2383 2500 +1772 2502 2508 +1779 2399 2401 +1781 2032 2033 +1784 2492 2497 +1786 2611 2615 +1787 2027 2147 +1787 2387 2388 +1787 2383 2389 +1789 2493 2497 +1790 2502 2613 +1791 2612 2615 +1792 2027 2139 +1792 2386 2388 +1793 2392 2393 +1797 2612 2613 +1800 2391 2506 +1703 5258 5262 +1704 5251 5259 +1710 4896 5008 +1714 5138 5259 +1714 5253 5254 +1715 5377 5384 +1718 5256 5259 +1719 5012 5129 +1720 4891 4898 +1722 5258 5259 +1727 5258 5264 +1730 5010 5011 +1731 5377 5385 +1732 5012 5013 +1733 4896 4898 +1736 5264 5385 +1738 5264 5383 +1739 5011 5012 +1743 5136 5259 +1744 5257 5264 +1747 4896 5016 +1752 5257 5258 +1757 5136 5253 +1758 5136 5254 +1761 5263 5270 +1762 5135 5248 +1765 5135 5253 +1769 5135 5254 +1774 5138 5142 +1774 5251 5256 +1776 5262 5385 +1777 5136 5141 +1780 5000 5001 +1788 5137 5257 +1790 5136 5142 +1795 4898 4899 +1715 2407 6189 +1736 6072 6189 +1756 5957 5958 +1761 6072 6190 +1801 1336 1456 +1811 1430 1431 +1814 1670 1672 +1816 1430 1437 +1816 1554 1558 +1818 1458 1459 +1822 1670 1675 +1823 1430 1435 +1829 1110 1217 +1829 1324 1444 +1829 1457 1458 +1834 1672 1675 +1842 1558 1672 +1846 1456 1459 +1849 1552 1554 +1851 1324 1436 +1854 1552 1558 +1861 1435 1438 +1863 1324 1326 +1866 1675 1789 +1874 1454 1459 +1877 880 887 +1877 1320 1436 +1877 1446 1563 +1878 1671 1675 +1881 1457 1459 +1887 1554 1670 +1888 862 869 +1888 874 881 +1888 1329 1330 +1892 1671 1789 +1893 1304 1311 +1894 1314 1424 +1894 1671 1672 +1897 868 875 +1899 1671 1674 +1802 2721 2723 +1807 2721 2722 +1808 2715 2722 +1817 2383 2386 +1818 2615 2723 +1819 2492 2495 +1821 2032 2147 +1822 2133 2140 +1822 2383 2385 +1825 2406 2518 +1826 2383 2388 +1826 2385 2492 +1827 2381 2386 +1829 2728 2829 +1837 2032 2148 +1837 2272 2381 +1841 2378 2383 +1842 2614 2615 +1844 2721 2726 +1851 2267 2383 +1852 2267 2381 +1853 2244 2251 +1858 2391 2498 +1859 2278 2393 +1862 2726 2728 +1871 2378 2379 +1871 2395 2504 +1875 2134 2250 +1884 2835 2836 +1885 2378 2380 +1886 2267 2380 +1891 2726 2729 +1894 2263 2380 +1898 2612 2614 +1900 2266 2267 +1803 4896 5010 +1806 5130 5135 +1809 5256 5258 +1835 5137 5144 +1836 5269 5270 +1837 5134 5141 +1842 5134 5136 +1844 5137 5142 +1845 5139 5141 +1847 5139 5142 +1848 5027 5144 +1851 5130 5133 +1852 4777 4784 +1853 5250 5373 +1860 4896 5011 +1860 5027 5143 +1863 5137 5140 +1864 5139 5140 +1866 5137 5145 +1877 5027 5145 +1880 5135 5136 +1883 5377 5379 +1886 5026 5033 +1888 4784 4891 +1895 5025 5145 +1898 4891 4899 +1901 1327 1444 +1902 1197 1310 +1902 1670 1678 +1904 1446 1556 +1906 1675 1678 +1908 780 886 +1910 1319 1320 +1913 1673 1675 +1916 1331 1339 +1917 863 971 +1919 683 785 +1920 868 869 +1921 1319 1324 +1921 1678 1680 +1921 1669 1671 +1925 1675 1680 +1928 880 881 +1928 1324 1327 +1935 1671 1781 +1936 1082 1089 +1938 1664 1671 +1941 779 786 +1941 1196 1203 +1942 867 869 +1942 868 870 +1944 1327 1329 +1946 880 882 +1946 1558 1678 +1951 965 972 +1951 1305 1421 +1951 1680 1681 +1955 879 881 +1956 768 874 +1957 864 869 +1957 1321 1327 +1961 1083 1196 +1964 689 785 +1965 1322 1327 +1966 874 876 +1966 1212 1319 +1966 1319 1321 +1969 874 875 +1971 880 885 +1974 780 885 +1975 873 875 +1978 864 971 +1979 689 791 +1983 978 1088 +1983 1205 1206 +1983 1210 1324 +1985 763 870 +1985 1328 1329 +1985 1673 1678 +1986 1415 1422 +1989 1103 1104 +1989 1679 1680 +1995 1210 1212 +1997 780 781 +1997 1304 1309 +1998 970 971 +1999 779 781 +2000 873 876 +1919 2265 2266 +1923 2516 6189 +1927 2931 2932 +1930 2611 2614 +1931 2808 2809 +1932 2263 2372 +1934 2264 2266 +1934 2815 2913 +1937 2261 2263 +1937 2829 2837 +1939 2251 2366 +1944 2259 2265 +1945 2472 2577 +1949 2465 2466 +1949 2502 2607 +1952 2261 2264 +1952 2925 2926 +1954 2352 2459 +1956 2583 2584 +1957 2821 2919 +1958 2257 2372 +1962 2345 2346 +1962 2695 2701 +1963 2257 2373 +1964 2229 2230 +1965 2701 2802 +1965 2829 2836 +1969 2257 2261 +1970 2810 2913 +1972 2256 2261 +1973 2366 2372 +1975 1995 1996 +1975 2144 2261 +1976 2919 2920 +1977 2694 2695 +1977 2726 2837 +1979 2809 2810 +1979 3034 3125 +1982 2257 2374 +1985 2113 2229 +1987 2924 2926 +1989 2257 2366 +1991 2149 2265 +1992 1879 1995 +1992 2230 2345 +1992 2467 2472 +1992 2807 2809 +1993 2913 2918 +1993 3131 3132 +1994 2112 2113 +1994 2577 2582 +1999 2465 2467 +1904 4782 4784 +1907 5031 5143 +1914 5025 5140 +1917 4896 4899 +1917 4896 4901 +1920 5024 5134 +1922 5027 5031 +1923 4784 4785 +1927 4782 4899 +1929 4465 4564 +1931 5024 5139 +1933 4805 4912 +1944 5033 5143 +1948 4452 4453 +1948 5031 5145 +1950 4916 5032 +1951 5024 5141 +1953 4459 4558 +1953 5019 5024 +1957 5033 5034 +1961 5025 5030 +1962 4895 5011 +1964 5024 5140 +1965 4704 4705 +1971 4471 4570 +1974 4894 4900 +1981 4440 4441 +1982 4894 4901 +1989 4680 4686 +1995 4894 4899 +1995 5032 5033 +1998 5024 5030 +2000 4337 4434 +1913 5956 5959 +1923 2516 6189 +1926 5957 5959 +1995 6080 6082 +1999 5965 6082 +2004 684 785 +2004 867 870 +2005 1197 1309 +2011 695 791 +2011 4330 4331 +2012 1643 1650 +2013 1199 1205 +2014 1210 1321 +2015 1532 1539 +2016 1650 1760 +2017 1197 1198 +2017 1206 1319 +2018 970 972 +2018 1533 1649 +2018 1878 1879 +2019 879 882 +2022 689 790 +2022 966 1076 +2023 688 695 +2024 694 4331 +2024 683 784 +2024 876 879 +2026 775 885 +2026 867 976 +2029 1760 1767 +2031 1091 1092 +2034 1210 1327 +2035 870 873 +2035 1761 1878 +2037 690 791 +2037 1206 1210 +2037 1415 1420 +2041 779 784 +2041 1210 1216 +2042 864 973 +2043 778 885 +2043 1070 1077 +2043 1210 1322 +2046 694 695 +2046 1304 1306 +2047 967 972 +2048 865 870 +2050 1215 1322 +2051 878 879 +2051 1760 1765 +2052 970 973 +2052 1305 1306 +2052 1645 1650 +2053 1235 1236 +2054 864 976 +2055 694 696 +2055 1422 1532 +2055 1533 1534 +2059 1532 1537 +2059 1877 1878 +2060 778 781 +2060 1209 1210 +2060 1305 1420 +2062 693 695 +2062 1122 1235 +2063 1196 1197 +2064 1760 1878 +2065 678 784 +2066 1235 1237 +2066 1417 1422 +2067 684 787 +2067 967 1076 +2068 1532 1649 +2069 689 695 +2071 1236 1240 +2071 1532 1534 +2072 684 790 +2072 1417 1537 +2073 1098 1205 +2075 877 879 +2075 1192 1198 +2076 684 784 +2080 4329 4331 +2081 1235 1240 +2082 690 790 +2084 866 870 +2084 1648 1649 +2085 1529 1532 +2085 1648 1650 +2085 1761 1762 +2085 1762 1767 +2086 680 784 +2088 684 782 +2088 690 695 +2089 1531 1534 +2090 1192 1309 +2096 1417 1420 +2097 690 796 +2099 1300 1420 +2099 1534 1648 +2002 2464 2465 +2002 2611 2723 +2004 2259 2264 +2004 2802 2807 +2005 2694 2696 +2006 2695 2696 +2007 2467 2470 +2009 2918 2920 +2010 2693 2694 +2011 2258 2261 +2011 2347 2352 +2011 2696 2802 +2012 2344 2345 +2013 2230 2231 +2013 2352 2464 +2014 2696 2701 +2014 2926 2927 +2015 2584 2688 +2016 3138 3225 +2017 1996 2112 +2017 2113 2114 +2017 2228 2229 +2018 1878 1879 +2018 2582 2584 +2019 2255 2366 +2020 2584 2694 +2020 2584 2585 +2022 2353 2464 +2027 2255 2257 +2028 2810 2912 +2029 1996 1997 +2030 2607 2612 +2031 2579 2582 +2032 2919 2926 +2036 1994 1995 +2036 2345 2347 +2038 2579 2585 +2039 2256 2259 +2039 2467 2582 +2041 2347 2353 +2042 2111 2112 +2046 2347 2350 +2046 2693 2695 +2050 2516 6188 +2051 2231 2344 +2052 2149 2259 +2054 2920 2921 +2055 2585 2693 +2057 1879 1880 +2059 1877 1878 +2061 2696 2804 +2062 2804 2807 +2064 2467 2469 +2065 2137 2247 +2065 2143 2149 +2065 2144 2259 +2066 1997 2111 +2068 2228 2231 +2069 2142 2149 +2070 2609 2612 +2070 2696 2801 +2073 2114 2228 +2074 2462 2467 +2079 2921 3021 +2081 1994 1997 +2082 2111 2114 +2083 1880 1994 +2085 2258 2260 +2086 1877 1880 +2092 2462 2464 +2094 2574 2582 +2096 2609 2611 +2098 2258 2259 +2001 4787 4894 +2005 5023 5025 +2011 4330 4331 +2014 4577 4680 +2015 4464 4465 +2019 5254 5374 +2020 5031 5033 +2023 5031 5151 +2025 4780 4781 +2029 4349 4446 +2034 5023 5024 +2035 4782 4787 +2039 5254 5261 +2040 4783 4785 +2041 4440 4447 +2041 5025 5028 +2043 4672 4783 +2051 4361 4458 +2055 4785 4788 +2060 4686 4687 +2061 4459 4564 +2063 5027 5028 +2066 4687 4693 +2066 5022 5023 +2073 5020 5028 +2089 4459 4563 +2091 5261 5374 +2092 5034 5037 +2094 4676 4783 +2094 5254 5259 +2096 4915 4922 +2099 4907 5017 +2100 4440 4442 +2012 5962 5964 +2042 5964 5965 +2049 5963 5964 +2050 2516 6188 +2102 1760 1762 +2102 1762 1877 +2104 1121 1122 +2104 1207 1210 +2105 693 696 +2105 1075 1076 +2105 1126 1235 +2106 1208 1215 +2107 1240 4874 +2108 1205 1207 +2109 967 1081 +2109 1645 1765 +2112 775 877 +2112 1648 1651 +2114 1195 1196 +2115 1300 1306 +2117 1195 1198 +2118 1759 1762 +2119 1192 1306 +2120 872 873 +2120 968 971 +2120 1096 1207 +2121 1417 1419 +2123 696 4329 +2125 866 976 +2125 1092 1207 +2125 1195 1201 +2125 1645 1651 +2128 690 788 +2129 1092 1199 +2129 1205 1208 +2129 1208 1209 +2130 1092 1205 +2130 1303 1306 +2131 1208 1210 +2132 686 790 +2133 686 782 +2133 871 876 +2133 1207 1208 +2134 1092 1096 +2144 1085 1199 +2147 968 973 +2149 1096 1205 +2152 1101 1214 +2152 1417 1529 +2153 1092 1093 +2154 1240 4875 +2155 1085 1086 +2156 4329 4332 +2159 1646 1648 +2162 975 1086 +2162 1090 1092 +2163 1208 1213 +2164 968 976 +2164 1095 1208 +2166 690 692 +2168 776 784 +2168 1085 1090 +2169 1095 1096 +2170 1530 1534 +2171 975 1079 +2171 981 1085 +2172 1086 1087 +2172 1529 1531 +2174 1122 1126 +2175 1205 1210 +2181 1090 1093 +2181 1100 1107 +2181 1647 1648 +2189 776 781 +2190 1354 4992 +2194 1758 1762 +2195 1010 4648 +2195 1645 1647 +2199 1085 1087 +2102 1762 1877 +2105 2227 2231 +2107 2142 2147 +2108 2250 2255 +2108 2360 2367 +2108 2693 2696 +2111 2142 2259 +2113 2231 2342 +2113 2366 2368 +2114 2349 2464 +2116 2915 2918 +2118 2692 2696 +2120 2226 2231 +2120 2347 2349 +2121 2110 2114 +2123 2342 2350 +2128 2255 2258 +2128 2367 2368 +2131 2226 2227 +2132 2349 2456 +2132 2921 3020 +2133 2227 2342 +2133 2342 2347 +2134 1875 1877 +2134 2342 2349 +2134 2806 2807 +2135 2144 2149 +2135 2806 2810 +2136 2349 2350 +2136 2604 2609 +2137 2691 2693 +2138 2932 3027 +2139 2579 2581 +2142 2349 2353 +2143 1992 1994 +2143 2497 2607 +2145 2114 2226 +2146 1993 1997 +2146 2144 2264 +2148 2581 2693 +2152 2927 3027 +2154 2226 2234 +2157 2462 2463 +2159 2361 2474 +2159 2927 3026 +2160 2696 2799 +2161 2144 2146 +2161 2799 2807 +2162 2109 2114 +2162 2144 2147 +2162 3027 3032 +2165 2109 2226 +2165 2143 2144 +2166 2611 2715 +2169 2116 2226 +2169 2349 2462 +2169 2709 2716 +2170 2348 2349 +2172 2469 2574 +2174 2144 2256 +2175 2253 2258 +2175 2932 3034 +2176 1876 1880 +2178 2226 2233 +2179 3026 3027 +2180 2921 2926 +2182 2256 2258 +2182 3027 3034 +2183 2574 2581 +2185 2365 2367 +2185 2926 3027 +2187 2109 2110 +2189 2139 2144 +2189 2250 2251 +2190 3027 3029 +2192 2139 2142 +2192 2146 2256 +2195 2109 2111 +2195 2605 2715 +2197 2257 2258 +2104 4452 4454 +2106 4669 4774 +2107 4330 4332 +2108 4343 4446 +2108 4907 5022 +2110 5026 5027 +2117 4808 4921 +2118 5133 5136 +2123 5132 5133 +2127 4902 4907 +2128 4785 4787 +2131 4908 5022 +2140 4344 4446 +2140 4780 4787 +2141 4678 4789 +2147 4908 5020 +2149 5374 5379 +2150 4662 4663 +2154 4337 4439 +2154 4900 4901 +2156 4329 4332 +2156 4451 4453 +2156 4678 4684 +2157 5019 5136 +2162 4439 4440 +2163 4332 4337 +2165 4904 4908 +2168 4338 4439 +2169 4335 4439 +2169 4446 4451 +2169 4910 5026 +2170 4337 4440 +2173 4905 5022 +2174 4332 4335 +2175 4454 4459 +2176 4337 4338 +2178 4786 4787 +2182 4900 4902 +2182 4910 5028 +2185 4780 4782 +2190 4902 4905 +2191 4335 4337 +2192 4343 4445 +2193 4437 4440 +2194 4440 4445 +2198 5136 5139 +2109 5965 6083 +2110 5963 6083 +2129 5970 6083 +2140 5979 6092 +2143 5751 5864 +2147 6205 6206 +2150 5741 5742 +2159 6098 6099 +2160 5873 5880 +2169 5744 5745 +2174 5977 6092 +2174 6120 6238 +2177 6202 6203 +2180 6098 6217 +2187 6202 6209 +2188 5870 5871 +2191 5622 5743 +2192 6089 6090 +2192 6092 6100 +2192 6452 6459 +2195 5977 6097 +2198 5745 5746 +2198 6099 6100 +2198 6090 6202 +2200 5743 5746 +2200 6105 6217 +2201 1085 1092 +2201 1240 4992 +2202 1412 1420 +2203 1080 1187 +2208 777 885 +2209 975 1087 +2210 1083 1084 +2211 968 969 +2212 691 696 +2223 1456 1458 +2225 1757 1765 +2226 777 781 +2234 1302 1420 +2239 1084 1195 +2240 777 883 +2252 777 877 +2256 1302 1306 +2256 1757 1762 +2257 1530 1646 +2259 1082 1087 +2260 969 973 +2261 865 872 +2262 686 788 +2264 979 1087 +2264 1529 1530 +2270 969 970 +2271 1758 1875 +2272 692 693 +2273 1640 1646 +2280 1082 1084 +2289 978 1082 +2294 776 783 +2295 871 872 +2202 2605 2609 +2203 2810 2910 +2207 2226 2228 +2208 2257 2263 +2212 2256 2264 +2215 2606 2609 +2219 2143 2258 +2220 2365 2474 +2224 1993 2109 +2225 2910 2918 +2225 3027 3028 +2228 2142 2144 +2233 2251 2252 +2236 2252 2255 +2236 2605 2717 +2238 2031 2032 +2240 2139 2140 +2248 2917 2918 +2249 2139 2141 +2251 2917 2921 +2254 2709 2717 +2258 2025 2031 +2258 2581 2685 +2261 1915 2031 +2266 1875 1876 +2271 1758 1875 +2274 2251 2255 +2275 2805 2806 +2276 2474 2476 +2276 2691 2692 +2280 2921 3018 +2283 2368 2371 +2287 2030 2031 +2288 2921 3026 +2289 1992 1993 +2294 2468 2475 +2294 2698 2799 +2295 1876 1992 +2202 4336 4337 +2206 4338 4445 +2206 4904 4905 +2210 4678 4791 +2211 4676 4791 +2212 4678 4783 +2213 4344 4445 +2216 4899 4901 +2224 5374 5381 +2228 4897 4905 +2229 4678 4682 +2230 4343 4440 +2233 4338 4440 +2235 4344 4448 +2237 4779 4780 +2237 4788 4902 +2241 4330 4337 +2247 4899 4902 +2249 4454 4457 +2253 4336 4440 +2253 4677 4684 +2258 4338 4437 +2260 4448 4451 +2266 4327 4332 +2266 4451 4454 +2266 4669 4779 +2274 4450 4451 +2275 4903 5020 +2281 4443 4451 +2282 4785 4786 +2284 4677 4682 +2291 4910 5020 +2296 5635 5636 +2202 5977 6094 +2202 6440 6447 +2203 5976 6089 +2204 5757 5870 +2205 6446 6453 +2209 6202 6207 +2212 5975 5976 +2212 6452 6453 +2214 6097 6100 +2220 6548 6555 +2221 6099 6103 +2224 6451 6453 +2225 5741 5743 +2226 5744 5749 +2232 6316 6317 +2234 5746 5749 +2235 6103 6217 +2235 6202 6204 +2240 5744 5751 +2240 5749 5752 +2241 6452 6454 +2244 5746 5748 +2247 6232 6239 +2248 6316 6318 +2250 5747 5749 +2255 5741 5748 +2258 5751 5752 +2258 6448 6453 +2260 6344 6458 +2261 6103 6219 +2265 6217 6225 +2266 5766 5885 +2267 6219 6225 +2268 5750 5751 +2268 6005 6012 +2271 5627 5748 +2275 6343 6458 +2277 6094 6095 +2281 5747 5748 +2282 5630 5750 +2283 6095 6097 +2283 6080 6085 +2289 6223 6224 +2290 6224 6225 +2290 6343 6350 +2293 5892 6005 +2294 5885 5886 +2296 5635 5636 +2296 6119 6126 +2296 6343 6349 +2298 6653 6660 +2300 5750 5755 +2301 4762 4763 +2302 1081 1084 +2302 1640 1647 +2305 1757 1764 +2307 1647 1757 +2312 973 975 +2318 866 974 +2318 1126 1237 +2328 1193 1195 +2330 680 782 +2333 685 692 +2334 1301 1306 +2338 1301 1309 +2345 4328 4329 +2346 771 877 +2347 973 976 +2349 973 1087 +2351 1007 1014 +2352 691 692 +2352 1080 1084 +2360 1124 4651 +2363 1007 1008 +2363 1096 1213 +2364 973 978 +2365 1194 1195 +2367 1192 1194 +2374 971 972 +2380 1101 1213 +2383 1007 1009 +2386 971 973 +2391 1013 1014 +2394 1011 1121 +2398 691 4328 +2400 686 692 +2305 2812 2910 +2309 2365 2482 +2310 2495 2502 +2311 2143 2259 +2312 2255 2368 +2331 2586 2593 +2353 2254 2255 +2358 2368 2369 +2361 2513 2520 +2363 2916 2917 +2370 2253 2255 +2374 2253 2260 +2374 2917 2923 +2393 2110 2226 +2398 2513 2625 +2301 4762 4763 +2303 4903 4904 +2306 4344 4443 +2310 4340 4445 +2310 5629 5636 +2313 4332 4334 +2324 4460 4564 +2326 4334 4439 +2326 5141 5254 +2329 4683 4690 +2334 4768 4769 +2340 4899 4900 +2345 4328 4329 +2347 4568 4677 +2347 4657 4762 +2348 4897 4902 +2357 4775 4882 +2368 4460 4566 +2369 5638 5645 +2371 4460 4563 +2375 4897 4898 +2376 4679 4682 +2376 4676 4786 +2378 4779 4781 +2386 4465 4570 +2386 4664 4774 +2394 4327 4328 +2397 4465 4569 +2398 691 4328 +2399 4449 4454 +2302 5752 5755 +2303 6097 6102 +2306 5752 5754 +2306 6090 6207 +2309 5747 5754 +2310 5629 5636 +2310 6222 6225 +2310 6233 6349 +2313 6345 6458 +2315 6006 6125 +2315 6090 6208 +2316 6345 6350 +2319 6224 6228 +2323 5645 5759 +2323 5757 5878 +2324 6094 6096 +2325 6653 6654 +2328 6090 6091 +2330 6102 6219 +2341 5976 6095 +2343 6334 6335 +2348 5752 5753 +2350 5765 5766 +2352 6219 6220 +2353 6348 6350 +2355 6348 6349 +2359 5755 5758 +2362 6457 6458 +2365 5755 5757 +2365 6234 6349 +2366 6340 6341 +2367 6457 6459 +2369 5638 5645 +2370 6224 6340 +2376 6234 6239 +2379 5884 5885 +2386 6096 6097 +2391 6340 6342 +2396 6237 6239 +2397 5640 5645 +2409 1080 1193 +2426 1079 1084 +2433 1121 1123 +2434 1079 1087 +2437 4650 4651 +2451 1413 1529 +2461 1192 1301 +2469 1079 1086 +2469 1641 1647 +2476 1412 1419 +2494 1354 4994 +2496 968 975 +2422 2917 3018 +2425 2474 2475 +2426 2254 2369 +2459 2253 2369 +2467 2368 2370 +2467 2513 2514 +2473 2233 2342 +2486 2365 2370 +2404 4774 4779 +2412 4782 4785 +2413 4460 4569 +2421 4897 4904 +2425 4346 4443 +2426 4466 4570 +2427 5525 5638 +2429 4776 4779 +2434 4779 4782 +2437 4650 4651 +2437 4663 4774 +2440 4327 4431 +2443 4340 4443 +2447 5635 5642 +2448 4768 4770 +2449 4683 4684 +2452 4684 4685 +2455 5635 5640 +2459 4466 4572 +2461 4460 4561 +2464 4773 4779 +2465 4683 4688 +2471 4768 4775 +2477 4664 4773 +2478 4778 4779 +2481 4466 4569 +2485 4663 4773 +2489 4658 4664 +2491 4334 4431 +2492 4663 4664 +2493 4340 4437 +2493 4544 4653 +2494 4462 4569 +2497 4682 4685 +2500 4658 4773 +2405 6218 6328 +2406 6228 6342 +2408 6237 6238 +2408 6345 6463 +2409 6220 6222 +2423 6097 6214 +2423 6121 6238 +2424 6121 6126 +2426 6348 6463 +2438 5766 5767 +2438 6340 6345 +2441 5876 5883 +2442 5976 5977 +2444 6457 6463 +2447 5635 5642 +2455 5635 5640 +2462 6089 6094 +2469 5636 5637 +2472 6455 6456 +2477 5633 5753 +2480 6234 6354 +2485 6228 6345 +2485 6340 6347 +2487 6005 6010 +2490 6124 6126 +2520 1123 1126 +2553 1187 1194 +2561 1010 4538 +2569 1188 1194 +2579 1010 4649 +2588 1301 1303 +2589 1015 4648 +2589 1188 1301 +2591 1302 1418 +2600 978 1087 +2502 2476 2479 +2507 2475 2476 +2519 2476 2588 +2530 2473 2475 +2534 2025 2032 +2537 2365 2477 +2543 2469 2580 +2549 2030 2032 +2557 2473 2580 +2558 2476 2477 +2572 2027 2032 +2575 3018 3020 +2578 2473 2588 +2579 2607 2613 +2584 2032 2142 +2590 2580 2582 +2593 2476 2478 +2503 4567 4569 +2507 4456 4563 +2508 4334 4437 +2512 4462 4567 +2512 4661 4663 +2515 4570 4575 +2516 4771 4779 +2517 4567 4570 +2519 4663 4768 +2519 4664 4771 +2520 4657 4767 +2522 4462 4568 +2524 4561 4569 +2524 4685 4688 +2524 4777 4782 +2531 4767 4769 +2531 4777 4778 +2532 4572 4575 +2537 4660 4664 +2544 4575 4577 +2547 4658 4768 +2552 4657 4768 +2554 4567 4572 +2556 4454 4456 +2556 4658 4661 +2561 1010 4538 +2564 4685 4687 +2569 4660 4773 +2571 4676 4681 +2585 4666 4778 +2589 4666 4771 +2596 4658 4767 +2598 4686 4688 +2599 4780 4786 +2501 6005 6007 +2505 5876 5881 +2507 5882 5883 +2517 5886 5887 +2518 6124 6125 +2519 6006 6007 +2520 6348 6354 +2524 5761 5878 +2524 5876 5878 +2541 5976 6094 +2546 6348 6351 +2554 5742 5861 +2555 6237 6240 +2557 5883 5884 +2568 5742 5743 +2570 5753 5755 +2573 5767 5885 +2575 6347 6348 +2578 6004 6007 +2581 5887 5892 +2583 5881 5884 +2583 6446 6447 +2599 6001 6007 +2605 1096 1208 +2613 1015 1121 +2615 1101 1208 +2628 1015 4761 +2628 1093 1095 +2646 1908 1915 +2654 1240 4877 +2659 1301 1302 +2667 1301 1418 +2688 1295 1301 +2696 1085 1088 +2607 2254 2370 +2617 2469 2582 +2619 2613 2614 +2621 2581 2582 +2646 1908 1915 +2655 2473 2478 +2655 2615 2724 +2662 1909 1915 +2665 2473 2583 +2676 2582 2585 +2685 2364 2477 +2690 1915 2025 +2700 2363 2370 +2611 4655 4767 +2616 4572 4577 +2616 4679 4685 +2620 4449 4450 +2624 4683 4691 +2626 5522 5641 +2628 1015 4761 +2636 4576 4577 +2644 4455 4561 +2644 4570 4577 +2649 4680 4685 +2662 4462 4561 +2670 4573 4580 +2675 4652 4657 +2677 5521 5528 +2679 4658 4765 +2683 4659 4660 +2692 4686 4693 +2694 4675 4786 +2601 6124 6243 +2602 5885 5887 +2604 6124 6127 +2606 6121 6243 +2618 6457 6460 +2619 5887 6010 +2619 5889 6002 +2619 6085 6088 +2626 5522 5641 +2626 5755 5760 +2637 6345 6347 +2641 5753 5873 +2641 5760 5878 +2645 5883 5887 +2648 5753 5754 +2648 5887 6002 +2654 5767 5772 +2656 5887 5890 +2660 5887 5893 +2661 5767 5890 +2663 5765 5772 +2667 6102 6214 +2669 5887 6004 +2687 5651 5771 +2688 5761 5879 +2689 5760 5873 +2717 871 878 +2730 1352 4992 +2738 1015 4649 +2744 901 4538 +2752 906 4538 +2762 1012 4649 +2763 906 4649 +2768 1087 1088 +2769 1015 4651 +2797 1013 4649 +2797 1125 1126 +2704 2025 2030 +2705 1910 2030 +2710 1910 1915 +2745 2027 2030 +2750 1915 2030 +2751 2022 2030 +2752 2473 2582 +2762 2604 2605 +2718 4660 4661 +2720 4572 4574 +2720 4692 4693 +2722 4572 4685 +2723 4456 4555 +2727 4679 4681 +2728 4677 4685 +2736 4456 4561 +2739 4691 4693 +2744 901 4538 +2749 4567 4568 +2749 4688 4691 +2750 4674 4681 +2752 906 4538 +2753 4679 4680 +2756 4555 4561 +2784 4692 4694 +2785 4690 4691 +2791 4691 4694 +2705 6095 6096 +2712 6220 6221 +2715 5889 6010 +2719 5879 5884 +2723 6089 6096 +2723 6096 6102 +2724 5884 5886 +2725 5766 5879 +2737 6214 6220 +2740 6007 6124 +2745 5760 5879 +2752 5889 6008 +2756 6003 6007 +2763 5895 6008 +2763 6122 6124 +2765 6002 6007 +2780 6002 6010 +2799 5893 6008 +2817 901 4432 +2818 1013 1015 +2819 1013 4651 +2820 1238 4875 +2827 1124 4761 +2832 1124 1126 +2832 1126 1238 +2833 4541 4649 +2837 901 4539 +2839 1088 1090 +2847 1012 1013 +2849 906 4539 +2852 1238 4877 +2858 1352 4877 +2872 1238 4763 +2872 1352 4994 +2808 3012 3019 +2812 2471 2478 +2848 3020 3023 +2849 2472 2582 +2854 3019 3020 +2880 3017 3019 +2810 4692 4699 +2814 4677 4683 +2817 901 4432 +2823 4698 4699 +2827 1124 4761 +2832 4694 4697 +2833 4541 4649 +2835 4697 4699 +2848 4574 4677 +2865 4689 4694 +2868 4658 4660 +2873 4705 4810 +2885 4689 4690 +2898 4699 4700 +2811 5893 6010 +2813 5893 6013 +2818 6014 6015 +2842 6002 6009 +2847 5766 5886 +2868 5887 6005 +2870 6003 6122 +2881 6008 6016 +2908 794 4432 +2911 971 976 +2938 1124 4763 +2940 971 978 +2946 869 971 +2958 799 4432 +2969 869 978 +2982 869 976 +2988 794 4431 +2990 799 4539 +2901 2620 2724 +2918 2724 2729 +2934 2472 2583 +2903 4680 4682 +2904 4700 4810 +2906 4689 4696 +2908 794 4432 +2921 4571 4680 +2942 4700 4809 +2958 799 4432 +2966 4680 4687 +2980 4810 4815 +2984 4653 4660 +2988 794 4431 +2990 4572 4680 +2902 5892 6012 +2904 5904 6023 +2907 6015 6016 +2913 5892 6010 +2918 6235 6238 +2922 6123 6127 +2928 6013 6016 +2928 6304 6305 +2929 6017 6024 +2937 6122 6123 +2949 5893 6011 +2950 6002 6122 +2957 6123 6243 +2960 6021 6134 +2973 5892 6011 +2974 6235 6243 +2980 6014 6019 +2983 5891 6011 +2984 5892 5898 +2995 5892 5893 +2995 5898 6011 +2999 6455 6463 +3000 6347 6455 +3014 794 4328 +3039 794 4433 +3073 696 4328 +3090 1353 4994 +3092 906 4541 +3021 2724 2731 +3040 2692 2799 +3014 794 4328 +3021 4654 4765 +3039 794 4433 +3039 4816 4817 +3054 4817 4823 +3073 696 4328 +3075 4650 4652 +3079 4654 4658 +3080 4696 4697 +3092 906 4541 +3002 5891 5898 +3004 6235 6240 +3005 5893 6016 +3006 5891 5892 +3010 5893 5898 +3021 6011 6016 +3025 6016 6018 +3027 6016 6019 +3028 5778 5891 +3028 5885 5891 +3029 6236 6240 +3030 5890 5892 +3030 6454 6459 +3040 6236 6354 +3045 5885 5890 +3052 5896 5898 +3052 6235 6241 +3058 6346 6354 +3068 5772 5885 +3071 6235 6242 +3075 6123 6241 +3075 6346 6351 +3083 6346 6347 +3093 5896 5897 +3096 6455 6460 +3107 904 4539 +3112 799 4433 +3116 906 1013 +3158 1090 1095 +3161 866 968 +3171 1088 1095 +3191 1088 1089 +3141 2729 2731 +3107 4652 4655 +3112 799 4433 +3164 4653 4654 +3188 4654 4655 +3102 5778 5897 +3106 5895 6016 +3118 6346 6352 +3120 6454 6566 +3132 6236 6352 +3135 6089 6091 +3141 6453 6454 +3150 5896 5899 +3155 6445 6447 +3157 6454 6571 +3170 6451 6565 +3184 6448 6560 +3187 5777 5784 +3198 6019 6021 +3213 1013 4650 +3225 1095 1207 +3233 1301 1308 +3213 1013 4650 +3202 6448 6565 +3206 6456 6460 +3209 6454 6565 +3213 6447 6560 +3227 6456 6462 +3233 6456 6571 +3243 6304 6306 +3245 5895 5899 +3246 6561 6671 +3250 6554 6560 +3251 6450 6565 +3267 6559 6560 +3271 6455 6462 +3273 5895 6014 +3278 6557 6560 +3284 6560 6561 +3290 6559 6562 +3294 6557 6565 +3297 6561 6562 +3371 4649 4651 +3383 4649 4652 +3394 1095 1202 +3325 2934 2941 +3337 2935 3036 +3340 2836 2940 +3345 2513 2515 +3327 4680 4681 +3338 4695 4702 +3363 4697 4700 +3369 4695 4696 +3371 5381 5500 +3383 4649 4652 +3305 6557 6562 +3311 6564 6565 +3313 6561 6670 +3316 6450 6557 +3320 6563 6564 +3326 6557 6564 +3327 6345 6348 +3329 6563 6565 +3333 6563 6571 +3334 5894 5899 +3334 6558 6562 +3336 6561 6665 +3353 6346 6461 +3355 6563 6568 +3357 6346 6353 +3363 6555 6665 +3367 6456 6569 +3368 6558 6564 +3379 5894 5901 +3382 6556 6665 +3464 696 4433 +3489 1302 1412 +3414 3029 3032 +3424 2728 2837 +3425 3029 3034 +3432 3125 3130 +3435 3130 3132 +3408 5381 5387 +3421 4680 4792 +3427 5379 5382 +3431 4695 4700 +3460 5381 5382 +3464 696 4433 +3482 5380 5381 +3494 5379 5380 +3417 6555 6666 +3418 6556 6670 +3466 6222 6227 +3476 6563 6570 +3477 6664 6665 +3489 6343 6345 +3500 6552 6662 +3508 1295 1412 +3509 1300 1302 +3529 1085 1093 +3531 799 4435 +3542 797 4433 +3546 975 1085 +3569 979 1085 +3512 3131 3133 +3527 3127 3130 +3574 2836 2840 +3583 2940 2942 +3590 2834 2837 +3524 4698 4700 +3528 5262 5379 +3531 799 4435 +3537 5261 5380 +3542 797 4433 +3544 5261 5381 +3549 4702 4703 +3552 5261 5379 +3560 4700 4703 +3563 4592 4701 +3581 4701 4703 +3595 4592 4598 +3598 4703 4706 +3505 6342 6343 +3515 5781 5900 +3518 6227 6342 +3521 6651 6752 +3526 6343 6344 +3528 5894 5902 +3528 6659 6666 +3540 5781 5902 +3540 6664 6666 +3555 6664 6667 +3560 6659 6660 +3561 5779 5902 +3561 6661 6666 +3563 6660 6666 +3577 6658 6660 +3585 5780 5787 +3588 6758 6759 +3598 6558 6670 +3601 1302 1303 +3608 3030 3037 +3623 2836 2837 +3625 2939 2941 +3625 2941 3036 +3642 2941 2942 +3653 2840 2942 +3663 2941 3044 +3676 3037 3134 +3680 3049 3140 +3685 3042 3043 +3687 2942 2945 +3611 4591 4598 +3618 4698 4705 +3630 4596 4701 +3639 4596 4598 +3646 4596 4706 +3674 4703 4705 +3676 4596 4709 +3694 4492 4591 +3602 5779 5897 +3606 5781 5785 +3614 6662 6664 +3615 6655 6660 +3617 6556 6662 +3623 5780 5785 +3632 6659 6661 +3642 5780 5786 +3647 5666 5786 +3647 6558 6668 +3655 5782 5785 +3665 5672 5786 +3673 5779 5784 +3691 5780 5788 +3694 5666 5788 +3696 5672 5792 +3702 1013 4541 +3739 3146 3147 +3748 3042 3044 +3755 3147 3240 +3771 3036 3038 +3775 3047 3049 +3781 2739 6420 +3787 3031 3128 +3796 2942 2943 +3702 1013 4541 +3711 4704 4706 +3713 4591 4599 +3721 4485 4492 +3737 4490 4492 +3748 4704 4709 +3771 4490 4599 +3774 4596 4599 +3776 4388 4492 +3782 4594 4599 +3785 4388 4491 +3800 4704 4711 +3701 5670 5786 +3718 5664 5788 +3722 6305 6419 +3726 5782 5784 +3726 6227 6337 +3737 5672 5794 +3748 6661 6667 +3750 5670 5788 +3769 6305 6309 +3775 5783 5785 +3781 2739 6420 +3797 5672 5676 +3810 2832 2837 +3815 3140 3148 +3817 2740 2847 +3822 3147 3151 +3824 2945 3044 +3834 3044 3050 +3836 3042 3047 +3839 3235 3322 +3844 3047 3050 +3845 3234 3241 +3849 3047 3148 +3850 3044 3047 +3852 3042 3050 +3852 3147 3148 +3853 3042 3049 +3853 3047 3052 +3855 3045 3050 +3856 3043 3047 +3857 2944 2945 +3857 3045 3047 +3858 2945 3042 +3858 3050 3052 +3863 2945 3045 +3865 3145 3148 +3866 3143 3148 +3874 2941 2947 +3875 2943 2944 +3879 2944 2950 +3880 2947 3042 +3880 3051 3052 +3887 2941 2945 +3889 2940 2941 +3892 3052 3053 +3895 2950 3045 +3895 3234 3242 +3898 3147 3242 +3801 4596 4601 +3803 4492 4493 +3803 4495 4599 +3820 4491 4493 +3822 4594 4601 +3827 5671 5676 +3829 4493 4496 +3850 5673 5794 +3856 4392 4491 +3858 4601 4704 +3863 4495 4496 +3865 4704 4710 +3871 4387 4394 +3886 4392 4394 +3890 5677 5684 +3897 4493 4499 +3812 5678 5792 +3813 5669 5788 +3816 6306 6309 +3818 5783 5788 +3824 5663 5784 +3827 5671 5676 +3839 5678 5798 +3843 5670 5794 +3843 5783 5784 +3850 5673 5794 +3864 5676 5792 +3864 5678 5800 +3878 5676 5678 +3880 5678 5682 +3881 5670 5789 +3890 5677 5684 +3891 5676 5794 +3933 1295 1302 +3987 859 860 +3904 2838 2839 +3909 3145 3242 +3912 2839 2840 +3914 3145 3150 +3914 3239 3241 +3919 3239 3242 +3922 2837 2839 +3922 3143 3149 +3923 3237 3242 +3937 3150 3237 +3944 3052 3143 +3944 3143 3150 +3951 3322 3324 +3952 2839 2943 +3952 3322 3323 +3956 3145 3237 +3957 3239 3322 +3965 3239 3330 +3973 3242 3244 +3982 3323 3404 +3987 2726 2731 +3988 3046 3052 +3991 3239 3244 +3992 3322 3327 +3993 2731 2832 +3994 3052 3149 +3996 3045 3052 +3996 3322 3325 +3999 3052 3148 +3901 4392 4499 +3903 5677 5682 +3909 4495 4600 +3925 4494 4496 +3931 5683 5684 +3953 4295 4393 +3961 4494 4499 +3964 5684 5685 +3973 5679 5682 +3973 5562 5682 +3981 4394 4395 +3991 4494 4501 +3991 5682 5685 +3992 5683 5690 +3996 4393 4395 +3903 5677 5682 +3905 5676 5797 +3908 5783 5790 +3914 5676 5800 +3921 5675 5794 +3930 5676 5795 +3931 5683 5684 +3939 6558 6669 +3940 6558 6662 +3941 5783 5789 +3948 6661 6664 +3949 6647 6654 +3954 5676 5681 +3964 5684 5685 +3971 6663 6664 +3973 5562 5682 +3973 5679 5682 +3973 6658 6661 +3977 5669 5789 +3988 6468 6575 +3989 6656 6663 +3991 5682 5685 +3992 5683 5690 +4007 2923 3026 +4010 3327 3329 +4011 3327 3330 +4012 2923 3025 +4014 3404 3405 +4020 2923 3018 +4025 3237 3244 +4033 3325 3330 +4040 3238 3244 +4044 3404 3406 +4048 3013 3110 +4053 3244 3325 +4063 3323 3327 +4012 4395 4398 +4016 4394 4397 +4019 5683 5688 +4023 4397 4499 +4034 5570 5689 +4044 4294 4301 +4053 4397 4398 +4062 5568 5688 +4065 5685 5688 +4082 4299 4393 +4094 4397 4500 +4019 5683 5688 +4028 6569 6570 +4029 6661 6663 +4045 6569 6680 +4053 6019 6022 +4055 6581 6582 +4055 6663 6764 +4062 5568 5688 +4062 6569 6571 +4062 6576 6680 +4065 5685 5688 +4068 5675 5789 +4082 6021 6142 +4084 6570 6574 +4085 6569 6574 +4096 5680 5682 +4097 6680 6688 +4099 6574 6680 +4128 696 4331 +4141 797 4331 +4150 797 4435 +4102 3327 3404 +4105 3024 3026 +4112 3327 3412 +4117 3405 3480 +4119 3405 3409 +4121 3406 3412 +4133 3404 3409 +4154 3024 3029 +4158 3474 3481 +4161 3406 3409 +4168 2508 2613 +4170 3327 3332 +4198 3029 3031 +4102 4299 4301 +4124 4299 4401 +4147 4207 4300 +4147 5576 5689 +4148 5683 5691 +4149 5679 5681 +4150 797 4435 +4151 5574 5689 +4153 4396 4398 +4154 5570 5691 +4158 4331 4433 +4163 5685 5687 +4164 4294 4302 +4166 4331 4435 +4167 4331 4332 +4174 5568 5691 +4182 4331 4434 +4197 5574 5691 +4106 5675 5795 +4108 6574 6682 +4112 6680 6683 +4115 6017 6019 +4117 6022 6142 +4117 6021 6140 +4117 6680 6685 +4119 6570 6680 +4120 6680 6682 +4123 6027 6140 +4123 6570 6571 +4130 6764 6771 +4132 6460 6571 +4135 6674 6680 +4136 6568 6571 +4137 6681 6788 +4138 6681 6685 +4140 6025 6140 +4142 6687 6788 +4147 5576 5689 +4148 5683 5691 +4149 5679 5681 +4151 5574 5689 +4151 6680 6681 +4154 5570 5691 +4163 5685 5687 +4165 6025 6142 +4166 6685 6687 +4168 6685 6688 +4174 5568 5691 +4174 6146 6147 +4176 6080 6199 +4176 6661 6772 +4180 6764 6772 +4182 6140 6148 +4183 6573 6574 +4187 6794 6795 +4189 6687 6795 +4190 6019 6024 +4195 6147 6148 +4197 5574 5691 +4201 962 969 +4210 1440 1555 +4204 3029 3130 +4209 3325 3332 +4227 3133 3138 +4239 3130 3133 +4253 3024 3025 +4271 3405 3482 +4282 3327 3407 +4290 3474 3482 +4238 5576 5695 +4246 5674 5681 +4259 5582 5695 +4275 5576 5697 +4294 5574 5694 +4299 5574 5697 +4211 6788 6796 +4214 6687 6796 +4219 6146 6265 +4220 6571 6573 +4226 6566 6571 +4232 6024 6142 +4233 6682 6683 +4237 6795 6799 +4238 5576 5695 +4241 6794 6899 +4242 6794 6796 +4245 6147 6151 +4246 5674 5681 +4249 6795 6899 +4254 6017 6018 +4258 6145 6148 +4259 5582 5695 +4266 6691 6796 +4275 5576 5697 +4278 6153 6265 +4286 6683 6684 +4287 6899 6900 +4291 6899 6901 +4294 5574 5694 +4296 6142 6143 +4296 6151 6265 +4299 5574 5697 +4300 6683 6685 +4301 3138 3230 +4302 3129 3130 +4306 3122 3130 +4317 3133 3136 +4345 3406 3407 +4352 3406 3482 +4364 3403 3482 +4370 3231 3232 +4302 4206 4213 +4308 4299 4302 +4309 5582 5701 +4339 4396 4401 +4340 4301 4302 +4349 5580 5695 +4384 4300 4302 +4388 4301 4304 +4390 5582 5703 +4305 6151 6267 +4306 6796 6799 +4306 6799 6901 +4326 6271 6272 +4328 6024 6137 +4337 6899 6904 +4337 6906 7000 +4341 6265 6273 +4349 5580 5695 +4360 6573 6683 +4360 6685 6690 +4363 6272 6273 +4365 6143 6145 +4368 6796 6797 +4368 6904 6906 +4369 5680 5681 +4375 5680 5687 +4397 6690 6796 +4405 3128 3133 +4408 3479 3481 +4411 3475 3543 +4455 3326 3332 +4457 3479 3482 +4458 3138 3231 +4476 3481 3543 +4497 3408 3409 +4408 5685 5686 +4431 5573 5691 +4433 5568 5686 +4447 5580 5697 +4472 4302 4305 +4474 5586 5701 +4477 5574 5692 +4479 4302 4308 +4480 5580 5700 +4408 5685 5686 +4416 6661 6767 +4417 7006 7007 +4425 6278 6388 +4431 5573 5691 +4433 5568 5686 +4434 6145 6150 +4434 6904 6907 +4439 6904 6910 +4442 6150 6267 +4443 6453 6459 +4445 6272 6276 +4447 5580 5697 +4451 5686 5688 +4452 5686 5691 +4456 6798 6799 +4464 6143 6144 +4465 6276 6388 +4465 7000 7008 +4467 6459 6566 +4470 6572 6573 +4470 6904 7008 +4474 6901 6902 +4475 7000 7007 +4477 7007 7097 +4480 5580 5700 +4480 6270 6273 +4485 6904 6909 +4487 6265 6268 +4489 5686 5687 +4492 6902 6904 +4500 7005 7007 +4502 3326 3407 +4508 3144 3237 +4518 3408 3483 +4524 3128 3129 +4533 3031 3122 +4534 3144 3231 +4550 3479 3551 +4559 3139 3231 +4566 3139 3230 +4567 3407 3408 +4567 3408 3482 +4568 3144 3236 +4573 3477 3482 +4596 3479 3543 +4598 3142 3236 +4507 4211 4300 +4530 4211 4213 +4535 5580 5703 +4555 5586 5703 +4568 4304 4401 +4585 5586 5707 +4586 4211 4308 +4511 7005 7008 +4512 6267 6268 +4519 6276 6390 +4521 7003 7008 +4526 7097 7105 +4536 7005 7105 +4545 6690 6791 +4547 7097 7104 +4553 7103 7104 +4554 7102 7105 +4556 6660 6661 +4563 6268 6270 +4564 6797 6798 +4572 6798 6902 +4572 7104 7188 +4574 7102 7104 +4580 6150 6262 +4587 5686 5693 +4595 6902 6903 +4598 7194 7195 +4627 904 4541 +4660 904 4435 +4667 1413 1523 +4672 962 963 +4691 854 963 +4699 962 967 +4609 3145 3236 +4610 3543 3545 +4618 3139 3236 +4618 3537 3544 +4641 3133 3135 +4645 3139 3228 +4663 3479 3484 +4667 3141 3236 +4667 3544 3545 +4676 3135 3139 +4686 3477 3484 +4606 4327 4334 +4627 904 4541 +4636 4235 4327 +4645 5572 5692 +4655 4327 4335 +4660 904 4435 +4667 4213 4214 +4692 5573 5692 +4616 6394 6395 +4635 7188 7196 +4647 7005 7010 +4653 7102 7196 +4657 7100 7105 +4669 6388 6396 +4674 6903 6909 +4674 7188 7195 +4688 6909 7003 +4699 7003 7010 +4711 967 970 +4718 1406 1407 +4735 854 956 +4742 963 964 +4746 848 854 +4754 956 964 +4762 852 956 +4765 961 964 +4770 964 967 +4788 964 966 +4790 965 967 +4710 3542 3544 +4720 3545 3548 +4730 3135 3136 +4733 3544 3597 +4743 3141 3228 +4746 3234 3236 +4766 3134 3135 +4766 3546 3551 +4789 3545 3605 +4794 3484 3546 +4706 4141 4228 +4708 5579 5697 +4711 5579 5692 +4721 4233 4235 +4723 4228 4235 +4739 4233 4335 +4744 4228 4236 +4763 4134 4141 +4776 4233 4236 +4776 5585 5703 +4779 4139 4141 +4789 4330 4335 +4708 5579 5697 +4710 6395 6396 +4710 7102 7107 +4755 7193 7196 +4767 7189 7273 +4768 7191 7196 +4780 7195 7196 +4782 7201 7279 +4792 6270 6275 +4801 959 964 +4806 848 950 +4807 965 966 +4813 848 956 +4825 848 958 +4832 852 854 +4833 852 964 +4840 852 958 +4858 846 848 +4888 841 846 +4891 841 842 +4895 852 959 +4898 959 965 +4802 3234 3235 +4804 3597 3604 +4807 3546 3548 +4808 3546 3553 +4828 3598 3604 +4831 3128 3135 +4831 3597 3605 +4836 3542 3605 +4841 3234 3239 +4851 3547 3548 +4857 3542 3602 +4859 3547 3605 +4864 3602 3604 +4872 3600 3605 +4873 3597 3602 +4879 3604 3645 +4883 3602 3605 +4900 3645 3652 +4807 4053 4134 +4808 4139 4236 +4828 5698 5703 +4839 4134 4142 +4840 4233 4238 +4884 5585 5704 +4892 4231 4236 +4896 4238 4330 +4802 5697 5698 +4808 6275 6390 +4809 6393 6396 +4809 7193 7199 +4809 7195 7199 +4811 7196 7198 +4828 5698 5703 +4829 7199 7281 +4830 7010 7100 +4833 7285 7286 +4836 6269 6275 +4844 6268 6269 +4845 6150 6269 +4857 7107 7191 +4867 7199 7279 +4873 7279 7287 +4876 5698 5700 +4883 7198 7199 +4884 5585 5704 +4896 6395 6399 +4899 7286 7287 +4904 857 959 +4906 851 852 +4908 850 959 +4910 846 849 +4914 851 959 +4917 1758 1869 +4922 849 851 +4938 850 851 +4943 1758 1877 +4945 841 843 +4952 735 842 +4963 843 849 +4971 735 835 +4979 844 851 +4990 735 843 +4925 3645 3653 +4943 1758 1877 +4949 3602 3653 +4958 3605 3607 +4972 3646 3678 +4979 3645 3650 +4985 3602 3650 +4985 3646 3650 +4995 3647 3650 +4998 3645 3648 +4939 4231 4238 +4947 4139 4142 +4910 7100 7107 +4926 7284 7287 +4935 7286 7364 +4937 7199 7282 +4940 7286 7290 +4963 5698 5705 +4967 7364 7365 +4981 7364 7366 +4984 6275 6385 +4991 7282 7287 +5002 739 843 +5011 736 843 +5018 1752 1869 +5022 1756 1869 +5027 844 846 +5031 1752 1863 +5036 733 735 +5036 1752 1871 +5044 844 845 +5065 1756 1877 +5072 1746 1863 +5073 1756 1871 +5076 843 844 +5084 733 835 +5015 3646 3679 +5017 3602 3607 +5030 3547 3606 +5034 3600 3607 +5036 1752 1871 +5048 3675 3679 +5065 1756 1877 +5065 2336 2343 +5073 1756 1871 +5084 3602 3648 +5036 5586 5704 +5032 7371 7436 +5036 5586 5704 +5049 7290 7366 +5088 7364 7369 +5102 733 843 +5118 729 835 +5121 1750 1863 +5101 3648 3653 +5104 3648 3650 +5119 3644 3679 +5148 3649 3650 +5154 3648 3655 +5161 3649 3679 +5187 3607 3648 +5188 2227 2344 +5127 4396 4403 +5185 4299 4304 +5119 7287 7289 +5127 7369 7371 +5130 7191 7197 +5131 5698 5699 +5154 7436 7443 +5168 6655 6761 +5171 6390 6391 +5193 7369 7372 +5243 3677 3679 +5291 3649 3680 +5224 4304 4396 +5263 4125 4206 +5217 7197 7198 +5243 7289 7290 +5252 7204 7282 +5258 7369 7443 +5299 7289 7295 +5310 4206 4214 +5372 4118 4125 +5311 7366 7367 +5314 7288 7289 +5346 6766 6772 +5360 7367 7369 +5365 7369 7374 +5373 7289 7367 +5418 728 735 +5478 632 728 +5481 733 736 +5489 728 736 +5406 4123 4125 +5414 4304 4305 +5439 4118 4124 +5459 4304 4403 +5463 4211 4214 +5478 4208 4214 +5482 4042 4124 +5496 4123 4214 +5415 7441 7443 +5529 1761 1877 +5542 738 843 +5529 1761 1877 +5509 4123 4129 +5523 4118 4126 +5526 4123 4126 +5546 4302 4303 +5564 4304 4402 +5568 4042 4118 +5583 4211 4216 +5506 7439 7443 +5521 7367 7368 +5557 7374 7439 +5602 4211 4303 +5612 4209 4214 +5616 4041 4126 +5617 4297 4303 +5621 4042 4045 +5627 4123 4128 +5628 4042 4126 +5634 4210 4303 +5659 4043 4045 +5662 4303 4304 +5696 4043 4044 +5789 630 728 +5789 630 733 +5795 738 838 +5715 4121 4126 +5849 733 738 +5856 732 738 +5833 4209 4216 +5888 4044 4126 +5909 731 733 +5941 731 732 +5944 630 730 +5946 625 626 +5951 626 630 +5956 730 731 +5959 627 730 +5973 626 627 +5983 629 730 +5988 619 626 +5917 4121 4128 +6013 629 725 +6037 619 624 +6039 624 627 +6050 619 620 +6063 624 629 +6083 519 620 +6009 4044 4045 +6013 4044 4127 +6052 4128 4209 +6228 620 621 +6242 621 624 +6250 4046 4047 +6259 622 624 +6292 519 613 +6250 4046 4047 +6337 618 621 +6354 613 621 +6364 621 623 +6378 622 623 +6445 616 621 +6514 517 613 +6539 6275 6391 +6656 517 615 +6724 513 517 +6760 517 616 +6765 512 513 +6784 506 512 +6792 513 514 +6801 522 616 +6831 516 517 +6853 506 514 +6854 515 616 +6877 511 514 +6885 417 506 +6908 514 516 +6921 415 506 +6942 515 516 +6947 411 506 +6959 509 515 +6966 509 514 +7022 411 500 +7023 420 509 +7043 411 508 +7047 415 508 +7068 412 508 +7093 415 509 +7099 409 500 +7102 413 509 +7135 409 502 +7160 414 508 +7161 409 508 +7174 409 503 +7175 409 411 +7177 409 415 +7180 414 509 +7185 409 414 +7194 409 412 +7173 6274 6281 +7231 414 503 +7204 6280 6281 diff --git a/examples/bpm/impact/log.17Feb2022.impact.rotational.g++.4 b/examples/bpm/impact/log.17Feb2022.impact.rotational.g++.4 deleted file mode 100644 index b76854d5d9..0000000000 --- a/examples/bpm/impact/log.17Feb2022.impact.rotational.g++.4 +++ /dev/null @@ -1,219 +0,0 @@ -LAMMPS (17 Feb 2022) -units lj -dimension 3 -boundary f f f -atom_style bpm/sphere -special_bonds lj 0.0 1.0 1.0 coul 0.0 1.0 1.0 -newton on off -comm_modify vel yes cutoff 2.6 -lattice fcc 1.0 -Lattice spacing in x,y,z = 1.5874011 1.5874011 1.5874011 -region box block -25 15 -22 22 -22 22 -create_box 1 box bond/types 2 extra/bond/per/atom 20 extra/special/per/atom 50 -Created orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) - 1 by 2 by 2 MPI processor grid - -region disk cylinder x 0.0 0.0 20.0 -0.5 0.5 -create_atoms 1 region disk -Created 7529 atoms - using lattice units in orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) - create_atoms CPU = 0.002 seconds -group plate region disk -7529 atoms in group plate - -region ball sphere 8.0 0.0 0.0 6.0 -create_atoms 1 region ball -Created 3589 atoms - using lattice units in orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) - create_atoms CPU = 0.001 seconds -group projectile region ball -3589 atoms in group projectile - -displace_atoms all random 0.1 0.1 0.1 134598738 -Displacing atoms ... - -neighbor 1.0 bin -pair_style gran/hooke/history 1.0 NULL 0.5 NULL 0.1 1 -pair_coeff 1 1 - -fix 1 all nve/bpm/sphere - -create_bonds many plate plate 1 0.0 1.5 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2 - ghost atom cutoff = 2.6 - binsize = 1, bins = 64 70 70 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) command create_bonds, occasional - attributes: full, newton on - pair build: full/bin - stencil: full/bin/3d - bin: standard - (2) pair gran/hooke/history, perpetual - attributes: half, newton on, size, history - pair build: half/size/bin/newton - stencil: half/bin/3d - bin: standard -Added 38559 bonds, new total = 38559 -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 1 1 - special bond factors coul: 0 1 1 - 15 = max # of 1-2 neighbors - 101 = max # of special neighbors - special bonds CPU = 0.001 seconds -create_bonds many projectile projectile 2 0.0 1.5 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -WARNING: Bonds are defined but no bond style is set (../force.cpp:192) -WARNING: Likewise 1-2 special neighbor interactions != 1.0 (../force.cpp:194) -Added 21869 bonds, new total = 60428 -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 1 1 - special bond factors coul: 0 1 1 - 16 = max # of 1-2 neighbors - 101 = max # of special neighbors - special bonds CPU = 0.001 seconds - -neighbor 0.3 bin -special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 - -bond_style bpm/rotational store/local brkbond 100 time id1 id2 -bond_coeff 1 1.0 0.2 0.02 0.02 0.05 0.01 0.01 0.01 0.1 0.2 0.002 0.002 -bond_coeff 2 1.0 0.2 0.02 0.02 0.20 0.04 0.04 0.04 0.1 0.2 0.002 0.002 - -velocity projectile set -0.05 0.0 0.0 -compute nbond all nbond/atom -compute tbond all reduce sum c_nbond - -timestep 0.05 -thermo_style custom step ke pe pxx pyy pzz c_tbond -thermo 100 -thermo_modify lost ignore lost/bond ignore -#dump 1 all custom 100 atomDump id radius x y z c_nbond - -dump 2 all local 100 brokenDump f_brkbond[1] f_brkbond[2] f_brkbond[3] -dump_modify 2 header no - -run 7500 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.3 - ghost atom cutoff = 2.6 - binsize = 0.65, bins = 98 108 108 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair gran/hooke/history, perpetual - attributes: half, newton on, size, history - pair build: half/size/bin/newton - stencil: half/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 33.34 | 33.34 | 33.35 Mbytes -Step KinEng PotEng Pxx Pyy Pzz c_tbond - 0 0.00053238861 0 3.8217307e-05 0 0 10.8703 - 100 0.00053238861 0 3.8217307e-05 1.2166373e-20 1.2308212e-20 10.8703 - 200 0.00053238861 0 3.8217307e-05 1.2454467e-20 1.2479589e-20 10.8703 - 300 0.00053238861 0 3.8217307e-05 1.2256702e-20 1.2621091e-20 10.8703 - 400 0.00053238861 0 3.8217307e-05 1.2170534e-20 1.2751666e-20 10.8703 - 500 0.00053093549 0 3.8484194e-05 7.645531e-08 1.4861825e-07 10.8703 - 600 0.00051485902 0 4.0340751e-05 3.8615876e-07 4.8663463e-07 10.869221 - 700 0.00049942978 0 3.8684008e-05 4.5363318e-07 4.4560229e-07 10.85501 - 800 0.00049465262 0 3.6604612e-05 1.4755468e-07 2.0062093e-07 10.820651 - 900 0.00048784775 0 3.5333139e-05 3.5118328e-07 6.6697625e-07 10.769563 - 1000 0.00048345699 0 3.4702137e-05 7.0312998e-07 4.0218318e-07 10.730347 - 1100 0.00047945073 0 3.5065961e-05 6.2813891e-07 7.4640359e-07 10.703184 - 1200 0.00047512604 0 3.4833144e-05 8.5208604e-07 8.7277583e-07 10.686634 - 1300 0.00047401428 0 3.4236869e-05 1.0321827e-06 7.4545242e-07 10.678 - 1400 0.00047619121 0 3.4416549e-05 8.7518021e-07 7.3979503e-07 10.671704 - 1500 0.0004668728 0 3.4495751e-05 1.4077823e-06 1.517373e-06 10.666127 - 1600 0.00045088371 0 3.3264301e-05 1.8499661e-06 1.9842415e-06 10.66073 - 1700 0.00044275099 0 3.2471064e-05 1.9028747e-06 2.2248947e-06 10.6458 - 1800 0.0004424362 0 3.1846336e-05 1.6208492e-06 1.9291602e-06 10.620615 - 1900 0.00043678957 0 3.1260936e-05 1.4673956e-06 1.6120523e-06 10.603166 - 2000 0.00042747562 0 3.0652107e-05 1.6455486e-06 1.53127e-06 10.576003 - 2100 0.0004214344 0 3.0240727e-05 1.8873967e-06 1.5258622e-06 10.539845 - 2200 0.00041712779 0 3.0329566e-05 1.8846152e-06 1.4971471e-06 10.49937 - 2300 0.00041095769 0 3.0000572e-05 2.3585924e-06 1.6773177e-06 10.471668 - 2400 0.00040883568 0 2.9625158e-05 1.9105554e-06 1.8720763e-06 10.45116 - 2500 0.00040762685 0 2.9441541e-05 1.6848938e-06 1.8877532e-06 10.437309 - 2600 0.00040579873 0 2.9255988e-05 1.7523874e-06 1.636423e-06 10.422378 - 2700 0.00040340975 0 2.9035693e-05 1.673158e-06 1.9038932e-06 10.410505 - 2800 0.00040170914 0 2.8829361e-05 1.6711978e-06 1.9776001e-06 10.400792 - 2900 0.00040015113 0 2.8614186e-05 1.5982427e-06 1.7994733e-06 10.393416 - 3000 0.00040029253 0 2.8470718e-05 1.5589166e-06 1.6682302e-06 10.385321 - 3100 0.00040037329 0 2.8483376e-05 1.2831526e-06 1.4788005e-06 10.378485 - 3200 0.00040142612 0 2.8481287e-05 1.1577988e-06 1.3495778e-06 10.373988 - 3300 0.00040105092 0 2.8547009e-05 1.2155138e-06 1.2633439e-06 10.370031 - 3400 0.00039950673 0 2.8340939e-05 1.1182251e-06 1.1624668e-06 10.364274 - 3500 0.00039715236 0 2.824813e-05 1.3086462e-06 1.2029185e-06 10.360496 - 3600 0.00039446552 0 2.8112283e-05 1.1232321e-06 1.0077217e-06 10.353121 - 3700 0.00039263296 0 2.7927975e-05 1.1083636e-06 1.2091857e-06 10.346645 - 3800 0.00039061341 0 2.7819957e-05 1.1836841e-06 1.3566272e-06 10.341069 - 3900 0.00038985051 0 2.7681947e-05 1.3588359e-06 1.4099727e-06 10.329196 - 4000 0.00038815347 0 2.7492102e-05 1.1111719e-06 1.1700718e-06 10.318043 - 4100 0.00038651302 0 2.7444105e-05 9.9563429e-07 1.4085969e-06 10.311027 - 4200 0.00038565809 0 2.7177341e-05 9.5736307e-07 1.0404482e-06 10.299155 - 4300 0.0003847255 0 2.7029216e-05 9.6204756e-07 1.140804e-06 10.292319 - 4400 0.0003844421 0 2.6841047e-05 9.6570404e-07 1.2319818e-06 10.286203 - 4500 0.0003842788 0 2.6633558e-05 9.6452478e-07 1.1954945e-06 10.278287 - 4600 0.00038365139 0 2.6514403e-05 9.6185846e-07 1.2002452e-06 10.270732 - 4700 0.00038271503 0 2.6374349e-05 9.4061833e-07 1.1774211e-06 10.264796 - 4800 0.00038233688 0 2.638398e-05 1.1644119e-06 1.3746239e-06 10.25742 - 4900 0.00038223496 0 2.6279821e-05 1.1345508e-06 1.4709213e-06 10.246987 - 5000 0.00038219402 0 2.6188871e-05 1.0115151e-06 1.2024203e-06 10.240511 - 5100 0.00038195153 0 2.6137945e-05 1.009856e-06 1.1961088e-06 10.236014 - 5200 0.00038170903 0 2.6103563e-05 1.0046761e-06 1.1881008e-06 10.232236 - 5300 0.00038194303 0 2.6111938e-05 1.0533375e-06 1.2621634e-06 10.230617 - 5400 0.00038147407 0 2.6078641e-05 1.082228e-06 1.2915223e-06 10.230098 - 5500 0.00038156894 0 2.6084488e-05 1.1395485e-06 1.3592644e-06 10.227759 - 5600 0.00038169434 0 2.6085704e-05 1.1173618e-06 1.3003599e-06 10.2256 - 5700 0.00038219734 0 2.6095279e-05 1.1026614e-06 1.280455e-06 10.223621 - 5800 0.00038268758 0 2.6113437e-05 1.1096198e-06 1.2565503e-06 10.222902 - 5900 0.00038300658 0 2.6131709e-05 1.1123595e-06 1.235992e-06 10.222182 - 6000 0.00038250316 0 2.606995e-05 1.1590744e-06 1.2888416e-06 10.221123 - 6100 0.0003821526 0 2.6025605e-05 1.1434025e-06 1.3141861e-06 10.219503 - 6200 0.00038185711 0 2.5991255e-05 1.1471391e-06 1.3427373e-06 10.219503 - 6300 0.00038197679 0 2.5996965e-05 1.1338082e-06 1.3315258e-06 10.218604 - 6400 0.00038232311 0 2.6035805e-05 1.1353407e-06 1.3306683e-06 10.217884 - 6500 0.00038255543 0 2.6091572e-05 1.1768703e-06 1.3629611e-06 10.217704 - 6600 0.00038251887 0 2.6068968e-05 1.1808094e-06 1.3969697e-06 10.217344 - 6700 0.00038177389 0 2.6004288e-05 1.1659866e-06 1.423638e-06 10.218084 - 6800 0.00038096291 0 2.5969494e-05 1.1377343e-06 1.4348787e-06 10.218103 - 6900 0.00038090601 0 2.5951546e-05 1.1327767e-06 1.4311663e-06 10.217024 - 7000 0.00038088094 0 2.5946255e-05 1.1652568e-06 1.4567559e-06 10.215944 - 7100 0.00038094624 0 2.5972593e-05 1.1558871e-06 1.4692935e-06 10.214684 - 7200 0.00038168738 0 2.6002e-05 1.1562707e-06 1.4881081e-06 10.212705 - 7300 0.00038200854 0 2.6038768e-05 1.1339903e-06 1.4808455e-06 10.212345 - 7400 0.00038187543 0 2.6044759e-05 1.101743e-06 1.4758679e-06 10.213084 - 7500 0.00038165297 0 2.6004536e-05 1.0892731e-06 1.4872621e-06 10.214742 -Loop time of 28.804 on 4 procs for 7500 steps with 11111 atoms - -Performance: 1124843.305 tau/day, 260.380 timesteps/s -97.5% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.26977 | 0.28058 | 0.2866 | 1.3 | 0.97 -Bond | 22.742 | 23.598 | 24.671 | 16.6 | 81.92 -Neigh | 0.54555 | 0.5728 | 0.60272 | 3.2 | 1.99 -Comm | 1.4024 | 2.5619 | 3.5079 | 54.8 | 8.89 -Output | 0.025307 | 0.025833 | 0.027022 | 0.4 | 0.09 -Modify | 1.592 | 1.6506 | 1.7059 | 4.0 | 5.73 -Other | | 0.1147 | | | 0.40 - -Nlocal: 2777.75 ave 2887 max 2682 min -Histogram: 1 0 0 0 2 0 0 0 0 1 -Nghost: 1152.5 ave 1189 max 1125 min -Histogram: 1 0 1 0 0 1 0 0 0 1 -Neighs: 11515.5 ave 12520 max 10831 min -Histogram: 1 1 0 0 1 0 0 0 0 1 - -Total # of neighbors = 46062 -Ave neighs/atom = 4.1456215 -Ave special neighs/atom = 10.214742 -Neighbor list builds = 408 -Dangerous builds = 0 -Total wall time: 0:00:28 diff --git a/examples/bpm/impact/log.4May2022.impact.rotational.g++.4 b/examples/bpm/impact/log.4May2022.impact.rotational.g++.4 new file mode 100644 index 0000000000..8eb87d3c2e --- /dev/null +++ b/examples/bpm/impact/log.4May2022.impact.rotational.g++.4 @@ -0,0 +1,219 @@ +LAMMPS (4 May 2022) +units lj +dimension 3 +boundary f f f +atom_style bpm/sphere +special_bonds lj 0.0 1.0 1.0 coul 0.0 1.0 1.0 +newton on off +comm_modify vel yes cutoff 2.6 +lattice fcc 1.0 +Lattice spacing in x,y,z = 1.5874011 1.5874011 1.5874011 +region box block -25 15 -22 22 -22 22 +create_box 1 box bond/types 2 extra/bond/per/atom 20 extra/special/per/atom 50 +Created orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) + 1 by 2 by 2 MPI processor grid + +region disk cylinder x 0.0 0.0 20.0 -0.5 0.5 +create_atoms 1 region disk +Created 7529 atoms + using lattice units in orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) + create_atoms CPU = 0.002 seconds +group plate region disk +7529 atoms in group plate + +region ball sphere 8.0 0.0 0.0 6.0 +create_atoms 1 region ball +Created 3589 atoms + using lattice units in orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) + create_atoms CPU = 0.001 seconds +group projectile region ball +3589 atoms in group projectile + +displace_atoms all random 0.1 0.1 0.1 134598738 +Displacing atoms ... + +neighbor 1.0 bin +pair_style gran/hooke/history 1.0 NULL 0.5 NULL 0.1 1 +pair_coeff 1 1 + +fix 1 all nve/bpm/sphere + +create_bonds many plate plate 1 0.0 1.5 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2.6 + binsize = 1, bins = 64 70 70 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) command create_bonds, occasional + attributes: full, newton on + pair build: full/bin + stencil: full/bin/3d + bin: standard + (2) pair gran/hooke/history, perpetual + attributes: half, newton on, size, history + pair build: half/size/bin/newton + stencil: half/bin/3d + bin: standard +Added 38559 bonds, new total = 38559 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 15 = max # of 1-2 neighbors + 101 = max # of special neighbors + special bonds CPU = 0.001 seconds +create_bonds many projectile projectile 2 0.0 1.5 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: Bonds are defined but no bond style is set (../force.cpp:192) +WARNING: Likewise 1-2 special neighbor interactions != 1.0 (../force.cpp:194) +Added 21869 bonds, new total = 60428 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 16 = max # of 1-2 neighbors + 101 = max # of special neighbors + special bonds CPU = 0.002 seconds + +neighbor 0.3 bin +special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 + +bond_style bpm/rotational store/local brkbond 100 time id1 id2 +bond_coeff 1 1.0 0.2 0.02 0.02 0.05 0.01 0.01 0.01 0.1 0.2 0.002 0.002 +bond_coeff 2 1.0 0.2 0.02 0.02 0.20 0.04 0.04 0.04 0.1 0.2 0.002 0.002 + +velocity projectile set -0.05 0.0 0.0 +compute nbond all nbond/atom +compute tbond all reduce sum c_nbond + +timestep 0.05 +thermo_style custom step ke pe pxx pyy pzz c_tbond +thermo 100 +thermo_modify lost ignore lost/bond ignore +#dump 1 all custom 100 atomDump id radius x y z c_nbond + +dump 2 all local 100 brokenDump f_brkbond[1] f_brkbond[2] f_brkbond[3] +dump_modify 2 header no + +run 7500 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.3 + ghost atom cutoff = 2.6 + binsize = 0.65, bins = 98 108 108 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair gran/hooke/history, perpetual + attributes: half, newton on, size, history + pair build: half/size/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 33.22 | 33.22 | 33.22 Mbytes + Step KinEng PotEng Pxx Pyy Pzz c_tbond + 0 0.00053238861 0 3.8217307e-05 -7.6534847e-14 1.9906102e-13 10.8703 + 100 0.00053238861 0 3.8217307e-05 -4.2831948e-13 5.7428612e-13 10.8703 + 200 0.00053238861 0 3.8217307e-05 -1.4067913e-12 1.4975493e-12 10.8703 + 300 0.00053238861 0 3.8217307e-05 -8.77782e-13 3.8245851e-13 10.8703 + 400 0.00053238861 0 3.8217307e-05 -8.5835238e-13 6.5448014e-13 10.8703 + 500 0.00053093549 0 4.0340893e-05 4.501394e-07 5.3690512e-07 10.8703 + 600 0.00051485902 0 6.6761034e-05 4.6258948e-06 5.2285428e-06 10.869221 + 700 0.00049942978 0 9.5499005e-05 9.3031413e-07 4.5389354e-06 10.85501 + 800 0.00049465262 0 5.6810167e-05 -5.5619903e-06 -1.6010295e-06 10.820651 + 900 0.00048784775 0 1.5747004e-05 2.0522042e-05 2.5481542e-05 10.769563 + 1000 0.00048345699 0 2.1159666e-05 1.2232747e-05 1.4767665e-05 10.730347 + 1100 0.00047945073 0 5.2779833e-05 -2.6136504e-05 -2.7689007e-05 10.703184 + 1200 0.00047512604 0 6.3234312e-05 -1.7082136e-05 -2.9178979e-05 10.686634 + 1300 0.00047401428 0 2.5474717e-05 -7.4782876e-06 -1.9808965e-05 10.678 + 1400 0.00047619121 0 2.5189461e-05 2.9476227e-06 -4.4149511e-06 10.671704 + 1500 0.0004668728 0 5.8798861e-05 -2.6192143e-06 1.0805172e-06 10.666127 + 1600 0.00045088371 0 5.8377694e-05 2.2911269e-06 4.339717e-06 10.66073 + 1700 0.00044275099 0 4.0766018e-05 2.7748031e-05 2.8202527e-05 10.6458 + 1800 0.0004424362 0 3.0460351e-05 2.9690484e-05 3.3464889e-05 10.620615 + 1900 0.00043678957 0 3.809598e-05 2.4448755e-06 1.2651201e-05 10.603166 + 2000 0.00042747562 0 4.2315209e-05 -7.6783024e-06 -3.3357359e-06 10.576003 + 2100 0.0004214344 0 2.6171505e-05 5.5424035e-06 -4.1153085e-06 10.539845 + 2200 0.00041712779 0 3.0796803e-05 1.1362383e-05 7.7103875e-07 10.49937 + 2300 0.00041095769 0 4.141148e-05 1.4142023e-06 -1.0982633e-05 10.471668 + 2400 0.00040883568 0 3.5835323e-05 -1.0216635e-05 -2.3669763e-05 10.45116 + 2500 0.00040762685 0 2.879385e-05 -1.4074395e-05 -1.9314875e-05 10.437309 + 2600 0.00040579873 0 2.771644e-05 -2.316844e-05 -2.2961097e-05 10.422378 + 2700 0.00040340975 0 3.4482945e-05 -3.075929e-05 -2.3321344e-05 10.410505 + 2800 0.00040170914 0 3.1147943e-05 -2.4329639e-05 -1.1787678e-05 10.400792 + 2900 0.00040015113 0 2.3214992e-05 -1.8068374e-05 3.8127871e-06 10.393416 + 3000 0.00040029253 0 2.7275906e-05 -7.0762689e-06 1.3782424e-05 10.385321 + 3100 0.00040037329 0 2.962113e-05 -1.3795312e-06 5.3267315e-06 10.378485 + 3200 0.00040142612 0 2.86096e-05 4.4289601e-06 -3.3950404e-06 10.373988 + 3300 0.00040105092 0 2.5423615e-05 9.5689359e-06 -2.5296344e-06 10.370031 + 3400 0.00039950673 0 2.6405258e-05 9.5776239e-06 -7.3789982e-07 10.364274 + 3500 0.00039715236 0 3.115696e-05 1.0986224e-05 6.6898207e-06 10.360496 + 3600 0.00039446552 0 2.8426837e-05 9.6296098e-06 1.5057875e-05 10.353121 + 3700 0.00039263296 0 2.567768e-05 6.347291e-06 2.4842157e-05 10.346645 + 3800 0.00039061341 0 2.7635193e-05 5.0165135e-06 2.5989901e-05 10.341069 + 3900 0.00038985051 0 2.8639932e-05 1.056365e-05 2.4463803e-05 10.329196 + 4000 0.00038815347 0 2.6613146e-05 2.0316396e-05 2.1434368e-05 10.318043 + 4100 0.00038651302 0 2.4759493e-05 1.9632349e-05 1.3524912e-05 10.311027 + 4200 0.00038565809 0 2.5290845e-05 1.9908233e-05 8.3895516e-06 10.299155 + 4300 0.0003847255 0 2.6461182e-05 1.9385332e-05 5.664874e-06 10.292319 + 4400 0.0003844421 0 2.4464435e-05 1.4675545e-05 6.8223863e-06 10.286203 + 4500 0.0003842788 0 2.3080348e-05 7.1469159e-06 6.8395849e-06 10.278287 + 4600 0.00038365139 0 2.4937615e-05 2.3854793e-06 4.6100509e-06 10.270732 + 4700 0.00038271503 0 2.431281e-05 -3.127707e-06 3.8840673e-07 10.264796 + 4800 0.00038233688 0 2.3727372e-05 -3.9575833e-06 1.5658614e-06 10.25742 + 4900 0.00038223496 0 2.3842519e-05 2.6005447e-06 4.5031882e-06 10.246987 + 5000 0.00038219402 0 2.4705111e-05 8.2018492e-06 4.0121467e-06 10.240511 + 5100 0.00038195153 0 2.5112089e-05 9.1687723e-06 3.3825795e-06 10.236014 + 5200 0.00038170903 0 2.4166312e-05 4.6680528e-06 3.0359762e-06 10.232236 + 5300 0.00038194303 0 2.4293657e-05 3.067111e-06 2.1353614e-06 10.230617 + 5400 0.00038147407 0 2.472142e-05 5.2915485e-06 -1.7472423e-06 10.230098 + 5500 0.00038156894 0 2.4839317e-05 6.6216457e-06 -2.7544087e-06 10.227759 + 5600 0.00038169434 0 2.4600407e-05 3.8679618e-06 1.2622251e-07 10.2256 + 5700 0.00038219734 0 2.4459589e-05 2.0025919e-07 -1.1917672e-08 10.223621 + 5800 0.00038268758 0 2.4768428e-05 8.7913744e-07 -1.4000329e-06 10.222902 + 5900 0.00038300658 0 2.4827866e-05 3.6621944e-06 -2.2178729e-07 10.222182 + 6000 0.00038250316 0 2.4309432e-05 4.3755483e-06 2.2736019e-06 10.221123 + 6100 0.0003821526 0 2.4396115e-05 3.3855804e-06 4.4742551e-06 10.219503 + 6200 0.00038185711 0 2.4795348e-05 1.7569948e-06 4.3229904e-06 10.219503 + 6300 0.00038197679 0 2.4817115e-05 1.237731e-07 3.9285574e-06 10.218604 + 6400 0.00038232311 0 2.4723664e-05 -8.7946112e-07 2.6215619e-06 10.217884 + 6500 0.00038255543 0 2.4821878e-05 -4.8948257e-07 3.9392146e-07 10.217704 + 6600 0.00038251887 0 2.4923895e-05 -1.1107041e-07 -8.3900047e-07 10.217344 + 6700 0.00038177389 0 2.4664007e-05 -6.4474733e-07 -2.1004826e-06 10.218084 + 6800 0.00038096291 0 2.4262293e-05 -1.7159941e-06 -2.8149643e-06 10.218103 + 6900 0.00038090601 0 2.4179172e-05 -2.2622259e-06 -2.1268271e-06 10.217024 + 7000 0.00038088094 0 2.4363443e-05 -2.4652531e-06 -8.209416e-07 10.215944 + 7100 0.00038094624 0 2.5119358e-05 -1.5432706e-06 1.1465135e-06 10.214684 + 7200 0.00038168738 0 2.5565338e-05 -1.4052753e-07 3.3146851e-06 10.212705 + 7300 0.00038200854 0 2.5436565e-05 4.353807e-07 3.3504276e-06 10.212345 + 7400 0.00038187543 0 2.4764819e-05 6.7297502e-07 1.5923471e-06 10.213084 + 7500 0.00038165297 0 2.4015684e-05 7.8657712e-07 1.0138435e-06 10.214742 +Loop time of 32.2292 on 4 procs for 7500 steps with 11111 atoms + +Performance: 1005300.744 tau/day, 232.709 timesteps/s +96.2% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.29763 | 0.30464 | 0.31393 | 1.1 | 0.95 +Bond | 25.936 | 26.533 | 27.431 | 11.7 | 82.33 +Neigh | 0.60911 | 0.63557 | 0.66475 | 2.8 | 1.97 +Comm | 1.7247 | 2.7138 | 3.3823 | 40.5 | 8.42 +Output | 0.020408 | 0.020935 | 0.02227 | 0.5 | 0.06 +Modify | 1.8299 | 1.8724 | 1.9325 | 2.9 | 5.81 +Other | | 0.1491 | | | 0.46 + +Nlocal: 2777.75 ave 2887 max 2682 min +Histogram: 1 0 0 0 2 0 0 0 0 1 +Nghost: 1152.5 ave 1189 max 1125 min +Histogram: 1 0 1 0 0 1 0 0 0 1 +Neighs: 11515.5 ave 12520 max 10831 min +Histogram: 1 1 0 0 1 0 0 0 0 1 + +Total # of neighbors = 46062 +Ave neighs/atom = 4.1456215 +Ave special neighs/atom = 10.214742 +Neighbor list builds = 408 +Dangerous builds = 0 +Total wall time: 0:00:32 diff --git a/examples/bpm/pour/in.bpm.pour b/examples/bpm/pour/in.bpm.pour index e4cc8557a3..d9bb60674a 100644 --- a/examples/bpm/pour/in.bpm.pour +++ b/examples/bpm/pour/in.bpm.pour @@ -19,6 +19,9 @@ bond_coeff 1 1.0 0.2 0.01 0.01 2.0 0.4 0.02 0.02 0.2 0.04 0.002 0.002 compute nbond all nbond/atom compute tbond all reduce sum c_nbond +compute bond_ids all property/local batom1 batom2 +compute bond_properties all bond/local dist b1 + compute_modify thermo_temp dynamic/dof yes fix 1 all wall/gran hertz/history 1.0 NULL 0.5 NULL 0.1 1 zplane 0.0 NULL @@ -31,5 +34,7 @@ timestep 0.05 thermo_style custom step ke pe pxx pyy pzz c_tbond thermo 100 #dump 1 all custom 500 atomDump id radius x y z c_nbond mol +#dump 2 all local 500 bondDump c_bond_ids[*] c_bond_properties[*] +#dump_modify 2 colname 1 "id1" colname 2 "id2" colname 3 "r" colname 4 "r0" run 100000 diff --git a/examples/bpm/pour/log.17Feb2022.pour.g++.4 b/examples/bpm/pour/log.17Feb2022.pour.g++.4 deleted file mode 100644 index a61c0f1181..0000000000 --- a/examples/bpm/pour/log.17Feb2022.pour.g++.4 +++ /dev/null @@ -1,1091 +0,0 @@ -LAMMPS (17 Feb 2022) -units lj -dimension 3 -boundary m m m -atom_style bpm/sphere -special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 -newton on off -comm_modify vel yes cutoff 3.3 -region box block -15 15 -15 15 0 60.0 -create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50 -Created orthogonal box = (-15 -15 0) to (15 15 60) - 1 by 1 by 4 MPI processor grid - -molecule my_mol "rect.mol" -Read molecule template my_mol: - 1 molecules - 0 fragments - 63 atoms with max type 1 - 297 bonds with max type 1 - 0 angles with max type 0 - 0 dihedrals with max type 0 - 0 impropers with max type 0 -region wall_cyl cylinder z 0.0 0.0 10.0 EDGE EDGE side in -region dropzone cylinder z 0.0 0.0 10.0 40.0 50.0 side in - -pair_style gran/hertz/history 1.0 NULL 0.5 NULL 0.1 1 -bond_style bpm/rotational -pair_coeff 1 1 -bond_coeff 1 1.0 0.2 0.01 0.01 2.0 0.4 0.02 0.02 0.2 0.04 0.002 0.002 - -compute nbond all nbond/atom -compute tbond all reduce sum c_nbond -compute_modify thermo_temp dynamic/dof yes - -fix 1 all wall/gran hertz/history 1.0 NULL 0.5 NULL 0.1 1 zplane 0.0 NULL -fix 2 all wall/gran/region hertz/history 1.0 NULL 0.5 NULL 0.1 1 region wall_cyl -fix 3 all gravity 1e-4 vector 0 0 -1 -fix 4 all deposit 40 0 1500 712511343 mol my_mol region dropzone near 2.0 vz -0.05 -0.05 -fix 5 all nve/bpm/sphere - -timestep 0.05 -thermo_style custom step ke pe pxx pyy pzz c_tbond -thermo 100 -#dump 1 all custom 500 atomDump id radius x y z c_nbond mol - -run 100000 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.3 - ghost atom cutoff = 3.3 - binsize = 0.65, bins = 47 47 93 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair gran/hertz/history, perpetual - attributes: half, newton on, size, history - pair build: half/size/bin/newton - stencil: half/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.515 | 6.515 | 6.515 Mbytes -Step KinEng PotEng Pxx Pyy Pzz c_tbond - 0 -0 0 0 0 0 0 - 100 0.0018331948 0 2.0050936e-07 1.2082282e-06 2.8712165e-06 9.4285714 - 200 0.0025933558 0 7.3469794e-07 2.0155735e-06 3.3061759e-06 9.4285714 - 300 0.0036964813 0 3.7946479e-07 5.3005435e-06 2.9691719e-06 9.4285714 - 400 0.0060104433 0 1.5778321e-06 8.4396021e-06 4.0232206e-06 9.4285714 - 500 0.0074435972 0 1.6102287e-06 1.1551491e-05 4.2257246e-06 9.4285714 - 600 0.0077862298 0 1.048357e-06 1.3758458e-05 3.3770448e-06 9.4285714 - 700 0.0075577591 0 1.1527593e-06 1.2533681e-05 3.9545936e-06 9.4285714 - 800 0.0073958844 0 1.1164823e-06 1.2917327e-05 3.2263757e-06 9.4285714 - 900 0.007553697 0 1.190904e-06 1.3294768e-05 3.1421027e-06 9.4285714 - 1000 0.0075815901 0 1.0181785e-06 1.3265265e-05 3.4107996e-06 9.4285714 - 1100 0.0075277384 0 2.0708356e-06 1.2219251e-05 3.2773337e-06 9.4285714 - 1200 0.0075026507 0 1.8286317e-06 1.2395764e-05 3.2819583e-06 9.4285714 - 1300 0.0075665473 0 1.8498736e-06 1.2455125e-05 3.3519775e-06 9.4285714 - 1400 0.0076224701 0 3.1234422e-06 1.0777609e-05 3.8865172e-06 9.4285714 - 1500 0.007603467 0 2.8536732e-06 1.1077739e-05 3.8107558e-06 9.4285714 - 1600 0.0059810407 0 4.3809396e-06 1.6996767e-05 6.5539764e-06 9.4285714 - 1700 0.0080230318 0 5.7884097e-06 2.4435559e-05 7.2370109e-06 9.4285714 - 1800 0.0087482398 0 5.9323986e-06 2.7190078e-05 7.7151041e-06 9.4285714 - 1900 0.0086877574 0 6.1023555e-06 2.6625737e-05 7.8193078e-06 9.4285714 - 2000 0.0086771118 0 6.1635853e-06 2.633267e-05 8.0008845e-06 9.4285714 - 2100 0.0084670091 0 6.7873752e-06 2.5434046e-05 9.0971224e-06 9.4285714 - 2200 0.0083650907 0 8.1704442e-06 2.3699108e-05 8.4515642e-06 9.4285714 - 2300 0.0083549595 0 8.2648511e-06 2.2510949e-05 8.2508581e-06 9.4285714 - 2400 0.0083151535 0 7.7718631e-06 2.2224878e-05 8.8086351e-06 9.4285714 - 2500 0.0083898757 0 7.1987828e-06 2.2855932e-05 9.1000336e-06 9.4285714 - 2600 0.0084145705 0 6.968992e-06 2.3030741e-05 9.2694955e-06 9.4285714 - 2700 0.0082712696 0 7.5971438e-06 2.3186553e-05 1.026296e-05 9.4285714 - 2800 0.0073688706 0 1.0092165e-05 1.6341178e-05 1.0496887e-05 9.4285714 - 2900 0.0072732669 0 8.9857642e-06 1.454313e-05 1.0637501e-05 9.4285714 - 3000 0.0072225948 0 8.5616417e-06 1.4225089e-05 1.0924921e-05 9.4285714 - 3100 0.0048244969 0 6.912522e-06 1.30395e-05 1.3824006e-05 9.4285714 - 3200 0.0045717035 0 5.7159512e-06 1.1181938e-05 1.5108391e-05 9.4285714 - 3300 0.0047679567 0 6.0163783e-06 1.1603014e-05 1.5759942e-05 9.4285714 - 3400 0.0048448212 0 6.3252851e-06 1.2378054e-05 1.5212593e-05 9.4285714 - 3500 0.0048364711 0 6.4847771e-06 1.2719874e-05 1.4888067e-05 9.4285714 - 3600 0.0047125947 0 7.5131511e-06 1.375252e-05 1.5244253e-05 9.4285714 - 3700 0.0045641049 0 7.3441262e-06 1.2981907e-05 1.5049034e-05 9.4285714 - 3800 0.0045540235 0 6.8443099e-06 1.1748155e-05 1.4685806e-05 9.4285714 - 3900 0.0047271202 0 6.7919886e-06 1.2153009e-05 1.4801772e-05 9.4285714 - 4000 0.0049115261 0 6.9084016e-06 1.2385892e-05 1.5231153e-05 9.4285714 - 4100 0.0046819157 0 6.4190119e-06 1.1228312e-05 1.5132413e-05 9.4285714 - 4200 0.0035133816 0 3.6896921e-06 6.5442286e-06 1.4368405e-05 9.4285714 - 4300 0.0031933917 0 1.9641761e-06 3.4983806e-06 1.6912795e-05 9.4285714 - 4400 0.0033515272 0 2.3967939e-06 4.0160705e-06 1.7056596e-05 9.4285714 - 4500 0.0034928951 0 3.0724834e-06 4.4355514e-06 1.6962392e-05 9.4285714 - 4600 0.0029992338 0 3.319899e-06 4.3436095e-06 2.0334274e-05 9.4285714 - 4700 0.0030650658 0 3.9633397e-06 5.6588274e-06 1.8991224e-05 9.4285714 - 4800 0.0031180382 0 4.925768e-06 6.3708181e-06 1.7810728e-05 9.4285714 - 4900 0.0030365003 0 4.6849771e-06 5.6291872e-06 1.8029418e-05 9.4285714 - 5000 0.0030259714 0 5.1846803e-06 5.5730554e-06 1.7488984e-05 9.4285714 - 5100 0.0030499975 0 5.6322417e-06 5.9148203e-06 1.6923105e-05 9.4285714 - 5200 0.003005436 0 5.6903188e-06 5.6637593e-06 1.6700127e-05 9.4285714 - 5300 0.0030000941 0 5.7591855e-06 5.3398134e-06 1.6904108e-05 9.4285714 - 5400 0.0031465827 0 6.1148362e-06 6.2148373e-06 1.7041724e-05 9.4285714 - 5500 0.0031981585 0 5.8718482e-06 5.9970835e-06 1.7984043e-05 9.4285714 - 5600 0.0031525115 0 5.3390747e-06 5.1610119e-06 1.8924721e-05 9.4285714 - 5700 0.0032128781 0 5.6775112e-06 5.2023225e-06 1.9109577e-05 9.4285714 - 5800 0.0030092855 0 5.7676512e-06 4.4808095e-06 2.1160289e-05 9.4285714 - 5900 0.0025015767 0 6.5110611e-06 5.0853279e-06 2.290709e-05 9.4285714 - 6000 0.0024438438 0 6.4803568e-06 4.9314657e-06 2.1450483e-05 9.4285714 - 6100 0.0023816456 0 4.2004621e-06 4.3412206e-06 2.3366694e-05 9.4285714 - 6200 0.0024459343 0 3.4052114e-06 2.3122757e-06 2.3018902e-05 9.4285714 - 6300 0.0025205884 0 3.0607555e-06 2.7404005e-06 2.3612151e-05 9.4285714 - 6400 0.0033754198 0 5.4041464e-06 1.0129204e-05 2.3881911e-05 9.4285714 - 6500 0.0037812296 0 6.9287106e-06 1.2845513e-05 2.4385157e-05 9.4285714 - 6600 0.0038043567 0 4.4366794e-06 1.559564e-05 2.4372156e-05 9.4285714 - 6700 0.0038213959 0 5.6461713e-06 1.6081939e-05 2.556403e-05 9.4285714 - 6800 0.0036977776 0 6.1083638e-06 1.3260883e-05 2.8030458e-05 9.4285714 - 6900 0.0034769765 0 4.281986e-06 1.4287795e-05 2.803258e-05 9.4285714 - 7000 0.0031526409 0 4.8687091e-06 1.1290097e-05 2.9635973e-05 9.4285714 - 7100 0.00317737 0 4.866629e-06 9.8108506e-06 3.1076433e-05 9.4285714 - 7200 0.0034448361 0 4.6533797e-06 1.15597e-05 3.0195614e-05 9.4285714 - 7300 0.0036147362 0 3.4867601e-06 1.2192841e-05 3.0431851e-05 9.4285714 - 7400 0.0035651675 0 2.812314e-06 1.0900977e-05 2.9422055e-05 9.4285714 - 7500 0.0036394064 0 2.6684242e-06 1.038371e-05 2.9650533e-05 9.4285714 - 7600 0.0033086177 0 2.6357178e-06 1.0363505e-05 3.3327311e-05 9.4285714 - 7700 0.0033410425 0 3.9955363e-06 9.2059943e-06 3.3580724e-05 9.4285714 - 7800 0.0035764747 0 7.127102e-06 8.9311151e-06 3.402089e-05 9.4285714 - 7900 0.0039500913 0 1.1222589e-05 9.0137729e-06 3.5074285e-05 9.4285714 - 8000 0.0042963353 0 1.5982303e-05 8.4904673e-06 3.5704562e-05 9.4285714 - 8100 0.0048297614 0 2.2809259e-05 7.6782291e-06 3.714467e-05 9.4285714 - 8200 0.0052301447 0 2.8015774e-05 6.9131186e-06 3.8310186e-05 9.4285714 - 8300 0.005169511 0 2.8580467e-05 6.1476914e-06 3.7651259e-05 9.4285714 - 8400 0.005224324 0 2.9402221e-05 5.0117679e-06 3.873174e-05 9.4285714 - 8500 0.0053049309 0 3.0666777e-05 4.125785e-06 3.9482985e-05 9.4285714 - 8600 0.0052459952 0 3.0525628e-05 4.1952646e-06 3.8726938e-05 9.4285714 - 8700 0.0052955657 0 3.0177531e-05 5.0224986e-06 3.8941323e-05 9.4285714 - 8800 0.0053972257 0 3.1021226e-05 5.261711e-06 3.9283466e-05 9.4285714 - 8900 0.0053679679 0 3.1133172e-05 4.9109387e-06 3.9111316e-05 9.4285714 - 9000 0.0053793586 0 3.0629197e-05 5.8147275e-06 3.8870113e-05 9.4285714 - 9100 0.0048447626 0 3.0571485e-05 6.6542996e-06 4.1908678e-05 9.4285714 - 9200 0.0048688926 0 3.0874982e-05 6.5780749e-06 4.2143302e-05 9.4285714 - 9300 0.0048538957 0 3.0564193e-05 8.1762092e-06 4.2503239e-05 9.4285714 - 9400 0.0046986454 0 2.8378911e-05 1.0639019e-05 4.4317403e-05 9.4285714 - 9500 0.0046145139 0 2.513485e-05 1.036053e-05 4.5570422e-05 9.4285714 - 9600 0.0045277961 0 2.056713e-05 9.8647996e-06 4.5858869e-05 9.4285714 - 9700 0.0043935298 0 1.8390341e-05 9.0322729e-06 4.6271482e-05 9.4285714 - 9800 0.0045363488 0 2.0469706e-05 9.7216528e-06 4.5805899e-05 9.4285714 - 9900 0.0046509978 0 1.9525081e-05 9.5233466e-06 4.862056e-05 9.4285714 - 10000 0.0046493894 0 1.7602305e-05 9.4408537e-06 5.0053515e-05 9.4285714 - 10100 0.0046514856 0 1.6724832e-05 9.9699479e-06 4.928713e-05 9.4285714 - 10200 0.0046209533 0 1.4889196e-05 1.0767419e-05 4.9829248e-05 9.4285714 - 10300 0.0044651031 0 1.0578209e-05 1.1339471e-05 5.1024934e-05 9.4285714 - 10400 0.0041834162 0 6.5253227e-06 1.099852e-05 5.0813498e-05 9.4285714 - 10500 0.0043218845 0 7.2170142e-06 1.2622523e-05 5.0759877e-05 9.4285714 - 10600 0.0045795722 0 1.0140572e-05 2.1058806e-05 5.4332689e-05 9.4285714 - 10700 0.0053833569 0 1.2245942e-05 3.2705455e-05 5.5584298e-05 9.4285714 - 10800 0.0056805981 0 9.642689e-06 4.0045088e-05 5.6378884e-05 9.4285714 - 10900 0.0057157307 0 9.8421383e-06 3.9670248e-05 5.7196914e-05 9.4285714 - 11000 0.005696424 0 1.1871435e-05 3.7351501e-05 5.7130853e-05 9.4285714 - 11100 0.0052078884 0 9.5005747e-06 3.612037e-05 5.1606236e-05 9.4285714 - 11200 0.0052849159 0 1.433919e-05 3.596257e-05 4.8371986e-05 9.4285714 - 11300 0.0054074494 0 1.2828165e-05 3.7628808e-05 5.0495681e-05 9.4285714 - 11400 0.0055432168 0 1.1770167e-05 3.7223129e-05 5.4498301e-05 9.4285714 - 11500 0.0054679467 0 1.1215128e-05 3.5612418e-05 5.5880978e-05 9.4285714 - 11600 0.0052706441 0 1.0611988e-05 3.5785457e-05 5.8094083e-05 9.4285714 - 11700 0.0053724243 0 1.1867616e-05 3.484887e-05 5.7967416e-05 9.4285714 - 11800 0.0054759961 0 9.3774866e-06 3.3307362e-05 6.0256027e-05 9.4285714 - 11900 0.0051146604 0 9.5582838e-06 3.1092749e-05 5.4847298e-05 9.4285714 - 12000 0.0049723565 0 8.4734692e-06 3.1240602e-05 5.3118854e-05 9.4285714 - 12100 0.0046920113 0 8.8947651e-06 3.3402795e-05 5.6254952e-05 9.4285714 - 12200 0.0049570244 0 1.0006616e-05 3.306729e-05 6.1049649e-05 9.4285714 - 12300 0.0049181458 0 8.1394364e-06 3.2634327e-05 6.2527089e-05 9.4285714 - 12400 0.0049245342 0 8.1971979e-06 3.3145464e-05 6.2091332e-05 9.4285714 - 12500 0.0049753042 0 8.9911646e-06 3.4018861e-05 6.1487068e-05 9.4285714 - 12600 0.0048148791 0 8.560766e-06 2.9647432e-05 6.2929427e-05 9.4285714 - 12700 0.0043852178 0 7.5889296e-06 1.8576839e-05 6.5947945e-05 9.4285714 - 12800 0.0041967317 0 8.6473249e-06 1.3892779e-05 6.6599779e-05 9.4285714 - 12900 0.0041911278 0 9.3489002e-06 1.8180223e-05 6.3308096e-05 9.4285714 - 13000 0.0043107924 0 8.5274073e-06 2.2286145e-05 5.9964925e-05 9.4285714 - 13100 0.0043976521 0 8.2741734e-06 2.4530103e-05 5.9567889e-05 9.4285714 - 13200 0.0043474635 0 9.2173493e-06 2.7514155e-05 5.4579308e-05 9.4285714 - 13300 0.0044593969 0 9.3356325e-06 3.0558484e-05 5.3771437e-05 9.4285714 - 13400 0.0044814342 0 9.2387466e-06 2.8998024e-05 5.5887559e-05 9.4285714 - 13500 0.0043982498 0 9.4867492e-06 2.5493297e-05 5.7396094e-05 9.4285714 - 13600 0.0039378503 0 1.0789003e-05 1.9448677e-05 6.1667698e-05 9.4285714 - 13700 0.0036474735 0 1.0885233e-05 1.5729573e-05 5.8520214e-05 9.4285714 - 13800 0.0038236277 0 1.3819358e-05 2.0470733e-05 5.4960098e-05 9.4285714 - 13900 0.0040574402 0 1.6741444e-05 2.391221e-05 5.4045411e-05 9.4285714 - 14000 0.0046440817 0 2.2494809e-05 2.9264007e-05 5.6648145e-05 9.4285714 - 14100 0.0048045755 0 2.2568279e-05 3.260884e-05 5.6960992e-05 9.4285714 - 14200 0.004634799 0 2.2650329e-05 2.7912328e-05 5.7597129e-05 9.4285714 - 14300 0.0046822822 0 2.3142295e-05 2.8536673e-05 5.7795199e-05 9.4285714 - 14400 0.0048282958 0 2.2560586e-05 3.2744704e-05 5.8133575e-05 9.4285714 - 14500 0.004799276 0 2.1374014e-05 3.1342428e-05 6.0569089e-05 9.4285714 - 14600 0.0046554419 0 2.0804876e-05 2.8534311e-05 6.0800428e-05 9.4285714 - 14700 0.0045262414 0 2.1835372e-05 2.8168699e-05 6.2901651e-05 9.4285714 - 14800 0.0043347498 0 1.9615887e-05 3.1686326e-05 6.4194237e-05 9.4285714 - 14900 0.0040641791 0 1.8621801e-05 2.7440899e-05 6.4602045e-05 9.4285714 - 15000 0.0040014911 0 1.6461776e-05 2.5832508e-05 6.08965e-05 9.4285714 - 15100 0.0040015198 0 2.2331361e-05 2.6108777e-05 5.9319862e-05 9.4285714 - 15200 0.004656209 0 3.5268101e-05 3.0082568e-05 5.958373e-05 9.4285714 - 15300 0.0047390215 0 4.1830227e-05 2.7233725e-05 5.8274008e-05 9.4285714 - 15400 0.0047219857 0 4.2798722e-05 2.8282959e-05 5.786682e-05 9.4285714 - 15500 0.0049597215 0 4.5190515e-05 2.9504603e-05 6.2435065e-05 9.4285714 - 15600 0.0049081505 0 4.3186089e-05 2.9977425e-05 6.1726635e-05 9.4285714 - 15700 0.0047978977 0 4.1446883e-05 2.7814159e-05 5.7947919e-05 9.4285714 - 15800 0.0048176861 0 3.9941014e-05 2.6548461e-05 5.9246093e-05 9.4285714 - 15900 0.0049895331 0 4.0485733e-05 2.8703855e-05 6.3382653e-05 9.4285714 - 16000 0.0049288669 0 3.892315e-05 2.9191325e-05 6.2118616e-05 9.4285714 - 16100 0.0048010252 0 3.7199431e-05 2.7134167e-05 6.1752588e-05 9.4285714 - 16200 0.0047925554 0 3.5806262e-05 2.5024463e-05 6.3068301e-05 9.4285714 - 16300 0.0047652048 0 3.3940221e-05 2.6543134e-05 6.7111166e-05 9.4285714 - 16400 0.0043495894 0 3.4655351e-05 1.8892916e-05 6.5825804e-05 9.4285714 - 16500 0.0042677893 0 3.4188541e-05 1.7570016e-05 6.3850178e-05 9.4285714 - 16600 0.0039924053 0 3.2417741e-05 1.7848282e-05 6.5817879e-05 9.4285714 - 16700 0.004110225 0 3.3539186e-05 1.9943078e-05 6.4568545e-05 9.4285714 - 16800 0.0041003344 0 3.6503679e-05 2.0546394e-05 6.2227252e-05 9.4285714 - 16900 0.0040916821 0 3.7342085e-05 2.384663e-05 6.0859481e-05 9.4285714 - 17000 0.0039812122 0 3.671505e-05 2.4137888e-05 5.6933083e-05 9.4285714 - 17100 0.0042480582 0 3.9654732e-05 2.4691844e-05 5.8210554e-05 9.4285714 - 17200 0.0044450353 0 4.0933677e-05 3.019578e-05 5.5604765e-05 9.4285714 - 17300 0.0045016689 0 4.0563484e-05 3.4710888e-05 5.2933625e-05 9.4285714 - 17400 0.0044798864 0 4.0768397e-05 3.3076261e-05 5.2287655e-05 9.4285714 - 17500 0.0044624458 0 3.8361144e-05 3.4320802e-05 5.4620342e-05 9.4285714 - 17600 0.0044477024 0 3.6643486e-05 3.6449296e-05 5.4759028e-05 9.4285714 - 17700 0.0044103517 0 3.8319719e-05 3.7509764e-05 5.0738749e-05 9.4285714 - 17800 0.004341948 0 3.8052635e-05 3.6850602e-05 5.0481977e-05 9.4285714 - 17900 0.0042623319 0 3.5909432e-05 3.5619615e-05 5.2184073e-05 9.4285714 - 18000 0.003726239 0 1.8245827e-05 3.791319e-05 5.0575431e-05 9.4285714 - 18100 0.0034893305 0 1.7957847e-05 3.6788428e-05 5.281228e-05 9.4285714 - 18200 0.0035481187 0 2.2513253e-05 3.461697e-05 5.1791689e-05 9.4285714 - 18300 0.0036251402 0 2.5159661e-05 3.4782379e-05 5.0946509e-05 9.4285714 - 18400 0.0036369749 0 2.4150699e-05 3.6305943e-05 5.0273557e-05 9.4285714 - 18500 0.0034279849 0 2.050142e-05 3.3762641e-05 5.0772554e-05 9.4285714 - 18600 0.0033615572 0 1.8397654e-05 3.3183402e-05 5.2215005e-05 9.4285714 - 18700 0.003406225 0 1.9609619e-05 3.4353871e-05 5.1091792e-05 9.4285714 - 18800 0.0034922323 0 1.9330569e-05 3.4176016e-05 5.2688824e-05 9.4285714 - 18900 0.0034820625 0 1.9280274e-05 3.3807796e-05 5.372272e-05 9.4285714 - 19000 0.0033272524 0 1.6873326e-05 3.594881e-05 5.3862535e-05 9.4285714 - 19100 0.0034010912 0 1.8030816e-05 3.582088e-05 5.4236353e-05 9.4285714 - 19200 0.0030932535 0 1.4863995e-05 2.7793367e-05 5.3934101e-05 9.4285714 - 19300 0.002624051 0 1.210198e-05 1.6467088e-05 5.2583223e-05 9.4285714 - 19400 0.0027583806 0 1.2008108e-05 2.1017092e-05 5.309485e-05 9.4285714 - 19500 0.0029775174 0 1.3352592e-05 2.4636522e-05 5.4043107e-05 9.4285714 - 19600 0.0028689969 0 1.3488363e-05 2.4373881e-05 5.7585286e-05 9.4285714 - 19700 0.0026399127 0 1.4002066e-05 2.7370388e-05 5.4220539e-05 9.4285714 - 19800 0.0025439904 0 1.668679e-05 2.7178009e-05 5.3083248e-05 9.4285714 - 19900 0.0027074939 0 1.5155901e-05 2.5194957e-05 5.3757244e-05 9.4285714 - 20000 0.0027181793 0 1.2268581e-05 2.5236301e-05 5.1395997e-05 9.4285714 - 20100 0.0027315362 0 1.2532955e-05 2.4069296e-05 5.2648391e-05 9.4285714 - 20200 0.0027204191 0 1.2457637e-05 2.419839e-05 5.2229242e-05 9.4285714 - 20300 0.0026457344 0 1.3573924e-05 2.3628429e-05 4.9330286e-05 9.4285714 - 20400 0.0026592475 0 1.3439645e-05 2.4469429e-05 5.1570429e-05 9.4285714 - 20500 0.0026129298 0 1.3261647e-05 2.4468607e-05 5.1163936e-05 9.4285714 - 20600 0.0026532045 0 1.5275975e-05 2.3494207e-05 5.0569472e-05 9.4285714 - 20700 0.0026172433 0 1.4720887e-05 2.1839292e-05 5.0769214e-05 9.4285714 - 20800 0.0025282343 0 1.3852135e-05 2.0845003e-05 4.9690546e-05 9.4285714 - 20900 0.0025383322 0 1.353444e-05 2.2097076e-05 5.1303519e-05 9.4285714 - 21000 0.0024848857 0 1.4032657e-05 2.1964185e-05 5.3050324e-05 9.4285714 - 21100 0.0025091105 0 1.5334232e-05 2.1760041e-05 5.508965e-05 9.4285714 - 21200 0.0027229411 0 1.9418427e-05 2.2335523e-05 5.5657372e-05 9.4285714 - 21300 0.0028888226 0 2.3631969e-05 2.2967648e-05 5.5948438e-05 9.4285714 - 21400 0.0029336429 0 2.5044169e-05 2.2567194e-05 5.5413722e-05 9.4285714 - 21500 0.0029354446 0 2.4712642e-05 2.2624219e-05 5.5920832e-05 9.4285714 - 21600 0.0029270648 0 2.3842417e-05 2.3011885e-05 5.6087719e-05 9.4285714 - 21700 0.0029288781 0 2.3942959e-05 2.2810041e-05 5.7045772e-05 9.4285714 - 21800 0.002884005 0 2.4455829e-05 2.3081577e-05 5.6212968e-05 9.4285714 - 21900 0.0028362206 0 2.3350532e-05 2.49708e-05 5.3642917e-05 9.4285714 - 22000 0.0027784436 0 2.3311918e-05 2.3033334e-05 5.4359393e-05 9.4285714 - 22100 0.0027479829 0 2.4623514e-05 2.0287924e-05 5.3550114e-05 9.4285714 - 22200 0.0027598842 0 2.6073037e-05 2.1629185e-05 5.3119193e-05 9.4285714 - 22300 0.0026078138 0 2.6348246e-05 2.3093425e-05 5.4029431e-05 9.4285714 - 22400 0.0026057112 0 2.7316001e-05 2.4771567e-05 5.3484921e-05 9.4285714 - 22500 0.0026641722 0 2.6434166e-05 2.5849367e-05 5.2175653e-05 9.4285714 - 22600 0.0023728105 0 2.4436322e-05 2.4147316e-05 5.3971034e-05 9.4285714 - 22700 0.0021999097 0 2.4191892e-05 2.2725939e-05 5.3125105e-05 9.4285714 - 22800 0.002178124 0 2.4122577e-05 2.0194755e-05 5.3468522e-05 9.4285714 - 22900 0.0022903704 0 2.1332487e-05 1.8921598e-05 5.4657879e-05 9.4285714 - 23000 0.0022114595 0 1.930828e-05 1.4423335e-05 5.5387271e-05 9.4285714 - 23100 0.0022473179 0 2.0911663e-05 1.3467616e-05 5.4325686e-05 9.4285714 - 23200 0.0022787302 0 2.1538492e-05 1.5779872e-05 5.3591578e-05 9.4285714 - 23300 0.002254193 0 2.0552374e-05 1.7158208e-05 5.201196e-05 9.4285714 - 23400 0.0022032528 0 2.0514024e-05 1.6045426e-05 5.1691057e-05 9.4285714 - 23500 0.0022103262 0 2.2570839e-05 1.4990595e-05 5.0102702e-05 9.4285714 - 23600 0.0022767949 0 2.153875e-05 1.5934866e-05 4.9843486e-05 9.4285714 - 23700 0.002283034 0 2.0348727e-05 1.5852737e-05 4.9211887e-05 9.4285714 - 23800 0.0022293403 0 2.045052e-05 1.3951752e-05 4.9265994e-05 9.4285714 - 23900 0.0022421499 0 2.0541393e-05 1.3873188e-05 4.9783702e-05 9.4285714 - 24000 0.0022708179 0 2.0733448e-05 1.4464939e-05 5.0156761e-05 9.4285714 - 24100 0.0022311644 0 2.1753043e-05 1.4644732e-05 5.3630645e-05 9.4285714 - 24200 0.0022566051 0 2.3030277e-05 1.4212031e-05 5.3868685e-05 9.4285714 - 24300 0.0022547585 0 2.3946322e-05 1.331734e-05 5.2948407e-05 9.4285714 - 24400 0.0022901257 0 2.552016e-05 1.4594528e-05 5.3067402e-05 9.4285714 - 24500 0.0023537103 0 2.9369007e-05 1.5861923e-05 5.3200721e-05 9.4285714 - 24600 0.0023613708 0 2.9444021e-05 1.3691716e-05 5.4296289e-05 9.4285714 - 24700 0.0023237992 0 2.8805716e-05 1.1616027e-05 5.4142589e-05 9.4285714 - 24800 0.0024221927 0 3.1070958e-05 1.2059146e-05 5.406912e-05 9.4285714 - 24900 0.0025882547 0 3.7453428e-05 1.2082125e-05 5.4439426e-05 9.4285714 - 25000 0.0027152266 0 4.2549028e-05 1.1637136e-05 5.4292043e-05 9.4285714 - 25100 0.0028201154 0 4.6710609e-05 1.2903782e-05 5.3790595e-05 9.4285714 - 25200 0.0029086169 0 4.756645e-05 1.3260261e-05 5.7165687e-05 9.4285714 - 25300 0.0028528211 0 4.8705176e-05 1.1918164e-05 5.632163e-05 9.4285714 - 25400 0.0027655631 0 4.7538544e-05 1.186744e-05 5.3917832e-05 9.4285714 - 25500 0.0027631455 0 4.7296868e-05 1.2125391e-05 5.2651056e-05 9.4285714 - 25600 0.0027455338 0 4.8477007e-05 1.2403172e-05 5.7029384e-05 9.4285714 - 25700 0.0027314337 0 4.8377711e-05 1.254263e-05 5.7035789e-05 9.4285714 - 25800 0.0026789336 0 4.9232002e-05 1.1749936e-05 5.7580068e-05 9.4285714 - 25900 0.0026686904 0 5.0376929e-05 1.2811492e-05 5.9087927e-05 9.4285714 - 26000 0.0026703643 0 5.0974299e-05 1.3064292e-05 5.7801118e-05 9.4285714 - 26100 0.0026825353 0 4.9500137e-05 1.1676376e-05 5.695664e-05 9.4285714 - 26200 0.0026825174 0 4.972182e-05 1.0546822e-05 5.7622991e-05 9.4285714 - 26300 0.0025517718 0 4.36237e-05 1.082888e-05 5.8496458e-05 9.4285714 - 26400 0.002448155 0 3.6914303e-05 1.1208368e-05 6.0071981e-05 9.4285714 - 26500 0.0023334395 0 3.2968743e-05 1.0745176e-05 6.0011765e-05 9.4285714 - 26600 0.0023097701 0 3.0179184e-05 1.1497687e-05 5.9980393e-05 9.4285714 - 26700 0.0023614287 0 3.1929774e-05 1.4076482e-05 5.767606e-05 9.4285714 - 26800 0.0023955623 0 3.1551792e-05 1.7121208e-05 5.8187883e-05 9.4285714 - 26900 0.0019993736 0 1.8807723e-05 1.6770089e-05 5.7954922e-05 9.4285714 - 27000 0.0019497677 0 1.7354388e-05 1.6608976e-05 5.6225802e-05 9.4285714 - 27100 0.0020363076 0 2.1348268e-05 1.6918233e-05 5.7949239e-05 9.4285714 - 27200 0.0021974785 0 2.5205825e-05 2.0142198e-05 5.5376701e-05 9.4285714 - 27300 0.002350289 0 2.8900121e-05 2.3754068e-05 5.5263555e-05 9.4285714 - 27400 0.0026460053 0 3.2553147e-05 3.227333e-05 5.7954104e-05 9.4285714 - 27500 0.0027599044 0 3.2851254e-05 3.674649e-05 5.6341966e-05 9.4285714 - 27600 0.0026660556 0 3.2389038e-05 3.4626306e-05 5.5414375e-05 9.4285714 - 27700 0.0026060398 0 3.3223431e-05 3.2391399e-05 5.3340397e-05 9.4285714 - 27800 0.002724511 0 3.372415e-05 3.4485846e-05 5.4707128e-05 9.4285714 - 27900 0.0027318479 0 3.3234708e-05 3.5304313e-05 5.5589046e-05 9.4285714 - 28000 0.0026231478 0 3.2741313e-05 3.3225541e-05 5.398932e-05 9.4285714 - 28100 0.0025508556 0 3.3833477e-05 3.1513842e-05 5.4023598e-05 9.4285714 - 28200 0.0025807152 0 3.4548289e-05 3.3420009e-05 5.5627424e-05 9.4285714 - 28300 0.0024074206 0 3.0461599e-05 3.4140994e-05 5.6820341e-05 9.4285714 - 28400 0.0021292859 0 2.3624321e-05 3.4194604e-05 5.3656462e-05 9.4285714 - 28500 0.0022172558 0 1.8989998e-05 3.8241372e-05 5.0308571e-05 9.4285714 - 28600 0.0022653927 0 2.0006228e-05 4.1839298e-05 5.3834698e-05 9.4285714 - 28700 0.0025914898 0 2.4417865e-05 5.4161998e-05 5.2309701e-05 9.4285714 - 28800 0.0028276024 0 2.7173934e-05 5.9987722e-05 5.1277434e-05 9.4285714 - 28900 0.0029326653 0 2.9972273e-05 5.9404465e-05 5.3442041e-05 9.4285714 - 29000 0.002965493 0 3.0732118e-05 5.8813779e-05 5.4010354e-05 9.4285714 - 29100 0.0029096903 0 2.789911e-05 5.6948857e-05 5.3811328e-05 9.4285714 - 29200 0.0028604262 0 2.8541368e-05 5.5433392e-05 5.5266978e-05 9.4285714 - 29300 0.0028093312 0 3.1626568e-05 5.2793462e-05 5.9393321e-05 9.4285714 - 29400 0.0026786162 0 2.6580766e-05 4.1761109e-05 6.3731211e-05 9.4285714 - 29500 0.0025387867 0 2.4586262e-05 3.1439522e-05 6.5207101e-05 9.4285714 - 29600 0.0026569564 0 2.658665e-05 3.344894e-05 6.5578568e-05 9.4285714 - 29700 0.0027207144 0 2.4629031e-05 3.1640582e-05 7.3229358e-05 9.4285714 - 29800 0.0026892821 0 2.0092233e-05 2.9124688e-05 8.0756571e-05 9.4285714 - 29900 0.002643369 0 2.0481401e-05 3.0183662e-05 7.7273404e-05 9.4285714 - 30000 0.0026484998 0 1.9889243e-05 3.0560067e-05 7.7261634e-05 9.4285714 - 30100 0.0028058509 0 2.6399165e-05 3.004015e-05 8.3212623e-05 9.4285714 - 30200 0.0030353215 0 3.6921703e-05 3.4899864e-05 7.8543173e-05 9.4285714 - 30300 0.0030244988 0 4.0706399e-05 3.6091245e-05 7.4921988e-05 9.4285714 - 30400 0.0030855053 0 4.2502388e-05 3.8438853e-05 7.6268037e-05 9.4285714 - 30500 0.0031141819 0 4.3996743e-05 4.3726389e-05 6.8459715e-05 9.4285714 - 30600 0.0030115458 0 4.436657e-05 4.2288168e-05 6.5970726e-05 9.4285714 - 30700 0.0029700178 0 4.2448638e-05 4.1066034e-05 6.7905919e-05 9.4285714 - 30800 0.0029985358 0 4.3581039e-05 4.2782359e-05 6.616813e-05 9.4285714 - 30900 0.0029689517 0 4.3664983e-05 4.0341198e-05 6.6701993e-05 9.4285714 - 31000 0.0029622718 0 4.3233863e-05 3.8109114e-05 6.615517e-05 9.4285714 - 31100 0.0029693917 0 4.3443429e-05 3.6045147e-05 6.6807218e-05 9.4285714 - 31200 0.0027246348 0 3.8812502e-05 2.5969873e-05 6.9745525e-05 9.4285714 - 31300 0.0025368424 0 3.4331267e-05 2.1427734e-05 6.9565964e-05 9.4285714 - 31400 0.0023736698 0 3.2043786e-05 1.9880875e-05 6.6817156e-05 9.4285714 - 31500 0.0023946514 0 3.3170726e-05 1.9958211e-05 7.0242984e-05 9.4285714 - 31600 0.0025648037 0 3.5948214e-05 2.4022282e-05 7.8512704e-05 9.4285714 - 31700 0.0026956511 0 3.9195772e-05 3.3270216e-05 7.4223245e-05 9.4285714 - 31800 0.002677722 0 3.8651034e-05 3.4084086e-05 7.3747643e-05 9.4285714 - 31900 0.0026705496 0 3.8515991e-05 3.3258169e-05 7.4757118e-05 9.4285714 - 32000 0.0026466417 0 4.2241836e-05 3.449171e-05 7.0551161e-05 9.4285714 - 32100 0.0026464292 0 4.0974715e-05 3.6570061e-05 6.5387411e-05 9.4285714 - 32200 0.0023705665 0 2.951869e-05 3.011444e-05 6.6589524e-05 9.4285714 - 32300 0.0023183595 0 2.2729207e-05 3.0010044e-05 7.2706128e-05 9.4285714 - 32400 0.0023882969 0 2.372595e-05 3.1302357e-05 7.3782281e-05 9.4285714 - 32500 0.0023801754 0 2.2337455e-05 3.0476386e-05 7.5659736e-05 9.4285714 - 32600 0.0024127958 0 2.5510841e-05 3.0854572e-05 7.4410799e-05 9.4285714 - 32700 0.0024031675 0 2.7736693e-05 3.1958346e-05 7.1486437e-05 9.4285714 - 32800 0.0023770089 0 2.6385534e-05 3.3252416e-05 7.2822578e-05 9.4285714 - 32900 0.0023568819 0 2.8634678e-05 3.3258031e-05 6.7686839e-05 9.4285714 - 33000 0.0023407285 0 2.6769773e-05 3.2579304e-05 6.6690925e-05 9.4285714 - 33100 0.002327332 0 2.6645781e-05 3.4007498e-05 6.9628993e-05 9.4285714 - 33200 0.0023912585 0 2.3830565e-05 3.3441643e-05 7.4913813e-05 9.4285714 - 33300 0.0022984153 0 2.4483639e-05 3.2969557e-05 7.7726941e-05 9.4285714 - 33400 0.0022416368 0 2.3898793e-05 3.1031269e-05 7.686001e-05 9.4285714 - 33500 0.0022470637 0 2.0975902e-05 3.0084834e-05 7.570705e-05 9.4285714 - 33600 0.002256129 0 2.0520324e-05 2.8645032e-05 7.7384366e-05 9.4285714 - 33700 0.0022125246 0 1.9872713e-05 2.9850887e-05 7.5881174e-05 9.4285714 - 33800 0.0021842197 0 1.9711523e-05 2.983205e-05 7.3213854e-05 9.4285714 - 33900 0.0021690567 0 1.8055303e-05 2.828677e-05 7.3059722e-05 9.4285714 - 34000 0.0022206311 0 1.8792994e-05 2.8714121e-05 7.5766963e-05 9.4285714 - 34100 0.0022494061 0 2.1426406e-05 2.9683277e-05 7.5164305e-05 9.4285714 - 34200 0.0022085859 0 2.1896897e-05 2.8930132e-05 7.2805525e-05 9.4285714 - 34300 0.0021855633 0 2.0480867e-05 2.9992196e-05 7.2354191e-05 9.4285714 - 34400 0.0021798298 0 2.1236448e-05 3.2053048e-05 7.283282e-05 9.4285714 - 34500 0.0021267289 0 2.2129794e-05 2.8881701e-05 7.1551685e-05 9.4285714 - 34600 0.0020466804 0 2.3010184e-05 2.7531882e-05 7.2523946e-05 9.4285714 - 34700 0.0020969555 0 2.1337061e-05 3.0266865e-05 7.0863423e-05 9.4285714 - 34800 0.0022946237 0 2.2123517e-05 3.8911524e-05 7.2703415e-05 9.4285714 - 34900 0.0024490201 0 2.8420828e-05 5.0378173e-05 7.1772848e-05 9.4285714 - 35000 0.0023320217 0 2.8176618e-05 5.1789577e-05 6.8023074e-05 9.4285714 - 35100 0.0021890324 0 2.4442013e-05 5.2547725e-05 6.1661973e-05 9.4285714 - 35200 0.0022124553 0 2.4530724e-05 5.096875e-05 6.5186855e-05 9.4285714 - 35300 0.0022584165 0 2.7542443e-05 5.427333e-05 6.7536963e-05 9.4285714 - 35400 0.0022737238 0 2.504131e-05 5.4367041e-05 6.7123718e-05 9.4285714 - 35500 0.0021537481 0 2.1567488e-05 4.8699315e-05 6.7335416e-05 9.4285714 - 35600 0.0019831613 0 1.8746091e-05 4.3656184e-05 6.3180625e-05 9.4285714 - 35700 0.0019041909 0 1.9945089e-05 4.3868252e-05 5.8115913e-05 9.4285714 - 35800 0.0018216502 0 2.2392614e-05 4.2188069e-05 5.7629004e-05 9.4285714 - 35900 0.0018071574 0 2.1141753e-05 4.1327783e-05 5.630057e-05 9.4285714 - 36000 0.0018645267 0 2.2735521e-05 4.4296822e-05 5.4259075e-05 9.4285714 - 36100 0.0018474198 0 2.5295637e-05 4.6128849e-05 5.7469914e-05 9.4285714 - 36200 0.0017366166 0 2.6021589e-05 4.5563756e-05 5.5296808e-05 9.4285714 - 36300 0.0016630877 0 2.4135763e-05 4.58324e-05 5.2179718e-05 9.4285714 - 36400 0.0016809967 0 2.3427379e-05 4.7533202e-05 4.714932e-05 9.4285714 - 36500 0.0017478488 0 2.4021161e-05 4.6508842e-05 4.3949519e-05 9.4285714 - 36600 0.0017244649 0 2.3504871e-05 4.3628584e-05 4.3171518e-05 9.4285714 - 36700 0.001694793 0 2.2302323e-05 4.2349904e-05 4.396766e-05 9.4285714 - 36800 0.0016321204 0 2.1042421e-05 3.6396346e-05 4.4901304e-05 9.4285714 - 36900 0.0015208954 0 2.0456403e-05 2.7850556e-05 4.5155127e-05 9.4285714 - 37000 0.0014068755 0 2.0241724e-05 2.1785718e-05 4.5528636e-05 9.4285714 - 37100 0.0013361229 0 1.675977e-05 2.1314381e-05 4.6611487e-05 9.4285714 - 37200 0.001331474 0 1.6204509e-05 2.3621819e-05 5.0433204e-05 9.4285714 - 37300 0.0013895388 0 1.6721652e-05 3.0265014e-05 5.0091541e-05 9.4285714 - 37400 0.001407333 0 1.738976e-05 2.8850978e-05 5.1334019e-05 9.4285714 - 37500 0.0013815772 0 1.6241641e-05 3.0837468e-05 4.6825094e-05 9.4285714 - 37600 0.001367937 0 1.1983552e-05 2.9613642e-05 5.0754355e-05 9.4285714 - 37700 0.0013781896 0 1.1915379e-05 2.9242244e-05 4.8777649e-05 9.4285714 - 37800 0.0013938097 0 1.1529951e-05 3.1628776e-05 4.7715639e-05 9.4285714 - 37900 0.0013788852 0 1.2561324e-05 3.1951817e-05 4.7999073e-05 9.4285714 - 38000 0.0013409916 0 1.2473952e-05 3.1146722e-05 4.8401798e-05 9.4285714 - 38100 0.0013548793 0 1.1004651e-05 2.7320574e-05 4.9651495e-05 9.4285714 - 38200 0.0013619894 0 1.2229314e-05 2.574689e-05 4.9387883e-05 9.4285714 - 38300 0.0013593654 0 1.3392954e-05 2.427172e-05 5.1848635e-05 9.4285714 - 38400 0.0013488508 0 1.256534e-05 2.449982e-05 5.4623064e-05 9.4285714 - 38500 0.0013399961 0 1.2037162e-05 2.0814078e-05 5.6078474e-05 9.4285714 - 38600 0.0013473117 0 1.1744489e-05 1.6853428e-05 5.7231621e-05 9.4285714 - 38700 0.0013275262 0 1.093468e-05 1.4795508e-05 5.769577e-05 9.4285714 - 38800 0.001304838 0 1.1068283e-05 1.3115698e-05 6.0324982e-05 9.4285714 - 38900 0.0012981525 0 1.1709325e-05 1.3131645e-05 5.9760468e-05 9.4285714 - 39000 0.0013241474 0 1.261896e-05 1.4616086e-05 6.0256213e-05 9.4285714 - 39100 0.0013302715 0 1.1838509e-05 1.5600129e-05 6.432053e-05 9.4285714 - 39200 0.0013338793 0 1.2403697e-05 1.6279003e-05 6.2961888e-05 9.4285714 - 39300 0.001337749 0 1.3137034e-05 1.6207867e-05 6.0627848e-05 9.4285714 - 39400 0.0014184127 0 1.6180184e-05 1.8165982e-05 5.8887905e-05 9.4285714 - 39500 0.0015076229 0 1.9522159e-05 1.9795428e-05 5.910332e-05 9.4285714 - 39600 0.001584196 0 2.4027089e-05 2.0838917e-05 5.7603421e-05 9.4285714 - 39700 0.0016673141 0 2.9500045e-05 2.3045542e-05 5.5891462e-05 9.4285714 - 39800 0.0016983633 0 3.0305739e-05 2.4453535e-05 5.5981899e-05 9.4285714 - 39900 0.001721388 0 3.1340689e-05 2.4975831e-05 5.5548483e-05 9.4285714 - 40000 0.0016511866 0 3.370998e-05 2.6328206e-05 5.671433e-05 9.4285714 - 40100 0.0015902117 0 3.3681877e-05 2.5663116e-05 5.3013557e-05 9.4285714 - 40200 0.0016248457 0 3.0865269e-05 2.5397352e-05 5.1452424e-05 9.4285714 - 40300 0.001639017 0 3.1973896e-05 2.5525448e-05 5.4813301e-05 9.4285714 - 40400 0.0015947128 0 3.5965857e-05 2.5225505e-05 5.6385827e-05 9.4285714 - 40500 0.0014886812 0 3.7017265e-05 2.4882355e-05 5.2995469e-05 9.4285714 - 40600 0.001483951 0 3.4221499e-05 2.1479298e-05 5.4046331e-05 9.4285714 - 40700 0.0014877422 0 3.362595e-05 1.8839863e-05 5.5203171e-05 9.4285714 - 40800 0.0014974798 0 3.6392277e-05 1.7485578e-05 5.7247772e-05 9.4285714 - 40900 0.0014499802 0 3.3431089e-05 1.9674968e-05 5.6160238e-05 9.4285714 - 41000 0.001395913 0 2.9658496e-05 1.8273286e-05 5.6527772e-05 9.4285714 - 41100 0.0014079985 0 2.9771219e-05 1.6179289e-05 5.9153644e-05 9.4285714 - 41200 0.0014187083 0 2.7845336e-05 1.9035184e-05 5.7573549e-05 9.4285714 - 41300 0.0014072972 0 2.4886378e-05 2.0795562e-05 5.4986012e-05 9.4285714 - 41400 0.0014168981 0 2.358191e-05 2.1908287e-05 5.4674995e-05 9.4285714 - 41500 0.0014248439 0 2.3385735e-05 2.3170658e-05 5.3269277e-05 9.4285714 - 41600 0.0014225044 0 2.376616e-05 2.5694883e-05 5.2138491e-05 9.4285714 - 41700 0.0014075811 0 2.2374247e-05 2.7567814e-05 5.1299283e-05 9.4285714 - 41800 0.0012680617 0 2.2171263e-05 2.5019906e-05 5.4594068e-05 9.4285714 - 41900 0.0010587818 0 1.5440824e-05 2.093143e-05 5.3361822e-05 9.4285714 - 42000 0.0010007004 0 1.2044875e-05 1.7303459e-05 5.3021476e-05 9.4285714 - 42100 0.0011304402 0 1.2464466e-05 1.9304071e-05 5.5030158e-05 9.4285714 - 42200 0.0012833154 0 1.6978814e-05 2.4344322e-05 5.4664913e-05 9.4285714 - 42300 0.0013573853 0 1.8276863e-05 2.7764513e-05 5.4832226e-05 9.4285714 - 42400 0.0013330633 0 1.7445663e-05 2.5994427e-05 5.6219048e-05 9.4285714 - 42500 0.0012896373 0 1.7549999e-05 2.4461263e-05 5.5316804e-05 9.4285714 - 42600 0.001296775 0 1.7579818e-05 2.4729094e-05 5.4786174e-05 9.4285714 - 42700 0.0013193969 0 1.7589942e-05 2.6653321e-05 5.5601741e-05 9.4285714 - 42800 0.0013144903 0 1.7344148e-05 2.7396405e-05 5.6063261e-05 9.4285714 - 42900 0.0013053554 0 1.812017e-05 2.4357577e-05 5.5400672e-05 9.4285714 - 43000 0.0013061323 0 1.7976023e-05 2.5672617e-05 5.5591174e-05 9.4285714 - 43100 0.0013149372 0 1.8049252e-05 2.7694066e-05 5.7517507e-05 9.4285714 - 43200 0.0013063189 0 1.8000018e-05 2.5312637e-05 5.7758611e-05 9.4285714 - 43300 0.0012669853 0 1.7756679e-05 2.3718058e-05 5.7316755e-05 9.4285714 - 43400 0.0012238388 0 2.0194584e-05 2.1983277e-05 5.5573072e-05 9.4285714 - 43500 0.0012053096 0 2.0662764e-05 2.2371854e-05 5.3240833e-05 9.4285714 - 43600 0.001243323 0 2.3521544e-05 2.3272124e-05 5.4438848e-05 9.4285714 - 43700 0.001354992 0 2.8388806e-05 2.6835727e-05 5.1695181e-05 9.4285714 - 43800 0.0015252788 0 3.4452462e-05 3.2972955e-05 5.1148386e-05 9.4285714 - 43900 0.0016845587 0 3.7891883e-05 3.7259267e-05 5.3712665e-05 9.4285714 - 44000 0.0016987088 0 3.794299e-05 3.9188564e-05 5.22906e-05 9.4285714 - 44100 0.0016663634 0 3.6807094e-05 3.9253716e-05 5.2294244e-05 9.4285714 - 44200 0.0016642734 0 3.7043503e-05 3.9518624e-05 5.2702041e-05 9.4285714 - 44300 0.0016877933 0 3.8179716e-05 4.0630461e-05 5.3339506e-05 9.4285714 - 44400 0.0016937941 0 3.7131293e-05 4.1066259e-05 5.432841e-05 9.4285714 - 44500 0.001658184 0 3.5564842e-05 3.9986051e-05 5.4994687e-05 9.4285714 - 44600 0.0016202756 0 3.6182348e-05 4.0514972e-05 5.4343097e-05 9.4285714 - 44700 0.0012624519 0 3.6496068e-05 3.330838e-05 6.0193182e-05 9.4285714 - 44800 0.0012148648 0 3.7546572e-05 2.4531512e-05 6.0795743e-05 9.4285714 - 44900 0.0012565599 0 2.9767991e-05 2.3526786e-05 5.730112e-05 9.4285714 - 45000 0.0012298496 0 3.3326423e-05 2.2497973e-05 5.3986547e-05 9.4285714 - 45100 0.0012274205 0 3.310721e-05 2.2786466e-05 5.5167469e-05 9.4285714 - 45200 0.0012389066 0 3.4925053e-05 2.3497387e-05 5.4884661e-05 9.4285714 - 45300 0.0012251609 0 3.615161e-05 2.3152279e-05 5.3650078e-05 9.4285714 - 45400 0.0012814774 0 3.746516e-05 2.4153096e-05 5.1029288e-05 9.4285714 - 45500 0.0013450626 0 3.9489551e-05 2.6213973e-05 5.0267505e-05 9.4285714 - 45600 0.0013741472 0 4.2751714e-05 2.6741902e-05 4.9140966e-05 9.4285714 - 45700 0.0014351223 0 4.3930849e-05 2.6748326e-05 4.9411273e-05 9.4285714 - 45800 0.0015284371 0 4.6485067e-05 2.8704517e-05 4.9999511e-05 9.4285714 - 45900 0.001575355 0 4.5717321e-05 3.011393e-05 5.1143199e-05 9.4285714 - 46000 0.0015147792 0 4.1325851e-05 3.0384448e-05 5.1923e-05 9.4285714 - 46100 0.0014504182 0 3.9540594e-05 3.1635289e-05 5.0948968e-05 9.4285714 - 46200 0.0014410639 0 3.965176e-05 3.0362005e-05 4.8786102e-05 9.4285714 - 46300 0.0014810525 0 4.1568241e-05 3.0756475e-05 4.8680363e-05 9.4285714 - 46400 0.0014640215 0 4.309465e-05 2.985089e-05 4.9009517e-05 9.4285714 - 46500 0.0014424933 0 4.2309209e-05 2.9280621e-05 4.8629444e-05 9.4285714 - 46600 0.001441165 0 4.2539286e-05 3.0934085e-05 4.9784857e-05 9.4285714 - 46700 0.0015025344 0 4.4979228e-05 3.1000179e-05 4.8462809e-05 9.4285714 - 46800 0.0015582176 0 4.7282405e-05 3.2706414e-05 4.5724526e-05 9.4285714 - 46900 0.0015803324 0 4.7650091e-05 3.4907217e-05 4.4832148e-05 9.4285714 - 47000 0.001675143 0 5.1693701e-05 3.6882816e-05 4.6006875e-05 9.4285714 - 47100 0.0017769921 0 5.6400585e-05 3.9830957e-05 4.6950937e-05 9.4285714 - 47200 0.0018358006 0 5.9232345e-05 4.3665585e-05 4.6768506e-05 9.4285714 - 47300 0.0017951326 0 5.6422198e-05 4.3944608e-05 4.8336201e-05 9.4285714 - 47400 0.0017057371 0 5.4710398e-05 3.9941549e-05 4.7652027e-05 9.4285714 - 47500 0.0016744493 0 5.2852149e-05 3.7232824e-05 4.5384467e-05 9.4285714 - 47600 0.0014031951 0 4.1326626e-05 3.0025176e-05 4.3875657e-05 9.4285714 - 47700 0.0013373039 0 3.7514245e-05 2.9655038e-05 4.316088e-05 9.4285714 - 47800 0.0014704003 0 4.1417238e-05 3.4940895e-05 4.447442e-05 9.4285714 - 47900 0.0014934525 0 4.3132757e-05 3.7137359e-05 4.4062556e-05 9.4285714 - 48000 0.0014895856 0 4.6046202e-05 3.6927333e-05 4.3726122e-05 9.4285714 - 48100 0.00146967 0 4.6872982e-05 3.9649234e-05 4.597459e-05 9.4285714 - 48200 0.0015682986 0 4.8924923e-05 4.738992e-05 4.3767565e-05 9.4285714 - 48300 0.0017163505 0 5.2171663e-05 5.3787554e-05 4.4084292e-05 9.4285714 - 48400 0.0014261936 0 4.3093196e-05 5.6810791e-05 5.4178929e-05 9.4285714 - 48500 0.0014236361 0 3.9093573e-05 4.8266345e-05 5.346877e-05 9.4285714 - 48600 0.0014562257 0 4.0734834e-05 4.2323892e-05 4.8295024e-05 9.4285714 - 48700 0.0013758282 0 3.6847543e-05 3.5139344e-05 4.8073535e-05 9.4285714 - 48800 0.0014316476 0 3.7554019e-05 3.5556116e-05 4.7370089e-05 9.4285714 - 48900 0.0014805023 0 3.5226264e-05 3.3817592e-05 5.2499511e-05 9.4285714 - 49000 0.0013776549 0 3.2439848e-05 2.997493e-05 5.3101978e-05 9.4285714 - 49100 0.0013617488 0 3.2279492e-05 3.0772411e-05 5.1632538e-05 9.4285714 - 49200 0.0013342401 0 2.8600175e-05 3.2651245e-05 5.3349695e-05 9.4285714 - 49300 0.001276486 0 2.7777544e-05 2.96306e-05 5.4374435e-05 9.4285714 - 49400 0.0011795288 0 2.2827442e-05 2.8085944e-05 5.2012108e-05 9.4285714 - 49500 0.0011435859 0 2.2873378e-05 2.7199584e-05 4.8565744e-05 9.4285714 - 49600 0.001247689 0 2.5002038e-05 3.0378272e-05 5.4987332e-05 9.4285714 - 49700 0.0013371245 0 2.6349724e-05 3.4033827e-05 5.8350385e-05 9.4285714 - 49800 0.001301722 0 2.4983049e-05 3.3355962e-05 5.7259996e-05 9.4285714 - 49900 0.0012728363 0 2.4271773e-05 3.366383e-05 5.4969958e-05 9.4285714 - 50000 0.0013286836 0 2.4626397e-05 3.4888455e-05 5.6333036e-05 9.4285714 - 50100 0.0013460063 0 2.5626025e-05 3.4617082e-05 5.8834535e-05 9.4285714 - 50200 0.0012868089 0 2.3749355e-05 3.3262754e-05 5.7555068e-05 9.4285714 - 50300 0.0012765172 0 2.3286644e-05 3.285494e-05 5.6753429e-05 9.4285714 - 50400 0.0012703222 0 2.2664849e-05 3.2123476e-05 5.8001158e-05 9.4285714 - 50500 0.0011906512 0 1.8988144e-05 2.5734872e-05 6.0360828e-05 9.4285714 - 50600 0.0011537339 0 1.7108695e-05 2.2700119e-05 6.3433107e-05 9.4285714 - 50700 0.0011267336 0 1.7970895e-05 2.4672948e-05 5.8568632e-05 9.4285714 - 50800 0.0011753482 0 1.9468991e-05 2.5939765e-05 5.9862885e-05 9.4285714 - 50900 0.0011919232 0 2.0208188e-05 2.7321787e-05 5.9048906e-05 9.4285714 - 51000 0.0011838525 0 2.1827961e-05 2.9118892e-05 5.2803692e-05 9.4285714 - 51100 0.0011883954 0 2.2709257e-05 2.8506733e-05 5.4654615e-05 9.4285714 - 51200 0.0012349694 0 2.5890907e-05 2.8698467e-05 5.7896353e-05 9.4285714 - 51300 0.0012337432 0 2.7687089e-05 2.7653507e-05 5.9917212e-05 9.4285714 - 51400 0.0011577306 0 2.8378044e-05 2.3224364e-05 5.8057014e-05 9.4285714 - 51500 0.0011811724 0 2.8435714e-05 2.1929674e-05 5.9722575e-05 9.4285714 - 51600 0.0012159313 0 3.1521829e-05 2.2796335e-05 5.924849e-05 9.4285714 - 51700 0.0011936762 0 3.4012729e-05 2.3864808e-05 5.7265759e-05 9.4285714 - 51800 0.00119466 0 3.5158377e-05 2.5231988e-05 5.8412082e-05 9.4285714 - 51900 0.0012013641 0 3.3334001e-05 2.6816388e-05 5.861301e-05 9.4285714 - 52000 0.0011652185 0 3.0940041e-05 2.6655324e-05 5.7090011e-05 9.4285714 - 52100 0.0011222289 0 3.1077905e-05 2.4541748e-05 5.5666069e-05 9.4285714 - 52200 0.0011223637 0 3.2939544e-05 2.5096815e-05 5.6416173e-05 9.4285714 - 52300 0.00108781 0 3.4613486e-05 2.7303053e-05 5.6746437e-05 9.4285714 - 52400 0.0010329114 0 3.6196201e-05 2.8068523e-05 5.2439815e-05 9.4285714 - 52500 0.0010414794 0 3.673215e-05 2.7272718e-05 5.143023e-05 9.4285714 - 52600 0.0011160581 0 3.5468006e-05 2.7495373e-05 5.401667e-05 9.4285714 - 52700 0.0011365494 0 3.6522651e-05 2.8130517e-05 5.1952685e-05 9.4285714 - 52800 0.0011528486 0 3.8067909e-05 3.2231442e-05 4.9590134e-05 9.4285714 - 52900 0.001215765 0 4.2804899e-05 3.6927536e-05 5.1170177e-05 9.4285714 - 53000 0.0013368124 0 4.5592002e-05 4.1563931e-05 5.4427869e-05 9.4285714 - 53100 0.0013407312 0 4.5591201e-05 4.3600841e-05 4.9047373e-05 9.4285714 - 53200 0.0013326843 0 4.4821382e-05 4.1764227e-05 4.6186223e-05 9.4285714 - 53300 0.0013239729 0 4.3827862e-05 4.4020784e-05 4.3852213e-05 9.4285714 - 53400 0.0013217143 0 4.3572994e-05 4.7084118e-05 4.3149657e-05 9.4285714 - 53500 0.0012781803 0 4.460572e-05 4.8061498e-05 4.2708059e-05 9.4285714 - 53600 0.001268382 0 4.458824e-05 4.5673787e-05 4.1230488e-05 9.4285714 - 53700 0.0012069904 0 4.1562438e-05 4.2697726e-05 4.1986265e-05 9.4285714 - 53800 0.0011968988 0 4.5963049e-05 4.0317052e-05 4.3564542e-05 9.4285714 - 53900 0.0011731954 0 4.5626132e-05 3.9016561e-05 4.2699438e-05 9.4285714 - 54000 0.0011606061 0 4.2734103e-05 3.8922865e-05 4.2063758e-05 9.4285714 - 54100 0.0011658982 0 3.9764581e-05 3.672962e-05 4.7476053e-05 9.4285714 - 54200 0.0011195165 0 3.5569124e-05 3.3590873e-05 4.8421311e-05 9.4285714 - 54300 0.0010220393 0 3.2252593e-05 3.0968164e-05 4.987935e-05 9.4285714 - 54400 0.0010086172 0 3.6631232e-05 3.0359237e-05 5.1629214e-05 9.4285714 - 54500 0.0010183988 0 3.7406525e-05 2.632072e-05 5.1823266e-05 9.4285714 - 54600 0.0010068716 0 3.6673782e-05 2.3899354e-05 4.883163e-05 9.4285714 - 54700 0.00099012603 0 3.3975738e-05 2.2165277e-05 4.788027e-05 9.4285714 - 54800 0.0009683722 0 3.235553e-05 2.2982659e-05 5.0112286e-05 9.4285714 - 54900 0.00097629715 0 3.2268492e-05 2.5601046e-05 4.8627644e-05 9.4285714 - 55000 0.00095157382 0 3.1040046e-05 2.437472e-05 4.637034e-05 9.4285714 - 55100 0.00090688968 0 2.9340275e-05 2.1953227e-05 4.3141384e-05 9.4285714 - 55200 0.00088813057 0 2.8284065e-05 2.1733676e-05 4.2934237e-05 9.4285714 - 55300 0.00092557007 0 2.8620339e-05 2.3675426e-05 4.3885475e-05 9.4285714 - 55400 0.00091327263 0 2.762239e-05 2.641616e-05 4.4396082e-05 9.4285714 - 55500 0.00079921186 0 2.9224842e-05 2.5168399e-05 4.3290943e-05 9.4285714 - 55600 0.00081947901 0 2.8418244e-05 2.2268749e-05 4.9968371e-05 9.4285714 - 55700 0.00084804465 0 2.1646302e-05 2.3720621e-05 5.205521e-05 9.4285714 - 55800 0.00085118568 0 2.2504085e-05 2.2872302e-05 4.9963437e-05 9.4285714 - 55900 0.00079015144 0 2.1456661e-05 1.9796776e-05 4.8884464e-05 9.4285714 - 56000 0.00077424122 0 2.2875959e-05 1.721853e-05 4.7217244e-05 9.4285714 - 56100 0.00078729859 0 2.750101e-05 1.8189823e-05 4.7065369e-05 9.4285714 - 56200 0.00073803593 0 2.8848488e-05 1.8153302e-05 4.571796e-05 9.4285714 - 56300 0.00072042566 0 2.842146e-05 1.5690166e-05 4.4828579e-05 9.4285714 - 56400 0.00072618636 0 2.7559372e-05 1.5504007e-05 4.399204e-05 9.4285714 - 56500 0.00072889383 0 2.7924251e-05 1.6823511e-05 4.2305183e-05 9.4285714 - 56600 0.00071687768 0 2.9101443e-05 1.6332857e-05 4.2086891e-05 9.4285714 - 56700 0.00070767909 0 3.0080534e-05 1.532979e-05 4.2661404e-05 9.4285714 - 56800 0.0007079533 0 2.8817943e-05 1.6206535e-05 4.2253735e-05 9.4285714 - 56900 0.00068006672 0 2.7371942e-05 1.7051153e-05 3.9711699e-05 9.4285714 - 57000 0.000671041 0 2.6892964e-05 1.5542748e-05 3.8373488e-05 9.4285714 - 57100 0.00074371147 0 2.8066609e-05 1.8321889e-05 3.9806125e-05 9.4285714 - 57200 0.00081400221 0 2.8670502e-05 2.8899856e-05 4.0663376e-05 9.4285714 - 57300 0.000917037 0 2.7824502e-05 3.9014624e-05 4.2174406e-05 9.4285714 - 57400 0.00094626663 0 2.5794485e-05 4.1535293e-05 4.2086614e-05 9.4285714 - 57500 0.00093346301 0 2.5487117e-05 4.0862488e-05 4.1990151e-05 9.4285714 - 57600 0.00093999622 0 2.6720752e-05 4.0748175e-05 4.3650361e-05 9.4285714 - 57700 0.00094337314 0 2.639701e-05 4.0729782e-05 4.5121665e-05 9.4285714 - 57800 0.00092645123 0 2.6909739e-05 4.0150191e-05 4.3822005e-05 9.4285714 - 57900 0.00091253668 0 2.5642193e-05 3.6671075e-05 4.4028328e-05 9.4285714 - 58000 0.0009262852 0 2.4409205e-05 3.4409346e-05 4.4000636e-05 9.4285714 - 58100 0.00093298888 0 2.3677747e-05 3.2551966e-05 4.3694114e-05 9.4285714 - 58200 0.00093354721 0 2.2375814e-05 3.2117822e-05 4.4639312e-05 9.4285714 - 58300 0.00093283167 0 2.2884257e-05 3.090895e-05 4.5086768e-05 9.4285714 - 58400 0.00093485322 0 2.3712272e-05 3.0236548e-05 4.5930955e-05 9.4285714 - 58500 0.00092566721 0 2.405659e-05 2.87637e-05 4.8903625e-05 9.4285714 - 58600 0.00093205032 0 2.3525309e-05 2.8285934e-05 5.2291285e-05 9.4285714 - 58700 0.00094034992 0 2.4008311e-05 2.5804337e-05 5.3505489e-05 9.4285714 - 58800 0.00096489026 0 2.4355825e-05 2.8532919e-05 5.3761099e-05 9.4285714 - 58900 0.00097781296 0 2.6084526e-05 3.1039765e-05 5.2910774e-05 9.4285714 - 59000 0.00095088201 0 2.7035865e-05 3.1452129e-05 5.3165727e-05 9.4285714 - 59100 0.00092096092 0 2.6786706e-05 3.382956e-05 5.0768712e-05 9.4285714 - 59200 0.0009112309 0 2.5867113e-05 3.4359567e-05 4.9291183e-05 9.4285714 - 59300 0.00090372653 0 2.5622941e-05 3.7144276e-05 4.7289805e-05 9.4285714 - 59400 0.00086115007 0 2.2280155e-05 3.5823023e-05 4.6830658e-05 9.4285714 - 59500 0.00078451189 0 2.2220981e-05 2.6156784e-05 4.6914457e-05 9.4285714 - 59600 0.00078587175 0 2.3370931e-05 2.5032607e-05 4.9704371e-05 9.4285714 - 59700 0.00080103949 0 2.387346e-05 2.8536648e-05 4.7938414e-05 9.4285714 - 59800 0.00078782591 0 2.319423e-05 2.8210585e-05 4.7677072e-05 9.4285714 - 59900 0.00077243837 0 2.3631843e-05 2.8691006e-05 4.7228518e-05 9.4285714 - 60000 0.00075159859 0 2.3775193e-05 2.9335754e-05 4.5277107e-05 9.4285714 - 60100 0.00072169229 0 2.1979779e-05 3.0104074e-05 4.5923405e-05 9.4285714 - 60200 0.00067937954 0 2.0306575e-05 2.8735522e-05 4.5275658e-05 9.4285714 - 60300 0.00067260226 0 2.0810173e-05 2.6609433e-05 4.3648953e-05 9.4285714 - 60400 0.00069286984 0 2.4253823e-05 2.5126495e-05 4.258699e-05 9.4285714 - 60500 0.00069736312 0 2.7101459e-05 2.4283276e-05 4.2346847e-05 9.4285714 - 60600 0.00069858614 0 2.5781332e-05 2.4087945e-05 4.2183121e-05 9.4285714 - 60700 0.00069821214 0 2.4965653e-05 2.080958e-05 4.1576529e-05 9.4285714 - 60800 0.0007035508 0 2.5136105e-05 1.82106e-05 4.2416771e-05 9.4285714 - 60900 0.00070770846 0 2.4339709e-05 1.7024772e-05 4.3565509e-05 9.4285714 - 61000 0.00070195965 0 2.4160978e-05 1.561415e-05 4.4516846e-05 9.4285714 - 61100 0.00067865064 0 2.4754436e-05 1.6095324e-05 4.5917833e-05 9.4285714 - 61200 0.00063690893 0 2.2652857e-05 1.7060397e-05 4.715524e-05 9.4285714 - 61300 0.00064194236 0 2.2650362e-05 1.4267909e-05 4.3531168e-05 9.4285714 - 61400 0.00063121847 0 2.1529461e-05 1.2841701e-05 4.0585367e-05 9.4285714 - 61500 0.00065356029 0 2.3536414e-05 1.3344947e-05 4.1167487e-05 9.4285714 - 61600 0.00066743886 0 2.4866121e-05 1.3946269e-05 4.176316e-05 9.4285714 - 61700 0.00064876312 0 2.3723161e-05 1.3749913e-05 4.2058416e-05 9.4285714 - 61800 0.00063251553 0 2.3037843e-05 1.2308212e-05 4.1311007e-05 9.4285714 - 61900 0.00065196202 0 2.371008e-05 1.2119818e-05 4.1136972e-05 9.4285714 - 62000 0.00066211487 0 2.4305587e-05 1.3415536e-05 4.1013521e-05 9.4285714 - 62100 0.00063838911 0 2.3294318e-05 1.377487e-05 4.0954053e-05 9.4285714 - 62200 0.00062154839 0 2.1558175e-05 1.3359191e-05 4.1245046e-05 9.4285714 - 62300 0.00063042258 0 2.1018073e-05 1.3643859e-05 4.2295629e-05 9.4285714 - 62400 0.00064307282 0 2.2417944e-05 1.3691778e-05 4.3440168e-05 9.4285714 - 62500 0.00062261967 0 2.2993973e-05 1.3754566e-05 4.4100385e-05 9.4285714 - 62600 0.00053916399 0 1.5362019e-05 1.2502815e-05 4.4138039e-05 9.4285714 - 62700 0.00057010612 0 1.5796506e-05 1.2697622e-05 4.4452456e-05 9.4285714 - 62800 0.00057237373 0 1.5874305e-05 1.325341e-05 4.3827972e-05 9.4285714 - 62900 0.00056115858 0 1.6555148e-05 1.3080646e-05 4.434918e-05 9.4285714 - 63000 0.0005691916 0 1.7337274e-05 1.3018716e-05 4.5966666e-05 9.4285714 - 63100 0.00056814223 0 1.8372705e-05 1.3213928e-05 4.5013147e-05 9.4285714 - 63200 0.00055359969 0 1.7755667e-05 1.226889e-05 4.4263871e-05 9.4285714 - 63300 0.00053663894 0 1.6493197e-05 1.0859989e-05 4.3835591e-05 9.4285714 - 63400 0.00055318219 0 1.7265416e-05 1.2265785e-05 4.2879248e-05 9.4285714 - 63500 0.0005601025 0 1.7295499e-05 1.4239119e-05 4.3011721e-05 9.4285714 - 63600 0.00054583913 0 1.6525634e-05 1.4678843e-05 4.2469934e-05 9.4285714 - 63700 0.00053483868 0 1.6625875e-05 1.5078172e-05 4.2493824e-05 9.4285714 - 63800 0.00055522493 0 1.7480604e-05 1.5374684e-05 4.272595e-05 9.4285714 - 63900 0.00056121598 0 1.7772973e-05 1.5172133e-05 4.2798662e-05 9.4285714 - 64000 0.00054407633 0 1.6885044e-05 1.413276e-05 4.2546454e-05 9.4285714 - 64100 0.00053661653 0 1.6234338e-05 1.403684e-05 4.2825695e-05 9.4285714 - 64200 0.00055006192 0 1.6649951e-05 1.4056747e-05 4.3482046e-05 9.4285714 - 64300 0.00055163304 0 1.6461598e-05 1.3167903e-05 4.3726787e-05 9.4285714 - 64400 0.00053078787 0 1.6251525e-05 1.19464e-05 4.3358318e-05 9.4285714 - 64500 0.00052058058 0 1.6643557e-05 1.2630836e-05 4.3429169e-05 9.4285714 - 64600 0.00052834957 0 1.7353655e-05 1.364227e-05 4.2400392e-05 9.4285714 - 64700 0.00051311026 0 1.758087e-05 1.4884436e-05 4.228116e-05 9.4285714 - 64800 0.00048606856 0 1.8167314e-05 1.5185881e-05 4.1313198e-05 9.4285714 - 64900 0.00047345864 0 1.8776746e-05 1.5164217e-05 3.998748e-05 9.4285714 - 65000 0.00048454696 0 1.8995386e-05 1.4818088e-05 3.9244802e-05 9.4285714 - 65100 0.00048928041 0 1.8341025e-05 1.3978549e-05 3.9434274e-05 9.4285714 - 65200 0.00047037779 0 1.7440302e-05 1.2970355e-05 3.8631037e-05 9.4285714 - 65300 0.000474477 0 1.7730462e-05 1.2778417e-05 3.8374171e-05 9.4285714 - 65400 0.00047558993 0 1.8645893e-05 1.303845e-05 3.9299974e-05 9.4285714 - 65500 0.00046258212 0 1.8683635e-05 1.2737042e-05 3.99647e-05 9.4285714 - 65600 0.00044433429 0 1.6571796e-05 1.2754279e-05 3.8518715e-05 9.4285714 - 65700 0.00045238336 0 1.5273478e-05 1.2923777e-05 3.6940008e-05 9.4285714 - 65800 0.00045926142 0 1.5338149e-05 1.2009407e-05 3.6438821e-05 9.4285714 - 65900 0.00045814994 0 1.5980648e-05 1.1749036e-05 3.6297575e-05 9.4285714 - 66000 0.00045395179 0 1.7924167e-05 1.2624087e-05 3.7065746e-05 9.4285714 - 66100 0.00044097892 0 1.9034226e-05 1.356976e-05 3.8933851e-05 9.4285714 - 66200 0.00041508101 0 1.8402026e-05 1.4705713e-05 3.8748663e-05 9.4285714 - 66300 0.00041227685 0 1.908236e-05 1.6649716e-05 3.7753553e-05 9.4285714 - 66400 0.00039539458 0 1.8057048e-05 1.6143874e-05 3.7074006e-05 9.4285714 - 66500 0.00038647539 0 1.698015e-05 1.3801339e-05 3.5358951e-05 9.4285714 - 66600 0.00037432719 0 1.7509843e-05 1.4033428e-05 3.5206119e-05 9.4285714 - 66700 0.00035679642 0 1.8373478e-05 1.412795e-05 3.2664378e-05 9.4285714 - 66800 0.00034618795 0 1.9514845e-05 1.4608894e-05 3.2352472e-05 9.4285714 - 66900 0.00032906055 0 1.8736605e-05 1.523461e-05 3.3161408e-05 9.4285714 - 67000 0.00031945785 0 1.6984612e-05 1.4969242e-05 3.3142807e-05 9.4285714 - 67100 0.00031672216 0 1.7483062e-05 1.5927363e-05 3.3297451e-05 9.4285714 - 67200 0.00030445379 0 1.7092794e-05 1.5979956e-05 3.3953736e-05 9.4285714 - 67300 0.00028386109 0 1.6371034e-05 1.4946504e-05 3.3294272e-05 9.4285714 - 67400 0.00028463754 0 1.6562782e-05 1.522773e-05 3.3193414e-05 9.4285714 - 67500 0.00028212316 0 1.7000058e-05 1.688192e-05 3.0305767e-05 9.4285714 - 67600 0.00027447589 0 1.7252228e-05 1.7793217e-05 2.7940287e-05 9.4285714 - 67700 0.00026388856 0 1.788708e-05 1.7737963e-05 2.7767523e-05 9.4285714 - 67800 0.00024769801 0 1.7986182e-05 1.6911674e-05 2.6242072e-05 9.4285714 - 67900 0.00024192231 0 1.8117237e-05 1.6810584e-05 2.5489128e-05 9.4285714 - 68000 0.00023732277 0 1.7792025e-05 1.6237435e-05 2.3955138e-05 9.4285714 - 68100 0.0002230537 0 1.8040504e-05 1.509807e-05 2.4258324e-05 9.4285714 - 68200 0.00020295655 0 1.7396258e-05 1.432954e-05 2.2297953e-05 9.4285714 - 68300 0.0002040692 0 1.4709241e-05 1.3357816e-05 1.9379008e-05 9.4285714 - 68400 0.0001928169 0 1.3319281e-05 1.3285272e-05 1.9247674e-05 9.4285714 - 68500 0.00019326451 0 1.3554406e-05 1.3433023e-05 2.0649044e-05 9.4285714 - 68600 0.00019061041 0 1.3385102e-05 1.3584385e-05 1.9332432e-05 9.4285714 - 68700 0.00017904605 0 1.3288304e-05 1.3807963e-05 1.7099578e-05 9.4285714 - 68800 0.00017200167 0 1.4014515e-05 1.3305447e-05 1.6005157e-05 9.4285714 - 68900 0.00016728354 0 1.4358398e-05 1.4318143e-05 1.7530654e-05 9.4285714 - 69000 0.00015703321 0 1.5503927e-05 1.5119926e-05 1.7369909e-05 9.4285714 - 69100 0.00014835113 0 1.6646462e-05 1.3971022e-05 1.6344915e-05 9.4285714 - 69200 0.00014631648 0 1.5954987e-05 1.2795675e-05 1.6309035e-05 9.4285714 - 69300 0.00014587978 0 1.5293418e-05 1.2677732e-05 1.7233536e-05 9.4285714 - 69400 0.0001418924 0 1.5258493e-05 1.3019793e-05 1.7515483e-05 9.4285714 - 69500 0.00013332024 0 1.4812384e-05 1.303409e-05 1.7383204e-05 9.4285714 - 69600 0.00013320187 0 1.4156146e-05 1.3180657e-05 1.7662244e-05 9.4285714 - 69700 0.00013039836 0 1.3247552e-05 1.2811783e-05 1.6799406e-05 9.4285714 - 69800 0.00012003394 0 1.2945301e-05 1.2559804e-05 1.5746066e-05 9.4285714 - 69900 0.00011651147 0 1.2355239e-05 1.2393181e-05 1.4350427e-05 9.4285714 - 70000 0.00012197106 0 1.1842768e-05 1.3044816e-05 1.4170863e-05 9.4285714 - 70100 0.00011813389 0 1.1625743e-05 1.3313213e-05 1.5063448e-05 9.4285714 - 70200 0.00011097253 0 1.1590401e-05 1.2554923e-05 1.4597134e-05 9.4285714 - 70300 0.00010887364 0 1.1158154e-05 1.1895927e-05 1.31874e-05 9.4285714 - 70400 0.00010916786 0 1.0956876e-05 1.180273e-05 1.2846539e-05 9.4285714 - 70500 0.00010031774 0 1.0360778e-05 1.1514343e-05 1.2521203e-05 9.4285714 - 70600 9.1002834e-05 0 1.0300514e-05 1.117085e-05 1.1527003e-05 9.4285714 - 70700 8.9186179e-05 0 1.0609829e-05 1.0737094e-05 1.0837865e-05 9.4285714 - 70800 9.1206485e-05 0 1.0401734e-05 9.9843249e-06 1.0249157e-05 9.4285714 - 70900 9.2333335e-05 0 1.0193791e-05 9.0808065e-06 9.8992907e-06 9.4285714 - 71000 9.1646266e-05 0 1.0160677e-05 8.7435373e-06 9.7169582e-06 9.4285714 - 71100 8.9976882e-05 0 1.0153135e-05 9.1409494e-06 9.5718498e-06 9.4285714 - 71200 8.7702811e-05 0 9.8902233e-06 9.1879521e-06 9.8218671e-06 9.4285714 - 71300 8.6905185e-05 0 9.5383545e-06 8.7211783e-06 1.0499374e-05 9.4285714 - 71400 8.5684023e-05 0 9.253314e-06 8.3885129e-06 1.0606272e-05 9.4285714 - 71500 8.303695e-05 0 8.8819413e-06 8.3461936e-06 1.0273368e-05 9.4285714 - 71600 8.0199459e-05 0 8.9747038e-06 8.2066881e-06 9.9704252e-06 9.4285714 - 71700 7.8917712e-05 0 9.0271304e-06 7.7429742e-06 9.9361512e-06 9.4285714 - 71800 8.006745e-05 0 8.8187404e-06 7.4107567e-06 9.9020703e-06 9.4285714 - 71900 7.8740588e-05 0 8.5325535e-06 7.4640436e-06 9.6978695e-06 9.4285714 - 72000 7.758597e-05 0 8.4232259e-06 7.4096936e-06 1.0295265e-05 9.4285714 - 72100 7.7221401e-05 0 8.2221646e-06 7.0735469e-06 1.0729758e-05 9.4285714 - 72200 7.6375029e-05 0 7.8256335e-06 6.6839282e-06 1.0036496e-05 9.4285714 - 72300 7.2834947e-05 0 7.3129398e-06 6.5549375e-06 9.3647818e-06 9.4285714 - 72400 7.2648265e-05 0 7.1756961e-06 6.6155121e-06 9.9549307e-06 9.4285714 - 72500 7.3708292e-05 0 7.2472933e-06 6.3958474e-06 1.0123332e-05 9.4285714 - 72600 7.1153221e-05 0 7.3278587e-06 6.1367701e-06 9.7342661e-06 9.4285714 - 72700 6.9093949e-05 0 7.4363962e-06 5.9533119e-06 9.7560578e-06 9.4285714 - 72800 7.0003138e-05 0 7.5425112e-06 5.8275253e-06 1.0368232e-05 9.4285714 - 72900 7.097186e-05 0 7.4852771e-06 5.9091762e-06 1.0469988e-05 9.4285714 - 73000 6.9754446e-05 0 7.1428704e-06 6.0128613e-06 9.845617e-06 9.4285714 - 73100 6.8919462e-05 0 6.8577848e-06 6.0078752e-06 9.5062768e-06 9.4285714 - 73200 7.0813485e-05 0 6.915193e-06 5.8464766e-06 9.5542243e-06 9.4285714 - 73300 7.2448906e-05 0 7.202029e-06 5.9255145e-06 9.366303e-06 9.4285714 - 73400 7.1636811e-05 0 7.3658376e-06 6.0353436e-06 9.0035204e-06 9.4285714 - 73500 7.0735739e-05 0 7.3378932e-06 5.9233113e-06 9.2103137e-06 9.4285714 - 73600 7.103569e-05 0 7.4016369e-06 5.7191072e-06 9.590302e-06 9.4285714 - 73700 7.1516165e-05 0 7.5406525e-06 5.5544712e-06 9.2023549e-06 9.4285714 - 73800 7.0454708e-05 0 7.349261e-06 5.3580841e-06 8.44158e-06 9.4285714 - 73900 7.0921505e-05 0 7.0116409e-06 5.019628e-06 8.392926e-06 9.4285714 - 74000 7.3462894e-05 0 6.8708293e-06 4.6604305e-06 8.6159539e-06 9.4285714 - 74100 7.3200399e-05 0 6.760504e-06 4.5172181e-06 8.6590907e-06 9.4285714 - 74200 7.1848724e-05 0 6.598806e-06 4.5142909e-06 8.9015449e-06 9.4285714 - 74300 7.2382347e-05 0 6.4910604e-06 4.55638e-06 9.5190459e-06 9.4285714 - 74400 7.3931763e-05 0 6.5463337e-06 4.557173e-06 9.9812236e-06 9.4285714 - 74500 7.4402751e-05 0 6.7422317e-06 4.5967137e-06 9.9997382e-06 9.4285714 - 74600 7.3859362e-05 0 6.7302615e-06 4.5719524e-06 9.8667104e-06 9.4285714 - 74700 7.5361374e-05 0 6.6009004e-06 4.5572386e-06 9.8530775e-06 9.4285714 - 74800 7.7630509e-05 0 6.5656345e-06 4.6832234e-06 9.892975e-06 9.4285714 - 74900 7.7455142e-05 0 6.6195469e-06 4.8215952e-06 9.8988386e-06 9.4285714 - 75000 7.6480769e-05 0 6.6957621e-06 4.8937859e-06 1.0118373e-05 9.4285714 - 75100 7.7275693e-05 0 6.8416988e-06 5.0008953e-06 1.0508524e-05 9.4285714 - 75200 7.8822667e-05 0 7.0137661e-06 5.114046e-06 1.0681512e-05 9.4285714 - 75300 7.923137e-05 0 7.0852228e-06 5.2313082e-06 1.088256e-05 9.4285714 - 75400 7.9015035e-05 0 7.0293657e-06 5.2742411e-06 1.1348177e-05 9.4285714 - 75500 8.0621162e-05 0 6.8467092e-06 5.2679705e-06 1.1831246e-05 9.4285714 - 75600 8.2299447e-05 0 6.6752346e-06 5.2465333e-06 1.1929829e-05 9.4285714 - 75700 8.1993378e-05 0 6.6903556e-06 5.2647445e-06 1.1895978e-05 9.4285714 - 75800 8.1758987e-05 0 6.8566142e-06 5.3086877e-06 1.1919614e-05 9.4285714 - 75900 8.3084215e-05 0 7.0165672e-06 5.385502e-06 1.2070322e-05 9.4285714 - 76000 8.197148e-05 0 7.2302761e-06 5.8394738e-06 1.2278973e-05 9.4285714 - 76100 7.3534139e-05 0 7.7489979e-06 6.0492251e-06 1.2550083e-05 9.4285714 - 76200 6.8283079e-05 0 7.2365372e-06 6.0007678e-06 1.2602817e-05 9.4285714 - 76300 7.8227289e-05 0 6.526694e-06 6.0271465e-06 1.2329383e-05 9.4285714 - 76400 8.2994806e-05 0 6.1815571e-06 5.9430881e-06 1.1701935e-05 9.4285714 - 76500 8.3014892e-05 0 6.1364257e-06 5.9854633e-06 1.1722691e-05 9.4285714 - 76600 8.4226362e-05 0 6.1828506e-06 6.107284e-06 1.1920214e-05 9.4285714 - 76700 8.6131526e-05 0 6.3343928e-06 6.350283e-06 1.228658e-05 9.4285714 - 76800 8.5731394e-05 0 6.4776958e-06 6.4683255e-06 1.249724e-05 9.4285714 - 76900 8.5941781e-05 0 6.4853553e-06 6.4244197e-06 1.2593229e-05 9.4285714 - 77000 8.8001094e-05 0 6.5171523e-06 6.6329655e-06 1.2912514e-05 9.4285714 - 77100 8.7224729e-05 0 6.8494875e-06 7.3872568e-06 1.3297612e-05 9.4285714 - 77200 8.4102799e-05 0 7.0894804e-06 7.3299263e-06 1.367949e-05 9.4285714 - 77300 8.0313409e-05 0 7.4098021e-06 7.2858555e-06 1.3836101e-05 9.4285714 - 77400 7.9230413e-05 0 8.2603924e-06 7.7732932e-06 1.3810185e-05 9.4285714 - 77500 7.811033e-05 0 8.7674355e-06 7.5406409e-06 1.4227076e-05 9.4285714 - 77600 7.7683573e-05 0 9.0788292e-06 7.8133163e-06 1.471022e-05 9.4285714 - 77700 7.5680467e-05 0 8.9108768e-06 8.317342e-06 1.4999553e-05 9.4285714 - 77800 7.3449559e-05 0 8.9694781e-06 8.6900526e-06 1.5086204e-05 9.4285714 - 77900 7.3292429e-05 0 9.139058e-06 8.6084679e-06 1.492615e-05 9.4285714 - 78000 7.2392133e-05 0 9.6080208e-06 8.4852396e-06 1.4857893e-05 9.4285714 - 78100 7.0315679e-05 0 9.945291e-06 8.3218765e-06 1.4719636e-05 9.4285714 - 78200 7.1047062e-05 0 9.8105393e-06 8.1347429e-06 1.4828339e-05 9.4285714 - 78300 6.8370248e-05 0 9.9255038e-06 7.8989844e-06 1.558545e-05 9.4285714 - 78400 6.5550877e-05 0 1.0372272e-05 7.8133098e-06 1.6112e-05 9.4285714 - 78500 6.1683926e-05 0 1.0744202e-05 7.939033e-06 1.6539381e-05 9.4285714 - 78600 6.024047e-05 0 1.0791202e-05 7.9498532e-06 1.6361859e-05 9.4285714 - 78700 5.8543178e-05 0 1.0974316e-05 7.8193457e-06 1.5667857e-05 9.4285714 - 78800 5.5383435e-05 0 1.0534755e-05 7.6453258e-06 1.4396004e-05 9.4285714 - 78900 5.6871546e-05 0 1.0546809e-05 7.6401983e-06 1.380849e-05 9.4285714 - 79000 5.7192958e-05 0 1.0550826e-05 8.0833789e-06 1.3441933e-05 9.4285714 - 79100 4.9998926e-05 0 1.0683768e-05 7.9938172e-06 1.3882479e-05 9.4285714 - 79200 4.9597887e-05 0 1.0901088e-05 7.7919421e-06 1.273575e-05 9.4285714 - 79300 4.8603326e-05 0 1.0971813e-05 8.0875397e-06 1.2027443e-05 9.4285714 - 79400 4.7839304e-05 0 1.0874179e-05 8.144737e-06 1.1956832e-05 9.4285714 - 79500 4.5739018e-05 0 1.076245e-05 8.3910868e-06 1.1534616e-05 9.4285714 - 79600 4.2632104e-05 0 1.0609664e-05 8.6397142e-06 1.1473552e-05 9.4285714 - 79700 4.2716432e-05 0 1.0262604e-05 8.711707e-06 1.0969998e-05 9.4285714 - 79800 4.3345358e-05 0 9.9282847e-06 8.9481901e-06 1.0983222e-05 9.4285714 - 79900 4.2476967e-05 0 9.7375039e-06 9.2548149e-06 1.1285625e-05 9.4285714 - 80000 4.0478442e-05 0 9.558123e-06 8.9295053e-06 1.0784448e-05 9.4285714 - 80100 3.7842198e-05 0 9.0334781e-06 8.2704782e-06 1.0278932e-05 9.4285714 - 80200 2.8735215e-05 0 7.9350731e-06 7.8543447e-06 1.0121553e-05 9.4285714 - 80300 2.5008575e-05 0 7.4613405e-06 7.3076318e-06 9.699202e-06 9.4285714 - 80400 2.7560228e-05 0 7.839602e-06 7.0844901e-06 9.4586824e-06 9.4285714 - 80500 3.0888649e-05 0 8.1838091e-06 6.9204111e-06 9.2656765e-06 9.4285714 - 80600 3.2512804e-05 0 8.4973372e-06 6.7089195e-06 9.1713286e-06 9.4285714 - 80700 3.0635649e-05 0 8.6601613e-06 6.5637472e-06 8.8278453e-06 9.4285714 - 80800 2.7803874e-05 0 8.6135955e-06 6.4140616e-06 8.6556889e-06 9.4285714 - 80900 2.7488104e-05 0 8.7028796e-06 6.3379797e-06 8.3509842e-06 9.4285714 - 81000 2.5760367e-05 0 9.2034736e-06 6.7611736e-06 8.6536526e-06 9.4285714 - 81100 2.0516969e-05 0 9.0513498e-06 6.8144281e-06 9.1119465e-06 9.4285714 - 81200 1.7005384e-05 0 8.916831e-06 6.7768397e-06 9.5240286e-06 9.4285714 - 81300 1.8000969e-05 0 8.7376342e-06 6.8615088e-06 9.6206194e-06 9.4285714 - 81400 1.8404948e-05 0 8.2208204e-06 6.7371396e-06 9.0504462e-06 9.4285714 - 81500 1.7001638e-05 0 8.0003097e-06 6.7725682e-06 8.8647013e-06 9.4285714 - 81600 1.718853e-05 0 7.6914646e-06 6.9104324e-06 8.8869789e-06 9.4285714 - 81700 1.7653551e-05 0 7.3471225e-06 6.8867378e-06 8.8253446e-06 9.4285714 - 81800 1.60697e-05 0 7.0404737e-06 6.8479859e-06 8.5427076e-06 9.4285714 - 81900 1.5286837e-05 0 7.0172686e-06 6.9297068e-06 8.2722832e-06 9.4285714 - 82000 1.6023107e-05 0 7.0983015e-06 6.9736613e-06 8.1332821e-06 9.4285714 - 82100 1.5242285e-05 0 7.0688546e-06 6.8167975e-06 7.6908928e-06 9.4285714 - 82200 1.3697011e-05 0 7.0223727e-06 6.4952373e-06 7.3342404e-06 9.4285714 - 82300 1.3126258e-05 0 7.1571217e-06 6.3810604e-06 7.2195212e-06 9.4285714 - 82400 1.3101796e-05 0 7.2890863e-06 6.3506356e-06 6.9818415e-06 9.4285714 - 82500 1.2930812e-05 0 7.151416e-06 6.216239e-06 6.5772477e-06 9.4285714 - 82600 1.2105591e-05 0 6.7542664e-06 6.1120283e-06 6.3663068e-06 9.4285714 - 82700 1.1430058e-05 0 6.5788951e-06 6.0514089e-06 6.4433754e-06 9.4285714 - 82800 1.1220674e-05 0 6.5791612e-06 6.0531604e-06 6.6770698e-06 9.4285714 - 82900 1.0833337e-05 0 6.47818e-06 6.0122996e-06 6.8321143e-06 9.4285714 - 83000 9.6966107e-06 0 6.2531746e-06 5.9309876e-06 6.8402408e-06 9.4285714 - 83100 9.7912048e-06 0 6.1233799e-06 5.8467558e-06 6.8017122e-06 9.4285714 - 83200 1.0342776e-05 0 6.1812546e-06 5.7996644e-06 6.7456475e-06 9.4285714 - 83300 9.1053605e-06 0 6.2862234e-06 5.7715058e-06 6.6864541e-06 9.4285714 - 83400 8.1376574e-06 0 6.3534217e-06 5.8081229e-06 6.6544011e-06 9.4285714 - 83500 8.3013823e-06 0 6.4049353e-06 5.8627471e-06 6.6442675e-06 9.4285714 - 83600 7.5747246e-06 0 6.3101238e-06 5.9294619e-06 6.6505997e-06 9.4285714 - 83700 6.7051973e-06 0 6.1464953e-06 5.8827036e-06 6.6813364e-06 9.4285714 - 83800 6.7732855e-06 0 6.1039107e-06 5.7663207e-06 6.7463747e-06 9.4285714 - 83900 6.455146e-06 0 6.191176e-06 5.719103e-06 6.7193618e-06 9.4285714 - 84000 6.033363e-06 0 6.1987406e-06 5.6639744e-06 6.7404074e-06 9.4285714 - 84100 6.1544361e-06 0 6.1093662e-06 5.4981158e-06 6.9178146e-06 9.4285714 - 84200 5.8120515e-06 0 5.8682237e-06 5.4078594e-06 7.1748608e-06 9.4285714 - 84300 5.5925414e-06 0 5.8299675e-06 5.4425557e-06 7.3447739e-06 9.4285714 - 84400 5.9495987e-06 0 5.8440449e-06 5.5318695e-06 7.3677152e-06 9.4285714 - 84500 5.7713446e-06 0 5.8137185e-06 5.672038e-06 7.2420253e-06 9.4285714 - 84600 5.2346414e-06 0 5.7724697e-06 5.8135669e-06 7.089944e-06 9.4285714 - 84700 5.3677312e-06 0 5.7932199e-06 5.8900538e-06 6.986661e-06 9.4285714 - 84800 5.5545452e-06 0 5.8402198e-06 5.8520541e-06 6.892677e-06 9.4285714 - 84900 5.35857e-06 0 5.8265347e-06 5.8000233e-06 6.8516545e-06 9.4285714 - 85000 5.4081539e-06 0 5.783936e-06 5.7703706e-06 6.8630043e-06 9.4285714 - 85100 5.6686315e-06 0 5.7695537e-06 5.7106213e-06 6.8449127e-06 9.4285714 - 85200 5.6470622e-06 0 5.8250423e-06 5.6629171e-06 6.774264e-06 9.4285714 - 85300 5.4542991e-06 0 5.9016498e-06 5.6655349e-06 6.7281738e-06 9.4285714 - 85400 5.5974388e-06 0 5.9646597e-06 5.6947162e-06 6.6806947e-06 9.4285714 - 85500 5.9109345e-06 0 5.967179e-06 5.6810561e-06 6.6036521e-06 9.4285714 - 85600 5.8895141e-06 0 5.9638498e-06 5.6150965e-06 6.5709969e-06 9.4285714 - 85700 5.8470051e-06 0 6.0226793e-06 5.5476887e-06 6.650327e-06 9.4285714 - 85800 6.060997e-06 0 6.0805171e-06 5.5114717e-06 6.7408394e-06 9.4285714 - 85900 6.1217894e-06 0 6.1343577e-06 5.5394005e-06 6.8609753e-06 9.4285714 - 86000 5.7550467e-06 0 6.1710899e-06 5.6424943e-06 6.9634617e-06 9.4285714 - 86100 5.6513685e-06 0 6.1564873e-06 5.8517272e-06 6.9818339e-06 9.4285714 - 86200 5.7555479e-06 0 6.1071953e-06 5.9846538e-06 6.9607131e-06 9.4285714 - 86300 5.7587322e-06 0 6.1027542e-06 6.0234009e-06 6.969152e-06 9.4285714 - 86400 5.8389333e-06 0 6.1697397e-06 6.0477528e-06 7.0119472e-06 9.4285714 - 86500 5.9431034e-06 0 6.2597537e-06 6.0475988e-06 7.0667343e-06 9.4285714 - 86600 5.9655129e-06 0 6.2896528e-06 6.0010507e-06 7.0437962e-06 9.4285714 - 86700 6.042955e-06 0 6.2709737e-06 5.8440573e-06 6.9441762e-06 9.4285714 - 86800 6.2666413e-06 0 6.1964071e-06 5.6894309e-06 6.8811779e-06 9.4285714 - 86900 6.5118003e-06 0 6.1051139e-06 5.6557711e-06 6.8722493e-06 9.4285714 - 87000 6.7509257e-06 0 6.0291493e-06 5.6830661e-06 6.916898e-06 9.4285714 - 87100 6.9118143e-06 0 6.0183397e-06 5.6796551e-06 7.0011007e-06 9.4285714 - 87200 6.9983412e-06 0 6.040127e-06 5.6529434e-06 7.127229e-06 9.4285714 - 87300 7.2267392e-06 0 6.0286797e-06 5.6230076e-06 7.2573882e-06 9.4285714 - 87400 7.3928522e-06 0 6.0129878e-06 5.5947139e-06 7.4524445e-06 9.4285714 - 87500 7.1675783e-06 0 6.0469379e-06 5.7445703e-06 7.5694621e-06 9.4285714 - 87600 6.9310557e-06 0 6.1331355e-06 5.8982521e-06 7.5787155e-06 9.4285714 - 87700 6.8020949e-06 0 6.312632e-06 5.9646e-06 7.5159198e-06 9.4285714 - 87800 6.7871509e-06 0 6.4438446e-06 5.8625717e-06 7.4014079e-06 9.4285714 - 87900 7.1459737e-06 0 6.5483239e-06 5.7458287e-06 7.3742373e-06 9.4285714 - 88000 7.4791665e-06 0 6.6494489e-06 5.7733829e-06 7.5763999e-06 9.4285714 - 88100 7.4418527e-06 0 6.7353307e-06 5.903551e-06 7.7655167e-06 9.4285714 - 88200 6.8171325e-06 0 6.9359356e-06 6.0764899e-06 8.0003945e-06 9.4285714 - 88300 5.9535317e-06 0 7.0673476e-06 6.2127209e-06 8.2558166e-06 9.4285714 - 88400 5.8054385e-06 0 7.0393025e-06 6.295728e-06 8.3249618e-06 9.4285714 - 88500 5.7381974e-06 0 6.986322e-06 6.3150237e-06 8.3161166e-06 9.4285714 - 88600 5.8193958e-06 0 6.9610838e-06 6.2643723e-06 8.3456298e-06 9.4285714 - 88700 5.7843884e-06 0 7.025256e-06 6.1780449e-06 8.4360622e-06 9.4285714 - 88800 5.36122e-06 0 7.1886768e-06 6.1335975e-06 8.6566218e-06 9.4285714 - 88900 4.9662584e-06 0 7.2896286e-06 6.1156834e-06 8.7588271e-06 9.4285714 - 89000 5.0244565e-06 0 7.2730496e-06 6.083749e-06 8.7659659e-06 9.4285714 - 89100 5.2140172e-06 0 7.1617638e-06 6.0498839e-06 8.7631514e-06 9.4285714 - 89200 5.4241028e-06 0 7.0779466e-06 6.0064798e-06 8.7654482e-06 9.4285714 - 89300 5.354843e-06 0 7.0385405e-06 5.9746409e-06 8.8526601e-06 9.4285714 - 89400 4.9583346e-06 0 6.9725874e-06 5.9883731e-06 8.8784101e-06 9.4285714 - 89500 4.7804845e-06 0 6.8896169e-06 6.0555358e-06 8.7411283e-06 9.4285714 - 89600 4.5353969e-06 0 6.8441433e-06 6.1441445e-06 8.5998496e-06 9.4285714 - 89700 4.3528727e-06 0 6.9096594e-06 6.2696259e-06 8.4806368e-06 9.4285714 - 89800 4.0677397e-06 0 7.0681849e-06 6.3600745e-06 8.3821485e-06 9.4285714 - 89900 3.4743886e-06 0 7.208934e-06 6.2417154e-06 8.2590362e-06 9.4285714 - 90000 2.9448035e-06 0 7.2648444e-06 6.1025056e-06 8.1567217e-06 9.4285714 - 90100 2.8584378e-06 0 7.2361844e-06 6.0292519e-06 8.1323675e-06 9.4285714 - 90200 3.0154097e-06 0 7.1912833e-06 5.9880227e-06 8.1509776e-06 9.4285714 - 90300 3.0998012e-06 0 7.1621354e-06 5.9387681e-06 8.1447795e-06 9.4285714 - 90400 3.0622205e-06 0 7.1346468e-06 5.8551087e-06 8.0849875e-06 9.4285714 - 90500 2.8987354e-06 0 7.0808755e-06 5.7480505e-06 8.0655448e-06 9.4285714 - 90600 2.6710434e-06 0 7.0205199e-06 5.7165534e-06 8.0846444e-06 9.4285714 - 90700 2.4095074e-06 0 6.9439805e-06 5.7493599e-06 8.0259105e-06 9.4285714 - 90800 2.202904e-06 0 6.9317463e-06 5.8100449e-06 7.9027214e-06 9.4285714 - 90900 2.3181295e-06 0 7.0034101e-06 5.8778489e-06 7.7654197e-06 9.4285714 - 91000 2.3141951e-06 0 7.0766754e-06 5.9435646e-06 7.6679494e-06 9.4285714 - 91100 2.0683071e-06 0 7.0355929e-06 5.9830977e-06 7.5547272e-06 9.4285714 - 91200 1.8857219e-06 0 6.886975e-06 5.9803391e-06 7.3843659e-06 9.4285714 - 91300 1.8327584e-06 0 6.7232199e-06 5.8972482e-06 7.172749e-06 9.4285714 - 91400 1.804747e-06 0 6.6658239e-06 5.7775933e-06 6.9879557e-06 9.4285714 - 91500 1.6349771e-06 0 6.6744755e-06 5.6582742e-06 6.8615206e-06 9.4285714 - 91600 1.5216476e-06 0 6.6865456e-06 5.5795361e-06 6.7883528e-06 9.4285714 - 91700 1.6141413e-06 0 6.68539e-06 5.5586295e-06 6.7422583e-06 9.4285714 - 91800 1.6435107e-06 0 6.6317895e-06 5.6102143e-06 6.7060043e-06 9.4285714 - 91900 1.5649292e-06 0 6.5474777e-06 5.6787362e-06 6.6783459e-06 9.4285714 - 92000 1.5598003e-06 0 6.4984086e-06 5.7448839e-06 6.6563568e-06 9.4285714 - 92100 1.5645521e-06 0 6.502615e-06 5.7854556e-06 6.6299693e-06 9.4285714 - 92200 1.5384794e-06 0 6.5324855e-06 5.791917e-06 6.5998087e-06 9.4285714 - 92300 1.5428705e-06 0 6.5828146e-06 5.7573607e-06 6.564701e-06 9.4285714 - 92400 1.5481835e-06 0 6.6310796e-06 5.6780865e-06 6.551415e-06 9.4285714 - 92500 1.5193765e-06 0 6.6560684e-06 5.5916813e-06 6.568409e-06 9.4285714 - 92600 1.4779648e-06 0 6.6374647e-06 5.5138194e-06 6.605645e-06 9.4285714 - 92700 1.4401385e-06 0 6.5783557e-06 5.466179e-06 6.6343577e-06 9.4285714 - 92800 1.4263884e-06 0 6.5032532e-06 5.4548714e-06 6.6667781e-06 9.4285714 - 92900 1.4318392e-06 0 6.4100939e-06 5.475169e-06 6.7074201e-06 9.4285714 - 93000 1.4336111e-06 0 6.3386325e-06 5.5075916e-06 6.7333938e-06 9.4285714 - 93100 1.4541758e-06 0 6.3430387e-06 5.5366002e-06 6.7522163e-06 9.4285714 - 93200 1.4657669e-06 0 6.4329416e-06 5.581062e-06 6.8176723e-06 9.4285714 - 93300 1.4040886e-06 0 6.5434258e-06 5.6428482e-06 6.9238384e-06 9.4285714 - 93400 1.2988064e-06 0 6.6210628e-06 5.7043118e-06 7.0589134e-06 9.4285714 - 93500 1.2005872e-06 0 6.6510605e-06 5.7583138e-06 7.1470838e-06 9.4285714 - 93600 1.1148329e-06 0 6.6739621e-06 5.8031724e-06 7.198744e-06 9.4285714 - 93700 1.0710007e-06 0 6.7180944e-06 5.8357751e-06 7.2627754e-06 9.4285714 - 93800 1.0923979e-06 0 6.7838026e-06 5.857069e-06 7.3553254e-06 9.4285714 - 93900 1.1070785e-06 0 6.8474162e-06 5.8724205e-06 7.4260353e-06 9.4285714 - 94000 1.0836182e-06 0 6.9184593e-06 5.9063218e-06 7.4593908e-06 9.4285714 - 94100 1.0712532e-06 0 6.9659007e-06 5.9417663e-06 7.4976223e-06 9.4285714 - 94200 1.1089242e-06 0 6.9714436e-06 5.970624e-06 7.55674e-06 9.4285714 - 94300 1.1709624e-06 0 6.9375714e-06 5.9802014e-06 7.6084264e-06 9.4285714 - 94400 1.1698851e-06 0 6.8899943e-06 5.96701e-06 7.6232022e-06 9.4285714 - 94500 1.1331311e-06 0 6.8607818e-06 5.9576831e-06 7.6330828e-06 9.4285714 - 94600 1.1611176e-06 0 6.8775071e-06 5.9659895e-06 7.6539239e-06 9.4285714 - 94700 1.2014763e-06 0 6.9225704e-06 5.978896e-06 7.6602657e-06 9.4285714 - 94800 1.1833928e-06 0 6.9903173e-06 5.9981741e-06 7.6474584e-06 9.4285714 - 94900 1.1648449e-06 0 7.0650539e-06 6.0150496e-06 7.633387e-06 9.4285714 - 95000 1.1252279e-06 0 7.1072978e-06 6.0184786e-06 7.6094493e-06 9.4285714 - 95100 1.0516851e-06 0 7.1142631e-06 6.0065025e-06 7.5761571e-06 9.4285714 - 95200 1.0245214e-06 0 7.1018948e-06 5.993948e-06 7.5486922e-06 9.4285714 - 95300 1.0235812e-06 0 7.0867307e-06 6.0211446e-06 7.52964e-06 9.4285714 - 95400 9.6956254e-07 0 7.0870353e-06 6.072303e-06 7.5090138e-06 9.4285714 - 95500 8.9262312e-07 0 7.0987772e-06 6.1168082e-06 7.5033557e-06 9.4285714 - 95600 8.6064987e-07 0 7.1067297e-06 6.1317068e-06 7.4962696e-06 9.4285714 - 95700 8.7096432e-07 0 7.0919507e-06 6.1268237e-06 7.4461295e-06 9.4285714 - 95800 8.5278957e-07 0 7.0664924e-06 6.1151121e-06 7.3946799e-06 9.4285714 - 95900 7.9717781e-07 0 7.0485109e-06 6.0993542e-06 7.3743405e-06 9.4285714 - 96000 7.7875968e-07 0 7.0534076e-06 6.0721804e-06 7.38935e-06 9.4285714 - 96100 7.8525813e-07 0 7.0843748e-06 6.0420863e-06 7.4393684e-06 9.4285714 - 96200 7.7518366e-07 0 7.1238098e-06 6.028226e-06 7.5045929e-06 9.4285714 - 96300 7.6015915e-07 0 7.1481733e-06 6.0364027e-06 7.5368435e-06 9.4285714 - 96400 7.4067407e-07 0 7.1459565e-06 6.041338e-06 7.4989132e-06 9.4285714 - 96500 7.0061605e-07 0 7.1268071e-06 6.029068e-06 7.4151813e-06 9.4285714 - 96600 6.6164038e-07 0 7.098925e-06 6.0009667e-06 7.3139003e-06 9.4285714 - 96700 6.5255615e-07 0 7.0627067e-06 5.9576708e-06 7.2100844e-06 9.4285714 - 96800 6.5992528e-07 0 7.023092e-06 5.8964071e-06 7.1287006e-06 9.4285714 - 96900 6.618124e-07 0 6.9850613e-06 5.8360203e-06 7.0798167e-06 9.4285714 - 97000 6.7139818e-07 0 6.9588277e-06 5.8062928e-06 7.0552706e-06 9.4285714 - 97100 6.8703272e-07 0 6.9537175e-06 5.8222057e-06 7.0414456e-06 9.4285714 - 97200 6.9368757e-07 0 6.9628009e-06 5.8702813e-06 7.0384753e-06 9.4285714 - 97300 6.9652913e-07 0 6.9734824e-06 5.9290926e-06 7.0544858e-06 9.4285714 - 97400 6.9671901e-07 0 6.9846061e-06 6.0012529e-06 7.083092e-06 9.4285714 - 97500 6.891306e-07 0 6.9869142e-06 6.0395379e-06 7.0939696e-06 9.4285714 - 97600 6.76426e-07 0 6.9788679e-06 6.0215323e-06 7.0606545e-06 9.4285714 - 97700 6.5763751e-07 0 6.9653816e-06 5.9723094e-06 7.0096441e-06 9.4285714 - 97800 6.4854556e-07 0 6.9554426e-06 5.9303617e-06 6.9747745e-06 9.4285714 - 97900 6.5336861e-07 0 6.9405484e-06 5.9124736e-06 6.9578336e-06 9.4285714 - 98000 6.6394525e-07 0 6.9149722e-06 5.9089903e-06 6.9531064e-06 9.4285714 - 98100 6.8885885e-07 0 6.8891311e-06 5.9064849e-06 6.9546779e-06 9.4285714 - 98200 7.2201864e-07 0 6.8704207e-06 5.8899045e-06 6.9512899e-06 9.4285714 - 98300 7.3816538e-07 0 6.8523223e-06 5.8601846e-06 6.9459414e-06 9.4285714 - 98400 7.3631403e-07 0 6.8416192e-06 5.8365194e-06 6.9566027e-06 9.4285714 - 98500 7.2568853e-07 0 6.8359315e-06 5.8202579e-06 6.9826678e-06 9.4285714 - 98600 7.0490905e-07 0 6.8305302e-06 5.8023655e-06 7.0037387e-06 9.4285714 - 98700 6.8484202e-07 0 6.8328514e-06 5.7856688e-06 7.0152903e-06 9.4285714 - 98800 6.6994522e-07 0 6.8665586e-06 5.776709e-06 7.0248186e-06 9.4285714 - 98900 6.2867752e-07 0 6.922678e-06 5.7832988e-06 7.0496494e-06 9.4285714 - 99000 5.6999626e-07 0 6.9604759e-06 5.803298e-06 7.0910089e-06 9.4285714 - 99100 5.2675078e-07 0 6.9689516e-06 5.8313501e-06 7.1326482e-06 9.4285714 - 99200 4.9993032e-07 0 6.9639452e-06 5.8639097e-06 7.1679106e-06 9.4285714 - 99300 4.8034362e-07 0 6.9673566e-06 5.8886473e-06 7.2061899e-06 9.4285714 - 99400 4.633455e-07 0 6.9801545e-06 5.9075721e-06 7.2565116e-06 9.4285714 - 99500 4.423417e-07 0 6.9834282e-06 5.9253367e-06 7.3084834e-06 9.4285714 - 99600 4.2336865e-07 0 6.967599e-06 5.9390331e-06 7.3503483e-06 9.4285714 - 99700 4.0950396e-07 0 6.9366188e-06 5.9452518e-06 7.3763135e-06 9.4285714 - 99800 3.8946719e-07 0 6.9087461e-06 5.9409744e-06 7.3965059e-06 9.4285714 - 99900 3.5789226e-07 0 6.9005219e-06 5.9283255e-06 7.4220159e-06 9.4285714 - 100000 3.23165e-07 0 6.8942094e-06 5.9113196e-06 7.4570026e-06 9.4285714 -Loop time of 178.804 on 4 procs for 100000 steps with 2520 atoms - -Performance: 2416052.451 tau/day, 559.271 timesteps/s -99.5% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.068905 | 1.0142 | 3.632 | 150.2 | 0.57 -Bond | 2.4179 | 45.255 | 152.45 | 922.4 | 25.31 -Neigh | 2.7318 | 2.7504 | 2.7587 | 0.7 | 1.54 -Comm | 2.2428 | 62.076 | 153.59 | 708.9 | 34.72 -Output | 0.14703 | 1.3253 | 2.7063 | 102.7 | 0.74 -Modify | 0.66661 | 4.887 | 15.428 | 276.1 | 2.73 -Other | | 61.5 | | | 34.39 - -Nlocal: 630 ave 2513 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 -Nghost: 39.25 ave 150 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 -Neighs: 2458 ave 9821 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 9832 -Ave neighs/atom = 3.9015873 -Ave special neighs/atom = 36.31746 -Neighbor list builds = 5178 -Dangerous builds = 314 -Total wall time: 0:02:58 diff --git a/examples/bpm/pour/log.4May2022.pour.g++.4 b/examples/bpm/pour/log.4May2022.pour.g++.4 new file mode 100644 index 0000000000..5fc31df976 --- /dev/null +++ b/examples/bpm/pour/log.4May2022.pour.g++.4 @@ -0,0 +1,1096 @@ +LAMMPS (4 May 2022) +units lj +dimension 3 +boundary m m m +atom_style bpm/sphere +special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 +newton on off +comm_modify vel yes cutoff 3.3 +region box block -15 15 -15 15 0 60.0 +create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50 +Created orthogonal box = (-15 -15 0) to (15 15 60) + 1 by 1 by 4 MPI processor grid + +molecule my_mol "rect.mol" +Read molecule template my_mol: + 1 molecules + 0 fragments + 63 atoms with max type 1 + 297 bonds with max type 1 + 0 angles with max type 0 + 0 dihedrals with max type 0 + 0 impropers with max type 0 +region wall_cyl cylinder z 0.0 0.0 10.0 EDGE EDGE side in +region dropzone cylinder z 0.0 0.0 10.0 40.0 50.0 side in + +pair_style gran/hertz/history 1.0 NULL 0.5 NULL 0.1 1 +bond_style bpm/rotational +pair_coeff 1 1 +bond_coeff 1 1.0 0.2 0.01 0.01 2.0 0.4 0.02 0.02 0.2 0.04 0.002 0.002 + +compute nbond all nbond/atom +compute tbond all reduce sum c_nbond +compute bond_ids all property/local batom1 batom2 +compute bond_properties all bond/local dist b1 + +compute_modify thermo_temp dynamic/dof yes + +fix 1 all wall/gran hertz/history 1.0 NULL 0.5 NULL 0.1 1 zplane 0.0 NULL +fix 2 all wall/gran/region hertz/history 1.0 NULL 0.5 NULL 0.1 1 region wall_cyl +fix 3 all gravity 1e-4 vector 0 0 -1 +fix 4 all deposit 40 0 1500 712511343 mol my_mol region dropzone near 2.0 vz -0.05 -0.05 +fix 5 all nve/bpm/sphere + +timestep 0.05 +thermo_style custom step ke pe pxx pyy pzz c_tbond +thermo 100 +#dump 1 all custom 500 atomDump id radius x y z c_nbond mol +#dump 2 all local 500 bondDump c_bond_ids[*] c_bond_properties[*] +#dump_modify 2 colname 1 "id1" colname 2 "id2" colname 3 "r" colname 4 "r0" + +run 100000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.3 + ghost atom cutoff = 3.3 + binsize = 0.65, bins = 47 47 93 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair gran/hertz/history, perpetual + attributes: half, newton on, size, history + pair build: half/size/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.515 | 6.515 | 6.515 Mbytes + Step KinEng PotEng Pxx Pyy Pzz c_tbond + 0 -0 0 0 0 0 0 + 100 0.0018331948 0 1.2795343e-05 1.3162764e-05 6.0889226e-06 9.4285714 + 200 0.0025933558 0 -9.7246963e-07 4.2628093e-07 2.254606e-06 9.4285714 + 300 0.0036964813 0 -5.214277e-06 9.6942542e-06 8.1928448e-07 9.4285714 + 400 0.0060104433 0 2.3353405e-05 1.8273171e-05 1.2647691e-05 9.4285714 + 500 0.0074435972 0 -1.7839575e-05 3.8686256e-06 -5.120219e-06 9.4285714 + 600 0.0077862298 0 3.8676586e-06 1.3499487e-05 4.1914953e-06 9.4285714 + 700 0.0075577591 0 2.995232e-06 1.2051677e-05 4.8789862e-06 9.4285714 + 800 0.0073958844 0 -1.4258432e-05 1.2272397e-05 -6.8630878e-06 9.4285714 + 900 0.007553697 0 9.9219152e-06 1.2918228e-05 8.8713909e-06 9.4285714 + 1000 0.0075815901 0 -6.1095276e-06 1.2607282e-05 -2.1917025e-06 9.4285714 + 1100 0.0075277384 0 -5.4044191e-06 1.0815313e-05 -3.3464998e-06 9.4285714 + 1200 0.0075026507 0 6.9770766e-06 1.3988236e-05 8.5114688e-06 9.4285714 + 1300 0.0075665473 0 -4.6433628e-06 8.6190703e-06 -3.8381153e-06 9.4285714 + 1400 0.0076224701 0 1.1589382e-06 7.9617716e-06 1.1941326e-06 9.4285714 + 1500 0.007603467 0 3.5774148e-06 1.3039063e-05 5.2641947e-06 9.4285714 + 1600 0.0059810407 0 4.8299936e-06 1.5343107e-05 4.8809408e-06 9.4285714 + 1700 0.0080230318 0 7.7953676e-06 2.5215962e-05 1.2492975e-05 9.4285714 + 1800 0.0087482398 0 4.7318071e-06 1.9559769e-05 4.2711986e-07 9.4285714 + 1900 0.0086877574 0 4.8038566e-06 1.8020212e-05 2.1297032e-06 9.4285714 + 2000 0.0086771118 0 6.1316671e-06 2.6348435e-05 8.9167408e-06 9.4285714 + 2100 0.0084670091 0 5.0586292e-06 1.9876458e-05 4.6539619e-06 9.4285714 + 2200 0.0083650907 0 9.4046949e-06 1.9264472e-05 1.0344742e-05 9.4285714 + 2300 0.0083549595 0 6.3002517e-06 2.0954839e-05 3.9631836e-06 9.4285714 + 2400 0.0083151535 0 4.9801292e-06 1.2138211e-05 6.2493867e-06 9.4285714 + 2500 0.0083898757 0 6.8667997e-06 1.9182698e-05 9.8363046e-06 9.4285714 + 2600 0.0084145705 0 4.1851e-06 1.8890376e-05 5.497773e-06 9.4285714 + 2700 0.0082712696 0 4.9701934e-06 1.7886474e-05 8.3184582e-06 9.4285714 + 2800 0.0073688706 0 1.144302e-05 1.3902577e-05 9.8542094e-06 9.4285714 + 2900 0.0072732669 0 8.2228374e-06 1.2550063e-05 8.7486939e-06 9.4285714 + 3000 0.0072225948 0 1.1788696e-05 1.6856873e-05 1.0219519e-05 9.4285714 + 3100 0.0048244969 0 2.6913622e-05 2.6037751e-05 1.5435674e-05 9.4285714 + 3200 0.0045717035 0 2.3464139e-05 2.1215606e-05 1.7659066e-05 9.4285714 + 3300 0.0047679567 0 6.5564192e-06 1.2866169e-05 1.4234937e-05 9.4285714 + 3400 0.0048448212 0 2.6268527e-06 9.1565649e-06 1.2387928e-05 9.4285714 + 3500 0.0048364711 0 2.8817245e-06 1.0066061e-05 1.1158512e-05 9.4285714 + 3600 0.0047125947 0 4.936496e-06 1.4195118e-05 1.5418285e-05 9.4285714 + 3700 0.0045641049 0 5.9769788e-06 9.8945153e-06 2.0158644e-05 9.4285714 + 3800 0.0045540235 0 6.1868269e-06 9.9425305e-06 1.6312008e-05 9.4285714 + 3900 0.0047271202 0 4.6825739e-06 1.3424496e-05 1.3234307e-05 9.4285714 + 4000 0.0049115261 0 5.5722312e-06 9.2060522e-06 1.6284048e-05 9.4285714 + 4100 0.0046819157 0 7.2200038e-06 1.0870694e-05 1.0519325e-05 9.4285714 + 4200 0.0035133816 0 3.6321041e-05 4.1100939e-05 1.8321255e-05 9.4285714 + 4300 0.0031933917 0 2.4951011e-05 2.5521457e-05 2.588421e-05 9.4285714 + 4400 0.0033515272 0 -5.6220845e-06 -2.4430502e-06 1.0942893e-05 9.4285714 + 4500 0.0034928951 0 6.2053481e-06 4.7764245e-06 1.991749e-05 9.4285714 + 4600 0.0029992338 0 2.369557e-06 4.59349e-06 2.0911379e-05 9.4285714 + 4700 0.0030650658 0 -2.7066449e-06 1.83391e-06 6.7096837e-06 9.4285714 + 4800 0.0031180382 0 3.4620044e-06 3.3494935e-06 1.7175961e-05 9.4285714 + 4900 0.0030365003 0 3.6295178e-06 6.2514468e-06 1.3401316e-05 9.4285714 + 5000 0.0030259714 0 5.1566588e-06 1.3494605e-05 9.7456367e-06 9.4285714 + 5100 0.0030499975 0 6.7608769e-06 1.9415863e-05 1.2078691e-05 9.4285714 + 5200 0.003005436 0 6.7275739e-06 2.0656574e-05 5.906659e-06 9.4285714 + 5300 0.0030000941 0 6.9641454e-06 1.54531e-05 1.7021736e-05 9.4285714 + 5400 0.0031465827 0 6.540246e-06 1.0837198e-05 1.0192016e-05 9.4285714 + 5500 0.0031981585 0 4.9292412e-06 4.6915838e-06 3.029257e-06 9.4285714 + 5600 0.0031525115 0 4.3125052e-06 2.8841432e-06 1.9324111e-05 9.4285714 + 5700 0.0032128781 0 5.1973159e-06 4.7261232e-06 1.5155154e-05 9.4285714 + 5800 0.0030092855 0 5.1574375e-06 1.3330205e-06 1.6470501e-05 9.4285714 + 5900 0.0025015767 0 9.468608e-06 6.3045435e-06 3.0961055e-05 9.4285714 + 6000 0.0024438438 0 8.0212466e-06 1.0032087e-05 2.8378471e-05 9.4285714 + 6100 0.0023816456 0 3.7802286e-06 -3.8999559e-06 1.8398107e-05 9.4285714 + 6200 0.0024459343 0 5.9964052e-07 8.2000754e-07 1.6404949e-05 9.4285714 + 6300 0.0025205884 0 4.7129599e-06 8.6972388e-06 2.9892106e-05 9.4285714 + 6400 0.0033754198 0 6.5856871e-06 2.3744673e-05 2.4721217e-05 9.4285714 + 6500 0.0037812296 0 1.376462e-07 2.0230253e-05 1.9719688e-05 9.4285714 + 6600 0.0038043567 0 -2.2279638e-06 1.4780176e-05 2.3799652e-05 9.4285714 + 6700 0.0038213959 0 1.1073632e-05 2.2516034e-05 2.5410459e-05 9.4285714 + 6800 0.0036977776 0 -1.0765937e-05 1.3667142e-05 1.7835133e-05 9.4285714 + 6900 0.0034769765 0 6.7509492e-06 2.840882e-05 2.435267e-05 9.4285714 + 7000 0.0031526409 0 1.4168552e-05 4.4965769e-05 4.5646226e-05 9.4285714 + 7100 0.00317737 0 -5.4803238e-06 3.1967885e-05 2.9211214e-05 9.4285714 + 7200 0.0034448361 0 4.8507597e-06 2.1591795e-05 2.3816498e-05 9.4285714 + 7300 0.0036147362 0 -2.791278e-06 2.9367843e-05 2.072129e-05 9.4285714 + 7400 0.0035651675 0 -1.6177129e-06 7.9033092e-06 2.3377855e-05 9.4285714 + 7500 0.0036394064 0 5.7414518e-06 1.246586e-05 2.8461253e-05 9.4285714 + 7600 0.0033086177 0 -3.6547872e-06 1.9730955e-05 2.8892436e-05 9.4285714 + 7700 0.0033410425 0 6.9618203e-06 6.4576188e-06 3.1766455e-05 9.4285714 + 7800 0.0035764747 0 1.2110077e-05 6.3850506e-06 3.5436107e-05 9.4285714 + 7900 0.0039500913 0 1.1250888e-05 5.2728547e-06 3.4972007e-05 9.4285714 + 8000 0.0042963353 0 1.8776503e-05 4.2083124e-06 3.5010281e-05 9.4285714 + 8100 0.0048297614 0 2.5603506e-05 3.3748362e-06 4.0838382e-05 9.4285714 + 8200 0.0052301447 0 2.2727386e-05 4.8879987e-06 3.4821083e-05 9.4285714 + 8300 0.005169511 0 2.5022891e-05 1.0062389e-05 3.3976429e-05 9.4285714 + 8400 0.005224324 0 2.4238943e-05 7.0296204e-06 4.2543264e-05 9.4285714 + 8500 0.0053049309 0 2.6217015e-05 1.0282354e-06 2.6559275e-05 9.4285714 + 8600 0.0052459952 0 3.0123571e-05 -5.4843616e-07 3.3857424e-05 9.4285714 + 8700 0.0052955657 0 2.3843911e-05 -3.117634e-06 3.9683886e-05 9.4285714 + 8800 0.0053972257 0 2.6944951e-05 -1.9297854e-06 2.1931602e-05 9.4285714 + 8900 0.0053679679 0 3.1169997e-05 -9.4576351e-07 3.1987255e-05 9.4285714 + 9000 0.0053793586 0 2.6261243e-05 -3.1509839e-07 3.3111749e-05 9.4285714 + 9100 0.0048447626 0 2.5562708e-05 9.5708437e-07 3.1370618e-05 9.4285714 + 9200 0.0048688926 0 2.8696471e-05 1.7677464e-06 3.5234397e-05 9.4285714 + 9300 0.0048538957 0 2.9337564e-05 6.1059713e-06 2.8008268e-05 9.4285714 + 9400 0.0046986454 0 3.0831262e-05 4.6561014e-06 3.5247122e-05 9.4285714 + 9500 0.0046145139 0 2.6082124e-05 4.2214681e-06 3.2773769e-05 9.4285714 + 9600 0.0045277961 0 1.2434258e-05 8.6375534e-06 2.284049e-05 9.4285714 + 9700 0.0043935298 0 2.5929984e-05 1.409283e-05 4.9159861e-05 9.4285714 + 9800 0.0045363488 0 1.9700734e-05 7.7797381e-06 4.4404362e-05 9.4285714 + 9900 0.0046509978 0 4.052959e-07 1.0265502e-06 3.1360974e-05 9.4285714 + 10000 0.0046493894 0 1.6553229e-05 1.0076346e-05 5.1789914e-05 9.4285714 + 10100 0.0046514856 0 1.8327939e-05 9.8302174e-06 3.7624599e-05 9.4285714 + 10200 0.0046209533 0 2.4256813e-05 1.3730576e-05 3.1575089e-05 9.4285714 + 10300 0.0044651031 0 3.3601226e-05 2.3983568e-05 5.6565625e-05 9.4285714 + 10400 0.0041834162 0 4.805126e-05 7.6642091e-06 4.2641571e-05 9.4285714 + 10500 0.0043218845 0 4.6826294e-05 1.9078519e-05 3.6250139e-05 9.4285714 + 10600 0.0045795722 0 8.2629139e-06 1.6451196e-05 5.4195508e-05 9.4285714 + 10700 0.0053833569 0 5.3717062e-06 6.8337125e-06 4.9804395e-05 9.4285714 + 10800 0.0056805981 0 1.0439371e-05 6.3964706e-05 5.0857116e-05 9.4285714 + 10900 0.0057157307 0 8.6953546e-06 6.7276441e-05 3.9725389e-05 9.4285714 + 11000 0.005696424 0 8.1149094e-06 2.2104406e-05 5.1852506e-05 9.4285714 + 11100 0.0052078884 0 1.5579258e-05 5.0215785e-05 9.2364613e-05 9.4285714 + 11200 0.0052849159 0 2.443959e-05 6.5869489e-05 5.1237777e-05 9.4285714 + 11300 0.0054074494 0 -2.0510258e-05 2.0196205e-05 2.5051885e-05 9.4285714 + 11400 0.0055432168 0 1.5343164e-05 2.5482368e-05 5.4336948e-05 9.4285714 + 11500 0.0054679467 0 -8.3474301e-06 3.553783e-05 5.2027159e-05 9.4285714 + 11600 0.0052706441 0 -1.5151807e-05 3.9562266e-05 5.7900102e-05 9.4285714 + 11700 0.0053724243 0 2.9852987e-05 4.4807737e-05 5.5405662e-05 9.4285714 + 11800 0.0054759961 0 -2.4309686e-05 3.0092677e-06 5.4742672e-05 9.4285714 + 11900 0.0051146604 0 5.1194747e-06 2.8620342e-05 6.4679345e-05 9.4285714 + 12000 0.0049723565 0 2.675912e-05 4.6202817e-05 4.7309269e-05 9.4285714 + 12100 0.0046920113 0 8.7155181e-06 1.0297631e-05 5.3185103e-05 9.4285714 + 12200 0.0049570244 0 1.6383054e-05 2.2699433e-05 6.347138e-05 9.4285714 + 12300 0.0049181458 0 -2.6116723e-05 3.300058e-05 5.177444e-05 9.4285714 + 12400 0.0049245342 0 1.7614092e-05 2.1986541e-05 6.3820521e-05 9.4285714 + 12500 0.0049753042 0 1.7024231e-05 2.7328487e-05 4.8334342e-05 9.4285714 + 12600 0.0048148791 0 -1.7042812e-05 3.3512772e-05 5.9422643e-05 9.4285714 + 12700 0.0043852178 0 1.1418683e-05 6.3690455e-05 7.8362127e-05 9.4285714 + 12800 0.0041967317 0 6.1295424e-06 2.691552e-05 5.3900077e-05 9.4285714 + 12900 0.0041911278 0 1.1373508e-05 -9.9114041e-06 5.6629663e-05 9.4285714 + 13000 0.0043107924 0 8.5398832e-06 1.2632925e-05 5.6578871e-05 9.4285714 + 13100 0.0043976521 0 -1.9373679e-05 2.745136e-05 5.4632008e-05 9.4285714 + 13200 0.0043474635 0 2.0343582e-05 1.7768236e-05 1.1895158e-05 9.4285714 + 13300 0.0044593969 0 1.0895451e-05 2.1880107e-05 3.4032783e-05 9.4285714 + 13400 0.0044814342 0 -1.3547218e-05 1.9974451e-05 4.4513918e-05 9.4285714 + 13500 0.0043982498 0 1.0722877e-05 2.3728571e-05 2.7665112e-05 9.4285714 + 13600 0.0039378503 0 1.2229889e-05 3.0770266e-05 5.2614428e-05 9.4285714 + 13700 0.0036474735 0 9.5048999e-06 1.6734153e-05 7.4271827e-05 9.4285714 + 13800 0.0038236277 0 1.6680429e-05 4.7691782e-05 9.2160112e-05 9.4285714 + 13900 0.0040574402 0 6.7570974e-06 3.6492091e-05 5.2053836e-05 9.4285714 + 14000 0.0046440817 0 2.7735053e-05 6.6227204e-06 3.9436561e-05 9.4285714 + 14100 0.0048045755 0 2.0601942e-05 2.959681e-05 4.9880076e-05 9.4285714 + 14200 0.004634799 0 8.0658747e-06 5.2774385e-06 5.2189551e-05 9.4285714 + 14300 0.0046822822 0 2.1714615e-05 3.0364731e-05 5.2132518e-05 9.4285714 + 14400 0.0048282958 0 2.0587615e-05 2.530458e-05 4.4110535e-05 9.4285714 + 14500 0.004799276 0 1.0813724e-05 2.2458541e-06 4.4546542e-05 9.4285714 + 14600 0.0046554419 0 1.859323e-05 4.5863598e-05 5.9021103e-05 9.4285714 + 14700 0.0045262414 0 2.0625232e-05 3.9707287e-05 6.1007118e-05 9.4285714 + 14800 0.0043347498 0 1.6697069e-05 3.1666259e-05 4.7172267e-05 9.4285714 + 14900 0.0040641791 0 1.3497064e-05 5.9866835e-05 6.6917505e-05 9.4285714 + 15000 0.0040014911 0 7.1453431e-06 2.5483385e-05 6.7987038e-05 9.4285714 + 15100 0.0040015198 0 4.2135705e-05 2.0671772e-05 6.4280017e-05 9.4285714 + 15200 0.004656209 0 2.6684328e-05 4.474018e-05 5.916807e-05 9.4285714 + 15300 0.0047390215 0 3.3127952e-05 4.6355585e-06 5.6740658e-05 9.4285714 + 15400 0.0047219857 0 5.6866539e-05 4.8092122e-05 6.3199152e-05 9.4285714 + 15500 0.0049597215 0 3.4278993e-05 2.5111668e-05 6.5359107e-05 9.4285714 + 15600 0.0049081505 0 1.2068327e-05 6.9210759e-06 6.2272418e-05 9.4285714 + 15700 0.0047978977 0 4.7482116e-05 5.8014048e-05 5.5647569e-05 9.4285714 + 15800 0.0048176861 0 5.0196994e-05 5.8789855e-06 4.5752404e-05 9.4285714 + 15900 0.0049895331 0 2.0966545e-05 1.4091817e-05 4.9992598e-05 9.4285714 + 16000 0.0049288669 0 2.268795e-05 3.980733e-05 5.1840856e-05 9.4285714 + 16100 0.0048010252 0 2.6781521e-05 1.2145851e-05 5.6545128e-05 9.4285714 + 16200 0.0047925554 0 4.0057978e-05 3.9037828e-05 5.8580861e-05 9.4285714 + 16300 0.0047652048 0 2.9783669e-05 4.8617786e-05 5.7899464e-05 9.4285714 + 16400 0.0043495894 0 4.1024094e-05 2.2097063e-05 7.9895344e-05 9.4285714 + 16500 0.0042677893 0 4.9740295e-05 3.3483257e-05 7.2860145e-05 9.4285714 + 16600 0.0039924053 0 1.7513538e-05 4.3222405e-05 6.2148808e-05 9.4285714 + 16700 0.004110225 0 4.4412384e-05 9.35409e-06 6.8831113e-05 9.4285714 + 16800 0.0041003344 0 2.4419982e-05 2.7202073e-05 6.5806688e-05 9.4285714 + 16900 0.0040916821 0 1.4965068e-05 3.6816647e-05 7.2328503e-05 9.4285714 + 17000 0.0039812122 0 4.3173586e-05 4.3996263e-05 7.7949852e-05 9.4285714 + 17100 0.0042480582 0 4.1959057e-05 6.6432813e-05 6.3893449e-05 9.4285714 + 17200 0.0044450353 0 3.1558002e-05 4.6146848e-05 5.5409103e-05 9.4285714 + 17300 0.0045016689 0 3.8307434e-05 3.6423601e-05 4.6361333e-05 9.4285714 + 17400 0.0044798864 0 3.6969292e-05 3.0041841e-05 5.013181e-05 9.4285714 + 17500 0.0044624458 0 4.5965488e-05 2.640968e-05 6.3999899e-05 9.4285714 + 17600 0.0044477024 0 2.0966517e-05 1.8953464e-05 4.7160807e-05 9.4285714 + 17700 0.0044103517 0 2.7440925e-05 3.0023335e-05 2.6847111e-05 9.4285714 + 17800 0.004341948 0 3.7548931e-05 2.7684114e-05 5.1464098e-05 9.4285714 + 17900 0.0042623319 0 3.2079768e-05 2.0530818e-05 3.5314593e-05 9.4285714 + 18000 0.003726239 0 2.5075988e-05 3.3133097e-05 4.1995217e-05 9.4285714 + 18100 0.0034893305 0 1.3220245e-05 3.020125e-05 7.1713105e-05 9.4285714 + 18200 0.0035481187 0 3.2523043e-05 2.7387192e-05 3.6749668e-05 9.4285714 + 18300 0.0036251402 0 4.5667311e-05 2.9230799e-05 7.1782706e-05 9.4285714 + 18400 0.0036369749 0 -1.014622e-06 3.5201729e-05 3.9709522e-05 9.4285714 + 18500 0.0034279849 0 2.1947889e-05 3.9001906e-05 3.3701879e-05 9.4285714 + 18600 0.0033615572 0 5.3790038e-05 3.9573549e-05 8.1596316e-05 9.4285714 + 18700 0.003406225 0 7.3625431e-06 3.4584743e-05 4.8640801e-05 9.4285714 + 18800 0.0034922323 0 2.6182422e-05 3.1791119e-05 4.170957e-05 9.4285714 + 18900 0.0034820625 0 2.9857402e-05 2.5799449e-05 5.5291228e-05 9.4285714 + 19000 0.0033272524 0 1.844591e-05 4.0826323e-05 6.2101661e-05 9.4285714 + 19100 0.0034010912 0 3.0145616e-05 3.644045e-05 6.0246878e-05 9.4285714 + 19200 0.0030932535 0 8.7227973e-06 2.9814304e-05 4.6597247e-05 9.4285714 + 19300 0.002624051 0 6.3914236e-05 2.9323041e-05 6.0029293e-05 9.4285714 + 19400 0.0027583806 0 4.2039411e-05 2.7933876e-05 4.8958797e-05 9.4285714 + 19500 0.0029775174 0 -2.6335479e-05 2.2879667e-05 4.4610482e-05 9.4285714 + 19600 0.0028689969 0 3.5884554e-05 2.1352512e-05 6.0208946e-05 9.4285714 + 19700 0.0026399127 0 1.8473989e-05 2.2707825e-05 6.171175e-05 9.4285714 + 19800 0.0025439904 0 -1.2073435e-06 2.0399124e-05 6.9687415e-05 9.4285714 + 19900 0.0027074939 0 3.0062292e-05 3.2667714e-05 5.1372476e-05 9.4285714 + 20000 0.0027181793 0 -1.7035119e-06 1.177054e-05 4.0159702e-05 9.4285714 + 20100 0.0027315362 0 -1.3742365e-06 2.3564155e-05 5.7172718e-05 9.4285714 + 20200 0.0027204191 0 2.0041145e-05 2.052408e-05 4.7725285e-05 9.4285714 + 20300 0.0026457344 0 3.3984829e-06 4.8524174e-06 5.3280292e-05 9.4285714 + 20400 0.0026592475 0 5.1173158e-06 3.9458314e-05 5.5560611e-05 9.4285714 + 20500 0.0026129298 0 2.419217e-05 2.7154017e-05 5.5129038e-05 9.4285714 + 20600 0.0026532045 0 1.9753712e-05 1.46246e-05 4.9293256e-05 9.4285714 + 20700 0.0026172433 0 1.0984198e-06 3.1572908e-05 4.2775817e-05 9.4285714 + 20800 0.0025282343 0 1.9683388e-05 2.2901129e-05 5.64033e-05 9.4285714 + 20900 0.0025383322 0 2.2352257e-05 2.534911e-05 6.380687e-05 9.4285714 + 21000 0.0024848857 0 1.4023463e-05 2.6731904e-05 5.2051725e-05 9.4285714 + 21100 0.0025091105 0 2.7673099e-05 2.9475402e-05 7.684648e-05 9.4285714 + 21200 0.0027229411 0 6.1574133e-06 2.5611393e-05 5.6801847e-05 9.4285714 + 21300 0.0028888226 0 1.9686043e-05 1.033069e-05 3.656491e-05 9.4285714 + 21400 0.0029336429 0 2.3706857e-05 1.5440041e-05 6.4192795e-05 9.4285714 + 21500 0.0029354446 0 4.443655e-06 1.8094788e-05 3.797507e-05 9.4285714 + 21600 0.0029270648 0 2.4289752e-05 1.6933392e-05 3.9618516e-05 9.4285714 + 21700 0.0029288781 0 2.2403205e-05 1.3655312e-05 6.3273854e-05 9.4285714 + 21800 0.002884005 0 9.5665801e-06 1.2718071e-05 5.613979e-05 9.4285714 + 21900 0.0028362206 0 1.6764675e-05 2.2612976e-05 5.3866016e-05 9.4285714 + 22000 0.0027784436 0 2.0373617e-05 2.134133e-05 5.6687534e-05 9.4285714 + 22100 0.0027479829 0 3.1605707e-05 2.9016826e-05 5.0412111e-05 9.4285714 + 22200 0.0027598842 0 3.1818095e-05 1.898738e-05 6.5167547e-05 9.4285714 + 22300 0.0026078138 0 1.4200853e-05 2.8283323e-05 6.7071904e-05 9.4285714 + 22400 0.0026057112 0 2.7502142e-05 4.1407395e-05 8.4619483e-05 9.4285714 + 22500 0.0026641722 0 9.9423891e-06 1.4635552e-05 6.8501238e-05 9.4285714 + 22600 0.0023728105 0 6.7736501e-06 3.0299151e-05 5.894177e-05 9.4285714 + 22700 0.0021999097 0 3.4516939e-05 4.5285607e-05 8.996035e-05 9.4285714 + 22800 0.002178124 0 2.9545388e-05 1.9567086e-05 9.6343476e-05 9.4285714 + 22900 0.0022903704 0 4.8666623e-06 1.5551535e-05 5.8697755e-05 9.4285714 + 23000 0.0022114595 0 3.9089014e-05 1.3185973e-05 7.0843777e-05 9.4285714 + 23100 0.0022473179 0 3.0609778e-05 1.6190628e-05 7.2843834e-05 9.4285714 + 23200 0.0022787302 0 1.3694799e-05 2.8211464e-06 3.8403815e-05 9.4285714 + 23300 0.002254193 0 1.0608785e-05 2.087358e-05 6.337886e-05 9.4285714 + 23400 0.0022032528 0 2.914759e-05 2.8493674e-05 6.0474318e-05 9.4285714 + 23500 0.0022103262 0 2.9804777e-05 1.2383546e-05 4.0491877e-05 9.4285714 + 23600 0.0022767949 0 1.8461506e-05 2.3591158e-05 5.2725816e-05 9.4285714 + 23700 0.002283034 0 1.9374068e-05 2.570172e-05 4.622802e-05 9.4285714 + 23800 0.0022293403 0 3.3214067e-05 1.0752104e-05 4.2971028e-05 9.4285714 + 23900 0.0022421499 0 3.3973428e-05 1.4548851e-05 4.8022214e-05 9.4285714 + 24000 0.0022708179 0 1.3175798e-05 1.5539147e-05 4.5563964e-05 9.4285714 + 24100 0.0022311644 0 1.320215e-05 1.3317185e-05 5.7572825e-05 9.4285714 + 24200 0.0022566051 0 2.3442037e-05 7.9298663e-06 5.2246081e-05 9.4285714 + 24300 0.0022547585 0 2.1667142e-05 6.4075914e-06 5.1028376e-05 9.4285714 + 24400 0.0022901257 0 3.8132396e-05 1.5652454e-05 7.8308938e-05 9.4285714 + 24500 0.0023537103 0 1.7910524e-05 1.573637e-05 6.9737249e-05 9.4285714 + 24600 0.0023613708 0 4.9912312e-05 1.9777052e-05 4.9415062e-05 9.4285714 + 24700 0.0023237992 0 5.4833746e-05 2.9532114e-05 7.4218996e-05 9.4285714 + 24800 0.0024221927 0 4.0966596e-05 6.3998314e-06 5.9553095e-05 9.4285714 + 24900 0.0025882547 0 6.045015e-05 6.220892e-06 5.4328816e-05 9.4285714 + 25000 0.0027152266 0 5.4969197e-05 2.6430135e-05 4.603937e-05 9.4285714 + 25100 0.0028201154 0 4.3938431e-05 3.0418239e-06 5.8688084e-05 9.4285714 + 25200 0.0029086169 0 3.9184289e-05 -1.53382e-06 4.5684354e-05 9.4285714 + 25300 0.0028528211 0 4.4996759e-05 2.6609485e-06 4.2673517e-05 9.4285714 + 25400 0.0027655631 0 4.2432926e-05 2.1473821e-05 6.8108741e-05 9.4285714 + 25500 0.0027631455 0 5.0514226e-05 2.7797928e-05 5.8437613e-05 9.4285714 + 25600 0.0027455338 0 4.3507582e-05 -1.0456464e-05 5.1578934e-05 9.4285714 + 25700 0.0027314337 0 3.7998608e-05 2.5300155e-05 5.954794e-05 9.4285714 + 25800 0.0026789336 0 5.6853762e-05 2.33174e-05 5.8401995e-05 9.4285714 + 25900 0.0026686904 0 6.7084502e-05 -1.1954024e-05 5.9379012e-05 9.4285714 + 26000 0.0026703643 0 5.6882192e-05 2.5357526e-05 5.608238e-05 9.4285714 + 26100 0.0026825353 0 5.3411638e-05 2.2603349e-05 5.7143751e-05 9.4285714 + 26200 0.0026825174 0 4.4889326e-05 6.9889785e-06 5.8696773e-05 9.4285714 + 26300 0.0025517718 0 5.0976225e-05 2.6619688e-05 6.2081286e-05 9.4285714 + 26400 0.002448155 0 4.6795755e-05 2.6745973e-05 6.9058563e-05 9.4285714 + 26500 0.0023334395 0 3.6329495e-05 2.1444416e-05 6.3642539e-05 9.4285714 + 26600 0.0023097701 0 1.4550567e-05 2.0382944e-05 7.4206161e-05 9.4285714 + 26700 0.0023614287 0 3.6837945e-05 7.9340854e-06 4.7722434e-05 9.4285714 + 26800 0.0023955623 0 3.3758906e-05 1.7850933e-05 5.5370197e-05 9.4285714 + 26900 0.0019993736 0 2.401514e-05 7.8783626e-06 6.8777068e-05 9.4285714 + 27000 0.0019497677 0 3.4976669e-05 2.0510247e-05 8.2493412e-05 9.4285714 + 27100 0.0020363076 0 3.0367221e-05 2.8074655e-05 6.8056692e-05 9.4285714 + 27200 0.0021974785 0 2.8659262e-05 1.6294524e-05 5.6354701e-05 9.4285714 + 27300 0.002350289 0 4.0543677e-05 3.479231e-05 9.0764702e-05 9.4285714 + 27400 0.0026460053 0 3.662854e-05 3.4426146e-05 5.8695061e-05 9.4285714 + 27500 0.0027599044 0 2.6446889e-05 2.899965e-05 3.1521376e-05 9.4285714 + 27600 0.0026660556 0 3.9779618e-05 4.4458176e-05 6.7754246e-05 9.4285714 + 27700 0.0026060398 0 4.7271306e-05 3.8365324e-05 8.0132483e-05 9.4285714 + 27800 0.002724511 0 3.2724273e-05 3.0569502e-05 3.8076705e-05 9.4285714 + 27900 0.0027318479 0 3.2565575e-05 4.4661949e-05 3.5502056e-05 9.4285714 + 28000 0.0026231478 0 3.0921183e-05 6.0356667e-05 6.119464e-05 9.4285714 + 28100 0.0025508556 0 3.8236605e-05 7.3664001e-05 6.7713451e-05 9.4285714 + 28200 0.0025807152 0 2.9349952e-05 7.4140709e-05 6.1882214e-05 9.4285714 + 28300 0.0024074206 0 4.7886113e-05 5.3408061e-05 7.1587209e-05 9.4285714 + 28400 0.0021292859 0 3.9661978e-05 4.0501829e-05 8.4104354e-05 9.4285714 + 28500 0.0022172558 0 9.263267e-06 3.0058013e-05 6.6166187e-05 9.4285714 + 28600 0.0022653927 0 1.0971373e-05 3.0295081e-05 5.9537447e-05 9.4285714 + 28700 0.0025914898 0 3.6755792e-05 6.2489978e-05 7.3424188e-05 9.4285714 + 28800 0.0028276024 0 3.411427e-05 6.1657699e-05 5.2554821e-05 9.4285714 + 28900 0.0029326653 0 2.9451988e-05 5.2815959e-05 4.9287892e-05 9.4285714 + 29000 0.002965493 0 4.3028891e-05 5.075017e-05 4.0608877e-05 9.4285714 + 29100 0.0029096903 0 2.3691422e-05 5.351833e-05 5.2666702e-05 9.4285714 + 29200 0.0028604262 0 2.3683149e-05 7.0673759e-05 5.6222633e-05 9.4285714 + 29300 0.0028093312 0 2.7695636e-05 3.7456562e-05 5.2008785e-05 9.4285714 + 29400 0.0026786162 0 1.7501321e-05 4.5402961e-05 3.9525304e-05 9.4285714 + 29500 0.0025387867 0 2.6252438e-05 0.00011675762 5.4076857e-05 9.4285714 + 29600 0.0026569564 0 2.0179873e-05 3.5543954e-05 5.8794028e-05 9.4285714 + 29700 0.0027207144 0 1.4132151e-05 -1.0930379e-05 4.9793098e-05 9.4285714 + 29800 0.0026892821 0 1.5975512e-05 3.2195344e-05 7.7929499e-05 9.4285714 + 29900 0.002643369 0 9.7678707e-06 1.514329e-05 6.9299393e-05 9.4285714 + 30000 0.0026484998 0 1.8316171e-05 2.1415077e-05 7.6825888e-05 9.4285714 + 30100 0.0028058509 0 2.8010974e-05 3.0588454e-05 8.9088871e-05 9.4285714 + 30200 0.0030353215 0 3.0063085e-05 2.9104606e-05 5.9605817e-05 9.4285714 + 30300 0.0030244988 0 5.9349189e-05 5.3259974e-05 8.9481653e-05 9.4285714 + 30400 0.0030855053 0 3.9650015e-05 3.414212e-05 7.0405413e-05 9.4285714 + 30500 0.0031141819 0 1.5522675e-05 3.9813856e-05 3.5114379e-05 9.4285714 + 30600 0.0030115458 0 6.207961e-05 6.9753316e-05 7.8366207e-05 9.4285714 + 30700 0.0029700178 0 5.3239082e-05 6.3389177e-05 5.4097351e-05 9.4285714 + 30800 0.0029985358 0 5.2375856e-05 5.1058091e-05 3.3422572e-05 9.4285714 + 30900 0.0029689517 0 7.9332461e-05 4.3886728e-05 5.4365146e-05 9.4285714 + 31000 0.0029622718 0 4.1523447e-05 3.6825764e-05 4.5694556e-05 9.4285714 + 31100 0.0029693917 0 3.9693868e-05 3.1903074e-05 5.8747157e-05 9.4285714 + 31200 0.0027246348 0 4.7276494e-05 2.7079375e-05 7.6416899e-05 9.4285714 + 31300 0.0025368424 0 2.0106344e-05 1.9267294e-05 6.5804133e-05 9.4285714 + 31400 0.0023736698 0 3.4928557e-05 2.8361754e-05 7.2137201e-05 9.4285714 + 31500 0.0023946514 0 4.2754557e-05 3.7950211e-05 8.8735068e-05 9.4285714 + 31600 0.0025648037 0 3.7965284e-05 3.50089e-05 8.1900334e-05 9.4285714 + 31700 0.0026956511 0 4.4264259e-05 3.1634807e-05 7.4263237e-05 9.4285714 + 31800 0.002677722 0 4.2244917e-05 3.2173533e-05 8.3389862e-05 9.4285714 + 31900 0.0026705496 0 3.6129898e-05 4.4926239e-05 0.00010110824 9.4285714 + 32000 0.0026466417 0 2.9725035e-05 2.3414537e-05 7.220946e-05 9.4285714 + 32100 0.0026464292 0 5.4134116e-05 3.4177457e-05 6.0288821e-05 9.4285714 + 32200 0.0023705665 0 8.9404512e-05 4.9292654e-05 7.4340835e-05 9.4285714 + 32300 0.0023183595 0 3.1106601e-05 1.969535e-05 7.2988393e-05 9.4285714 + 32400 0.0023882969 0 3.0033e-05 3.3991058e-05 7.1203923e-05 9.4285714 + 32500 0.0023801754 0 2.0067694e-05 3.609562e-05 7.429963e-05 9.4285714 + 32600 0.0024127958 0 1.860145e-05 1.673518e-05 6.100357e-05 9.4285714 + 32700 0.0024031675 0 1.6548008e-05 3.1315194e-05 8.701554e-05 9.4285714 + 32800 0.0023770089 0 3.1288811e-05 3.9427918e-05 5.6604914e-05 9.4285714 + 32900 0.0023568819 0 2.1325065e-05 3.2192459e-05 4.8319222e-05 9.4285714 + 33000 0.0023407285 0 2.2054448e-05 2.8803406e-05 5.5905315e-05 9.4285714 + 33100 0.002327332 0 4.0361707e-05 3.7589399e-05 4.2886312e-05 9.4285714 + 33200 0.0023912585 0 -9.7229548e-07 2.5787094e-05 6.5015833e-05 9.4285714 + 33300 0.0022984153 0 3.2373497e-05 2.5040091e-05 6.9835525e-05 9.4285714 + 33400 0.0022416368 0 2.669143e-05 3.3965765e-05 6.2323403e-05 9.4285714 + 33500 0.0022470637 0 2.3937493e-05 3.2027546e-05 6.683839e-05 9.4285714 + 33600 0.002256129 0 5.0952751e-05 1.2468902e-05 8.4446592e-05 9.4285714 + 33700 0.0022125246 0 3.093841e-05 2.8287747e-05 6.9499172e-05 9.4285714 + 33800 0.0021842197 0 3.5838423e-05 4.2090475e-05 6.9350286e-05 9.4285714 + 33900 0.0021690567 0 2.1933016e-05 2.3178404e-05 6.7082352e-05 9.4285714 + 34000 0.0022206311 0 1.6269784e-05 1.1538009e-05 6.9266998e-05 9.4285714 + 34100 0.0022494061 0 9.1490397e-06 2.3350968e-05 6.8389039e-05 9.4285714 + 34200 0.0022085859 0 1.1855555e-05 3.1674183e-05 7.1002559e-05 9.4285714 + 34300 0.0021855633 0 3.6129131e-05 3.1747187e-05 7.3965145e-05 9.4285714 + 34400 0.0021798298 0 2.9737106e-05 3.3328648e-05 6.9329253e-05 9.4285714 + 34500 0.0021267289 0 3.0875724e-05 3.9773694e-05 7.6428461e-05 9.4285714 + 34600 0.0020466804 0 4.5953975e-05 3.604981e-05 9.1419852e-05 9.4285714 + 34700 0.0020969555 0 2.1591871e-05 2.7684452e-05 7.3703867e-05 9.4285714 + 34800 0.0022946237 0 2.5522835e-05 5.2438515e-05 7.4505556e-05 9.4285714 + 34900 0.0024490201 0 3.0917851e-05 4.7710261e-05 6.8019936e-05 9.4285714 + 35000 0.0023320217 0 1.3576325e-05 2.3430256e-05 9.5266861e-05 9.4285714 + 35100 0.0021890324 0 3.4077104e-05 7.0143939e-05 0.00014586007 9.4285714 + 35200 0.0022124553 0 3.9202113e-05 6.7232341e-05 0.00011830019 9.4285714 + 35300 0.0022584165 0 3.2352745e-05 3.4532597e-05 0.00010884414 9.4285714 + 35400 0.0022737238 0 2.6169969e-05 5.4509206e-05 0.00013180587 9.4285714 + 35500 0.0021537481 0 1.3607191e-05 6.4837671e-05 0.00010851886 9.4285714 + 35600 0.0019831613 0 3.7737426e-05 3.5351631e-05 0.00011069142 9.4285714 + 35700 0.0019041909 0 5.8970853e-05 4.7427627e-05 8.3590155e-05 9.4285714 + 35800 0.0018216502 0 2.0975612e-05 6.7395457e-05 8.6545139e-05 9.4285714 + 35900 0.0018071574 0 4.9077297e-05 5.6297007e-05 8.6311389e-05 9.4285714 + 36000 0.0018645267 0 4.3766063e-05 6.3882304e-05 7.7447784e-05 9.4285714 + 36100 0.0018474198 0 2.7934971e-05 4.1953568e-05 7.3607852e-05 9.4285714 + 36200 0.0017366166 0 6.3710459e-05 5.0034173e-05 8.7289442e-05 9.4285714 + 36300 0.0016630877 0 7.6673753e-05 7.2721043e-05 6.987444e-05 9.4285714 + 36400 0.0016809967 0 7.7155302e-05 5.3898957e-05 5.1930662e-05 9.4285714 + 36500 0.0017478488 0 4.3901858e-05 4.0429824e-05 5.2253472e-05 9.4285714 + 36600 0.0017244649 0 2.428819e-05 4.6012488e-05 3.7569881e-05 9.4285714 + 36700 0.001694793 0 4.1551489e-05 5.7262857e-05 5.4986708e-05 9.4285714 + 36800 0.0016321204 0 2.4522843e-05 6.8176422e-05 5.0512524e-05 9.4285714 + 36900 0.0015208954 0 2.4066113e-05 6.9956589e-05 3.100353e-05 9.4285714 + 37000 0.0014068755 0 3.7418687e-05 3.3424302e-05 4.5889741e-05 9.4285714 + 37100 0.0013361229 0 2.3700045e-05 5.9655032e-05 5.8355744e-05 9.4285714 + 37200 0.001331474 0 2.4647885e-05 2.9564413e-05 6.151617e-05 9.4285714 + 37300 0.0013895388 0 3.1218344e-05 5.3264584e-05 5.4150714e-05 9.4285714 + 37400 0.001407333 0 2.9698504e-05 3.9474095e-05 6.2202002e-05 9.4285714 + 37500 0.0013815772 0 1.8291183e-05 3.6964703e-05 4.5117987e-05 9.4285714 + 37600 0.001367937 0 7.4389408e-06 4.5115277e-05 6.3566279e-05 9.4285714 + 37700 0.0013781896 0 1.1284658e-05 3.3828999e-05 3.0356852e-05 9.4285714 + 37800 0.0013938097 0 7.4598099e-06 2.7777999e-05 4.0234563e-05 9.4285714 + 37900 0.0013788852 0 1.5446137e-05 3.4929786e-05 5.4102572e-05 9.4285714 + 38000 0.0013409916 0 1.4441923e-05 3.3307632e-05 3.9082488e-05 9.4285714 + 38100 0.0013548793 0 6.7717499e-06 2.1259364e-05 6.6745044e-05 9.4285714 + 38200 0.0013619894 0 6.5554231e-06 2.8685491e-05 5.3680355e-05 9.4285714 + 38300 0.0013593654 0 1.056312e-05 2.2266742e-05 4.345309e-05 9.4285714 + 38400 0.0013488508 0 1.557872e-05 2.3814902e-05 6.6112512e-05 9.4285714 + 38500 0.0013399961 0 1.5993586e-05 2.3166151e-05 6.6558579e-05 9.4285714 + 38600 0.0013473117 0 1.5515364e-05 1.4310057e-05 5.3828044e-05 9.4285714 + 38700 0.0013275262 0 1.3467545e-05 3.6691606e-05 5.4651816e-05 9.4285714 + 38800 0.001304838 0 1.2622031e-05 1.8240819e-05 6.8478029e-05 9.4285714 + 38900 0.0012981525 0 1.5965351e-05 7.301553e-07 6.0493525e-05 9.4285714 + 39000 0.0013241474 0 1.090791e-05 1.3786425e-05 5.8612758e-05 9.4285714 + 39100 0.0013302715 0 1.3962184e-05 7.7290833e-06 7.2626585e-05 9.4285714 + 39200 0.0013338793 0 1.9124677e-05 1.2103012e-05 6.4272665e-05 9.4285714 + 39300 0.001337749 0 1.2034083e-05 2.0304797e-05 5.5832191e-05 9.4285714 + 39400 0.0014184127 0 2.3587723e-05 2.6667391e-05 6.1393117e-05 9.4285714 + 39500 0.0015076229 0 3.3529982e-05 2.8742772e-05 5.1854875e-05 9.4285714 + 39600 0.001584196 0 3.329731e-05 3.2142836e-05 5.5667568e-05 9.4285714 + 39700 0.0016673141 0 4.3874089e-05 3.911096e-05 6.1078216e-05 9.4285714 + 39800 0.0016983633 0 3.5412377e-05 3.3834797e-05 4.7630906e-05 9.4285714 + 39900 0.001721388 0 3.933382e-05 3.2179967e-05 4.124963e-05 9.4285714 + 40000 0.0016511866 0 4.0224006e-05 3.6540739e-05 6.1229941e-05 9.4285714 + 40100 0.0015902117 0 3.6395621e-05 3.46428e-05 5.5755476e-05 9.4285714 + 40200 0.0016248457 0 3.4583893e-05 3.816918e-05 4.6174117e-05 9.4285714 + 40300 0.001639017 0 3.2218286e-05 2.1195869e-05 5.094444e-05 9.4285714 + 40400 0.0015947128 0 3.6248764e-05 2.1295273e-05 6.3147523e-05 9.4285714 + 40500 0.0014886812 0 4.7131763e-05 2.4191444e-05 7.2883457e-05 9.4285714 + 40600 0.001483951 0 3.6448135e-05 2.6739025e-05 5.5832321e-05 9.4285714 + 40700 0.0014877422 0 3.5828172e-05 1.4229622e-05 5.437453e-05 9.4285714 + 40800 0.0014974798 0 3.9713792e-05 5.9573135e-06 7.8424652e-05 9.4285714 + 40900 0.0014499802 0 3.0640365e-05 1.6594208e-05 5.5042674e-05 9.4285714 + 41000 0.001395913 0 4.4086797e-05 2.1374448e-05 6.842533e-05 9.4285714 + 41100 0.0014079985 0 3.4018478e-05 4.769345e-06 8.7786364e-05 9.4285714 + 41200 0.0014187083 0 2.5282617e-05 1.068147e-05 4.998439e-05 9.4285714 + 41300 0.0014072972 0 3.8324312e-05 2.7053184e-05 7.2652898e-05 9.4285714 + 41400 0.0014168981 0 2.2198923e-05 2.385181e-05 5.9696044e-05 9.4285714 + 41500 0.0014248439 0 2.2507889e-05 2.4943991e-05 4.8133783e-05 9.4285714 + 41600 0.0014225044 0 1.7477309e-05 2.4821833e-05 7.3031953e-05 9.4285714 + 41700 0.0014075811 0 6.0477226e-06 3.3082497e-05 4.6074646e-05 9.4285714 + 41800 0.0012680617 0 4.0229918e-05 4.5845799e-05 4.7760436e-05 9.4285714 + 41900 0.0010587818 0 8.7500075e-05 2.7520625e-05 8.5329729e-05 9.4285714 + 42000 0.0010007004 0 7.957049e-05 2.7796479e-05 7.179911e-05 9.4285714 + 42100 0.0011304402 0 6.7932609e-05 3.0223682e-05 8.4046251e-05 9.4285714 + 42200 0.0012833154 0 4.4695908e-05 3.1025337e-05 8.6333525e-05 9.4285714 + 42300 0.0013573853 0 3.7885389e-06 3.242561e-05 4.6636393e-05 9.4285714 + 42400 0.0013330633 0 2.5305413e-05 3.6210128e-05 7.9624924e-05 9.4285714 + 42500 0.0012896373 0 4.4892704e-05 4.5307645e-05 8.8376567e-05 9.4285714 + 42600 0.001296775 0 1.2123487e-05 3.1329317e-05 4.689266e-05 9.4285714 + 42700 0.0013193969 0 2.5015346e-05 3.7644129e-05 6.9158547e-05 9.4285714 + 42800 0.0013144903 0 2.7945886e-05 4.3976185e-05 7.2258209e-05 9.4285714 + 42900 0.0013053554 0 2.4932516e-05 2.56847e-05 5.5060153e-05 9.4285714 + 43000 0.0013061323 0 3.505508e-05 3.6703149e-05 6.4102162e-05 9.4285714 + 43100 0.0013149372 0 2.038307e-05 3.6535953e-05 7.001205e-05 9.4285714 + 43200 0.0013063189 0 2.268783e-05 3.1284363e-05 7.1489703e-05 9.4285714 + 43300 0.0012669853 0 4.2151966e-05 3.9616841e-05 8.600203e-05 9.4285714 + 43400 0.0012238388 0 5.3831605e-05 3.1663968e-05 0.00010748716 9.4285714 + 43500 0.0012053096 0 4.8917941e-05 4.1146437e-05 8.2504846e-05 9.4285714 + 43600 0.001243323 0 5.6671957e-05 4.1809653e-05 6.8354881e-05 9.4285714 + 43700 0.001354992 0 6.1374672e-05 3.8833483e-05 7.767147e-05 9.4285714 + 43800 0.0015252788 0 5.8329091e-05 4.5092041e-05 6.9458926e-05 9.4285714 + 43900 0.0016845587 0 5.2409784e-05 4.1549162e-05 6.3318187e-05 9.4285714 + 44000 0.0016987088 0 4.7336939e-05 3.8434001e-05 3.9736647e-05 9.4285714 + 44100 0.0016663634 0 5.3015191e-05 4.4114496e-05 6.0593021e-05 9.4285714 + 44200 0.0016642734 0 5.214706e-05 4.2354707e-05 7.5907264e-05 9.4285714 + 44300 0.0016877933 0 5.0208545e-05 4.4720314e-05 4.2475579e-05 9.4285714 + 44400 0.0016937941 0 5.5355055e-05 4.3854147e-05 5.5002022e-05 9.4285714 + 44500 0.001658184 0 3.9777309e-05 4.0596489e-05 7.2900309e-05 9.4285714 + 44600 0.0016202756 0 2.9046764e-05 4.4611362e-05 8.4216927e-05 9.4285714 + 44700 0.0012624519 0 5.8118979e-05 5.1336615e-05 8.5097154e-05 9.4285714 + 44800 0.0012148648 0 4.7990064e-05 4.5865246e-05 0.00010159441 9.4285714 + 44900 0.0012565599 0 2.0587612e-05 1.8054993e-05 7.9471736e-05 9.4285714 + 45000 0.0012298496 0 5.4851152e-05 4.3491138e-05 8.0059008e-05 9.4285714 + 45100 0.0012274205 0 5.2324153e-05 3.6704358e-05 8.9721391e-05 9.4285714 + 45200 0.0012389066 0 3.7648091e-05 4.0944545e-05 9.5234226e-05 9.4285714 + 45300 0.0012251609 0 6.0261206e-05 5.1852752e-05 9.0949936e-05 9.4285714 + 45400 0.0012814774 0 6.4393391e-05 3.7667283e-05 7.6665383e-05 9.4285714 + 45500 0.0013450626 0 5.3955889e-05 3.333518e-05 6.2323361e-05 9.4285714 + 45600 0.0013741472 0 7.6840597e-05 4.8885582e-05 7.5101429e-05 9.4285714 + 45700 0.0014351223 0 6.9926667e-05 4.095132e-05 6.4348005e-05 9.4285714 + 45800 0.0015284371 0 6.5168141e-05 5.0243258e-05 5.8089422e-05 9.4285714 + 45900 0.001575355 0 6.7430051e-05 6.1147022e-05 7.5616361e-05 9.4285714 + 46000 0.0015147792 0 5.974587e-05 5.4339958e-05 6.89933e-05 9.4285714 + 46100 0.0014504182 0 5.7541539e-05 5.0006578e-05 7.0543678e-05 9.4285714 + 46200 0.0014410639 0 5.8653588e-05 5.2586065e-05 8.1219081e-05 9.4285714 + 46300 0.0014810525 0 4.7027763e-05 3.957261e-05 4.9542345e-05 9.4285714 + 46400 0.0014640215 0 4.979541e-05 1.7965262e-05 6.0180114e-05 9.4285714 + 46500 0.0014424933 0 5.8745985e-05 5.7017286e-05 6.8960391e-05 9.4285714 + 46600 0.001441165 0 6.0140939e-05 4.6475918e-05 5.6358378e-05 9.4285714 + 46700 0.0015025344 0 5.7998976e-05 1.9007372e-05 6.9395672e-05 9.4285714 + 46800 0.0015582176 0 5.9436654e-05 4.8677122e-05 5.618251e-05 9.4285714 + 46900 0.0015803324 0 5.4329951e-05 4.4548088e-05 4.6224761e-05 9.4285714 + 47000 0.001675143 0 6.7118862e-05 5.1584703e-05 6.351515e-05 9.4285714 + 47100 0.0017769921 0 6.6842957e-05 5.3736059e-05 5.062399e-05 9.4285714 + 47200 0.0018358006 0 7.1689975e-05 5.6118418e-05 4.7990149e-05 9.4285714 + 47300 0.0017951326 0 7.4127289e-05 7.3816363e-05 5.0104237e-05 9.4285714 + 47400 0.0017057371 0 7.2774664e-05 4.7651294e-05 3.5218695e-05 9.4285714 + 47500 0.0016744493 0 6.6367496e-05 5.9365352e-05 5.0217044e-05 9.4285714 + 47600 0.0014031951 0 7.8136546e-05 6.6155937e-05 6.7384693e-05 9.4285714 + 47700 0.0013373039 0 7.0639329e-05 2.511137e-05 3.9534806e-05 9.4285714 + 47800 0.0014704003 0 6.5287146e-05 6.1682091e-05 5.2105143e-05 9.4285714 + 47900 0.0014934525 0 5.7380229e-05 6.0784906e-05 5.1933873e-05 9.4285714 + 48000 0.0014895856 0 5.7777082e-05 3.2566077e-05 5.6885486e-05 9.4285714 + 48100 0.00146967 0 6.2296437e-05 5.9058125e-05 8.2342951e-05 9.4285714 + 48200 0.0015682986 0 5.6963813e-05 6.9617445e-05 5.2534658e-05 9.4285714 + 48300 0.0017163505 0 6.1379044e-05 7.1818241e-05 5.7325956e-05 9.4285714 + 48400 0.0014261936 0 7.3161005e-05 6.1824088e-05 8.2548349e-05 9.4285714 + 48500 0.0014236361 0 6.1449743e-05 4.8278985e-05 4.0124971e-05 9.4285714 + 48600 0.0014562257 0 4.5352973e-05 6.5203729e-05 2.9114173e-05 9.4285714 + 48700 0.0013758282 0 5.142512e-05 5.5645429e-05 5.0808976e-05 9.4285714 + 48800 0.0014316476 0 4.7089175e-05 2.3932718e-05 6.2491645e-05 9.4285714 + 48900 0.0014805023 0 3.202017e-05 2.5779532e-05 2.4693407e-05 9.4285714 + 49000 0.0013776549 0 4.5921287e-05 3.5365771e-05 4.1227618e-05 9.4285714 + 49100 0.0013617488 0 3.9474501e-05 4.6966656e-05 9.1036599e-05 9.4285714 + 49200 0.0013342401 0 7.8714486e-05 3.901494e-05 4.6082427e-05 9.4285714 + 49300 0.001276486 0 8.5308627e-05 4.9747481e-05 6.6920379e-05 9.4285714 + 49400 0.0011795288 0 5.385526e-05 7.1565933e-05 7.5941735e-05 9.4285714 + 49500 0.0011435859 0 6.7438968e-05 5.252065e-05 4.4969603e-05 9.4285714 + 49600 0.001247689 0 4.8189516e-05 5.606737e-05 7.5562669e-05 9.4285714 + 49700 0.0013371245 0 3.0586887e-05 3.3461339e-05 5.7168685e-05 9.4285714 + 49800 0.001301722 0 3.5961521e-05 4.0225086e-05 5.5419691e-05 9.4285714 + 49900 0.0012728363 0 3.781088e-05 6.7681947e-05 7.3469228e-05 9.4285714 + 50000 0.0013286836 0 2.0747917e-05 3.2920899e-05 5.6036366e-05 9.4285714 + 50100 0.0013460063 0 2.2076031e-05 3.3652205e-05 6.008755e-05 9.4285714 + 50200 0.0012868089 0 2.9384106e-05 5.6767755e-05 7.0843856e-05 9.4285714 + 50300 0.0012765172 0 3.4521368e-05 4.9418831e-05 7.0177943e-05 9.4285714 + 50400 0.0012703222 0 3.6291462e-05 6.8474511e-05 7.0682948e-05 9.4285714 + 50500 0.0011906512 0 4.1093781e-05 7.1478191e-05 7.2068398e-05 9.4285714 + 50600 0.0011537339 0 3.1556882e-05 4.1722061e-05 7.9155785e-05 9.4285714 + 50700 0.0011267336 0 2.9306562e-05 5.3537978e-05 0.00010138475 9.4285714 + 50800 0.0011753482 0 4.1295435e-05 4.117216e-05 0.00010940627 9.4285714 + 50900 0.0011919232 0 3.5291826e-05 2.7690085e-05 6.4859546e-05 9.4285714 + 51000 0.0011838525 0 3.7804427e-05 4.3372281e-05 7.4969581e-05 9.4285714 + 51100 0.0011883954 0 6.1459693e-05 4.6697285e-05 7.7009321e-05 9.4285714 + 51200 0.0012349694 0 4.8996624e-05 3.1792466e-05 4.2980098e-05 9.4285714 + 51300 0.0012337432 0 3.0225925e-05 3.3059018e-05 6.4590344e-05 9.4285714 + 51400 0.0011577306 0 8.2698384e-05 3.8030266e-05 9.1759993e-05 9.4285714 + 51500 0.0011811724 0 5.9469946e-05 3.0730225e-05 9.4515804e-05 9.4285714 + 51600 0.0012159313 0 4.752115e-05 2.2092938e-05 8.3450965e-05 9.4285714 + 51700 0.0011936762 0 5.9485961e-05 3.9926221e-05 9.155953e-05 9.4285714 + 51800 0.00119466 0 3.5951585e-05 4.0938525e-05 8.2492561e-05 9.4285714 + 51900 0.0012013641 0 3.9985087e-05 3.1268943e-05 6.9196585e-05 9.4285714 + 52000 0.0011652185 0 4.7598806e-05 4.0944772e-05 8.152202e-05 9.4285714 + 52100 0.0011222289 0 3.739268e-05 4.0163882e-05 7.9877837e-05 9.4285714 + 52200 0.0011223637 0 4.1767012e-05 4.3238615e-05 8.1620009e-05 9.4285714 + 52300 0.00108781 0 4.2621468e-05 4.8449175e-05 8.8351917e-05 9.4285714 + 52400 0.0010329114 0 4.2272037e-05 4.6831094e-05 9.0371289e-05 9.4285714 + 52500 0.0010414794 0 5.8841141e-05 4.2908938e-05 9.7364103e-05 9.4285714 + 52600 0.0011160581 0 5.0413342e-05 4.0018307e-05 8.1832238e-05 9.4285714 + 52700 0.0011365494 0 5.4799404e-05 3.9990197e-05 6.8582155e-05 9.4285714 + 52800 0.0011528486 0 5.9449422e-05 4.4180114e-05 7.8135764e-05 9.4285714 + 52900 0.001215765 0 7.724582e-05 6.6093449e-05 0.0001064278 9.4285714 + 53000 0.0013368124 0 7.3703922e-05 5.0858461e-05 7.6836114e-05 9.4285714 + 53100 0.0013407312 0 6.2171068e-05 5.3889729e-05 6.880048e-05 9.4285714 + 53200 0.0013326843 0 6.4548253e-05 6.224984e-05 8.4641195e-05 9.4285714 + 53300 0.0013239729 0 6.0319543e-05 5.8209843e-05 6.5588436e-05 9.4285714 + 53400 0.0013217143 0 5.3952234e-05 6.2188072e-05 5.7866618e-05 9.4285714 + 53500 0.0012781803 0 6.1927188e-05 7.8771424e-05 6.5769719e-05 9.4285714 + 53600 0.001268382 0 6.6769939e-05 6.7552155e-05 7.9292264e-05 9.4285714 + 53700 0.0012069904 0 6.3035353e-05 7.6839293e-05 6.4761494e-05 9.4285714 + 53800 0.0011968988 0 7.7775234e-05 8.0850068e-05 6.4073986e-05 9.4285714 + 53900 0.0011731954 0 7.8942799e-05 6.415663e-05 6.8798682e-05 9.4285714 + 54000 0.0011606061 0 7.0843597e-05 6.4421097e-05 5.9264639e-05 9.4285714 + 54100 0.0011658982 0 7.3791408e-05 5.9714351e-05 5.9388294e-05 9.4285714 + 54200 0.0011195165 0 7.5062867e-05 5.1967479e-05 6.6867658e-05 9.4285714 + 54300 0.0010220393 0 7.1628947e-05 5.5455247e-05 7.5330768e-05 9.4285714 + 54400 0.0010086172 0 7.5800982e-05 4.2581182e-05 9.7752447e-05 9.4285714 + 54500 0.0010183988 0 6.9462298e-05 2.7534816e-05 9.3677455e-05 9.4285714 + 54600 0.0010068716 0 6.3307701e-05 4.0044863e-05 6.4661139e-05 9.4285714 + 54700 0.00099012603 0 6.054033e-05 3.7788592e-05 7.4230926e-05 9.4285714 + 54800 0.0009683722 0 7.7618706e-05 3.4929403e-05 8.2615118e-05 9.4285714 + 54900 0.00097629715 0 6.0748376e-05 4.7953003e-05 6.5727568e-05 9.4285714 + 55000 0.00095157382 0 5.7032086e-05 3.6371601e-05 6.1479859e-05 9.4285714 + 55100 0.00090688968 0 6.6813633e-05 3.8068449e-05 6.0136453e-05 9.4285714 + 55200 0.00088813057 0 5.4468645e-05 4.2209266e-05 5.6362466e-05 9.4285714 + 55300 0.00092557007 0 4.5622928e-05 3.7235869e-05 5.519561e-05 9.4285714 + 55400 0.00091327263 0 3.1184159e-05 4.7698311e-05 4.1473986e-05 9.4285714 + 55500 0.00079921186 0 4.2037172e-05 5.9276972e-05 5.152938e-05 9.4285714 + 55600 0.00081947901 0 5.355572e-05 6.752627e-05 7.3883049e-05 9.4285714 + 55700 0.00084804465 0 1.9648479e-05 2.4946587e-05 7.3095049e-05 9.4285714 + 55800 0.00085118568 0 2.6490199e-05 4.8069956e-05 5.690315e-05 9.4285714 + 55900 0.00079015144 0 5.1906966e-05 3.7090677e-05 6.8990067e-05 9.4285714 + 56000 0.00077424122 0 5.5619324e-05 2.6584622e-05 7.9553055e-05 9.4285714 + 56100 0.00078729859 0 5.7527201e-05 5.8252464e-05 5.5596022e-05 9.4285714 + 56200 0.00073803593 0 6.0864638e-05 2.5528312e-05 6.7041285e-05 9.4285714 + 56300 0.00072042566 0 6.6197657e-05 2.6713058e-05 8.9317267e-05 9.4285714 + 56400 0.00072618636 0 7.0243805e-05 4.6306853e-05 6.6723713e-05 9.4285714 + 56500 0.00072889383 0 6.1503242e-05 3.1283082e-05 5.6818079e-05 9.4285714 + 56600 0.00071687768 0 6.0574003e-05 3.8132065e-05 7.2674723e-05 9.4285714 + 56700 0.00070767909 0 6.2668821e-05 3.182732e-05 6.6720519e-05 9.4285714 + 56800 0.0007079533 0 5.0107283e-05 2.8951951e-05 7.3466661e-05 9.4285714 + 56900 0.00068006672 0 6.2013944e-05 5.565292e-05 6.162706e-05 9.4285714 + 57000 0.000671041 0 6.7800283e-05 4.9108988e-05 5.0514824e-05 9.4285714 + 57100 0.00074371147 0 6.0778783e-05 4.6623614e-05 7.0016036e-05 9.4285714 + 57200 0.00081400221 0 6.6854831e-05 5.6455913e-05 4.7909892e-05 9.4285714 + 57300 0.000917037 0 6.037679e-05 5.831922e-05 3.0276201e-05 9.4285714 + 57400 0.00094626663 0 3.6929202e-05 5.5118126e-05 6.3066718e-05 9.4285714 + 57500 0.00093346301 0 4.2929284e-05 6.1155376e-05 5.975267e-05 9.4285714 + 57600 0.00093999622 0 5.4774372e-05 5.4704358e-05 6.248684e-05 9.4285714 + 57700 0.00094337314 0 5.1052798e-05 5.8541842e-05 7.5050098e-05 9.4285714 + 57800 0.00092645123 0 5.4055981e-05 6.1848007e-05 6.7174441e-05 9.4285714 + 57900 0.00091253668 0 4.336952e-05 5.0710047e-05 6.1963165e-05 9.4285714 + 58000 0.0009262852 0 4.2890115e-05 4.3909161e-05 6.5498785e-05 9.4285714 + 58100 0.00093298888 0 3.4648981e-05 3.9769303e-05 4.8809176e-05 9.4285714 + 58200 0.00093354721 0 2.9625295e-05 3.8316918e-05 4.9736312e-05 9.4285714 + 58300 0.00093283167 0 3.7120772e-05 3.3230543e-05 5.9892908e-05 9.4285714 + 58400 0.00093485322 0 3.2158058e-05 3.1324318e-05 4.9175918e-05 9.4285714 + 58500 0.00092566721 0 3.7365351e-05 2.89221e-05 5.5349063e-05 9.4285714 + 58600 0.00093205032 0 5.0065939e-05 5.3559803e-05 6.3571654e-05 9.4285714 + 58700 0.00094034992 0 3.8592173e-05 3.491305e-05 6.5379756e-05 9.4285714 + 58800 0.00096489026 0 4.1216942e-05 2.6009902e-05 7.102403e-05 9.4285714 + 58900 0.00097781296 0 6.3787952e-05 5.0445974e-05 6.6836738e-05 9.4285714 + 59000 0.00095088201 0 3.1388682e-05 2.6786636e-05 7.0766736e-05 9.4285714 + 59100 0.00092096092 0 4.7421629e-05 4.3182864e-05 7.2537665e-05 9.4285714 + 59200 0.0009112309 0 5.9256553e-05 5.4527325e-05 6.2965257e-05 9.4285714 + 59300 0.00090372653 0 3.3360205e-05 4.1028509e-05 6.9712928e-05 9.4285714 + 59400 0.00086115007 0 5.1420253e-05 8.2036947e-05 6.6038419e-05 9.4285714 + 59500 0.00078451189 0 7.66347e-05 7.591886e-05 6.2707873e-05 9.4285714 + 59600 0.00078587175 0 3.7807167e-05 3.6366682e-05 6.7965056e-05 9.4285714 + 59700 0.00080103949 0 5.7673906e-05 4.7966293e-05 7.051971e-05 9.4285714 + 59800 0.00078782591 0 4.4966944e-05 4.2368336e-05 6.5414206e-05 9.4285714 + 59900 0.00077243837 0 2.4721291e-05 4.6742391e-05 6.6324623e-05 9.4285714 + 60000 0.00075159859 0 5.8959702e-05 5.3911659e-05 7.3517042e-05 9.4285714 + 60100 0.00072169229 0 5.5959875e-05 5.9933611e-05 7.0405063e-05 9.4285714 + 60200 0.00067937954 0 8.4634924e-05 6.6869788e-05 7.3608653e-05 9.4285714 + 60300 0.00067260226 0 0.0001081277 4.7614083e-05 7.0175997e-05 9.4285714 + 60400 0.00069286984 0 5.9196097e-05 4.3191533e-05 5.2139603e-05 9.4285714 + 60500 0.00069736312 0 5.085609e-05 5.5875528e-05 6.6887124e-05 9.4285714 + 60600 0.00069858614 0 4.9289319e-05 4.5459761e-05 7.1668508e-05 9.4285714 + 60700 0.00069821214 0 3.1823553e-05 3.3716244e-05 5.5201529e-05 9.4285714 + 60800 0.0007035508 0 5.1159207e-05 3.5328208e-05 6.3688313e-05 9.4285714 + 60900 0.00070770846 0 4.0687682e-05 2.1755707e-05 6.6080801e-05 9.4285714 + 61000 0.00070195965 0 3.7971557e-05 2.1957987e-05 6.0082676e-05 9.4285714 + 61100 0.00067865064 0 5.7377129e-05 2.5987671e-05 6.872458e-05 9.4285714 + 61200 0.00063690893 0 3.9606468e-05 2.5848129e-05 6.6201193e-05 9.4285714 + 61300 0.00064194236 0 5.2441034e-05 3.4655185e-05 5.8671505e-05 9.4285714 + 61400 0.00063121847 0 4.7935018e-05 2.2491486e-05 5.8084377e-05 9.4285714 + 61500 0.00065356029 0 3.7527612e-05 2.0937477e-05 4.887051e-05 9.4285714 + 61600 0.00066743886 0 3.8559623e-05 2.5014056e-05 4.3951677e-05 9.4285714 + 61700 0.00064876312 0 3.2600293e-05 2.2241219e-05 5.700072e-05 9.4285714 + 61800 0.00063251553 0 3.7962233e-05 2.4996757e-05 6.3827843e-05 9.4285714 + 61900 0.00065196202 0 4.1125532e-05 2.1960645e-05 5.3369952e-05 9.4285714 + 62000 0.00066211487 0 3.5477887e-05 2.2798208e-05 4.6798579e-05 9.4285714 + 62100 0.00063838911 0 4.2783526e-05 3.0011478e-05 5.2953097e-05 9.4285714 + 62200 0.00062154839 0 4.2874196e-05 2.533148e-05 6.0806919e-05 9.4285714 + 62300 0.00063042258 0 3.7398998e-05 2.3748859e-05 5.50952e-05 9.4285714 + 62400 0.00064307282 0 4.2219258e-05 2.4395739e-05 4.2906023e-05 9.4285714 + 62500 0.00062261967 0 4.3025073e-05 2.0264778e-05 4.8658599e-05 9.4285714 + 62600 0.00053916399 0 3.5096062e-05 2.6627415e-05 6.589849e-05 9.4285714 + 62700 0.00057010612 0 3.1052104e-05 2.4098754e-05 5.5807999e-05 9.4285714 + 62800 0.00057237373 0 2.4705173e-05 2.7289243e-05 5.0697954e-05 9.4285714 + 62900 0.00056115858 0 3.4438793e-05 2.5529621e-05 6.6910453e-05 9.4285714 + 63000 0.0005691916 0 3.2831951e-05 3.4373261e-05 6.7414973e-05 9.4285714 + 63100 0.00056814223 0 3.0683193e-05 4.0598453e-05 6.0776437e-05 9.4285714 + 63200 0.00055359969 0 3.3021543e-05 2.205701e-05 6.6701949e-05 9.4285714 + 63300 0.00053663894 0 2.9793234e-05 2.4124459e-05 6.7366363e-05 9.4285714 + 63400 0.00055318219 0 3.5076151e-05 3.7492408e-05 6.7248496e-05 9.4285714 + 63500 0.0005601025 0 3.1596017e-05 2.838392e-05 5.758537e-05 9.4285714 + 63600 0.00054583913 0 3.1887335e-05 3.3258333e-05 6.4545104e-05 9.4285714 + 63700 0.00053483868 0 4.1596672e-05 3.1294263e-05 7.517425e-05 9.4285714 + 63800 0.00055522493 0 3.672744e-05 2.2703198e-05 5.6489688e-05 9.4285714 + 63900 0.00056121598 0 3.7366567e-05 3.3134619e-05 5.2202899e-05 9.4285714 + 64000 0.00054407633 0 4.3628447e-05 2.8715277e-05 6.6320822e-05 9.4285714 + 64100 0.00053661653 0 3.9455768e-05 2.7513024e-05 6.5322037e-05 9.4285714 + 64200 0.00055006192 0 3.8096257e-05 3.5652328e-05 5.7299498e-05 9.4285714 + 64300 0.00055163304 0 3.6955416e-05 3.1648454e-05 5.7391176e-05 9.4285714 + 64400 0.00053078787 0 3.7098375e-05 3.3595793e-05 6.6463932e-05 9.4285714 + 64500 0.00052058058 0 4.6628247e-05 3.4753784e-05 7.0892035e-05 9.4285714 + 64600 0.00052834957 0 4.414476e-05 3.6395151e-05 6.316293e-05 9.4285714 + 64700 0.00051311026 0 3.5727083e-05 3.8183336e-05 6.671273e-05 9.4285714 + 64800 0.00048606856 0 4.2559508e-05 4.0103891e-05 8.1477875e-05 9.4285714 + 64900 0.00047345864 0 5.0985821e-05 4.0731547e-05 7.1758651e-05 9.4285714 + 65000 0.00048454696 0 4.7098363e-05 4.2424083e-05 5.9782966e-05 9.4285714 + 65100 0.00048928041 0 3.8488893e-05 3.3069689e-05 6.763104e-05 9.4285714 + 65200 0.00047037779 0 3.7164979e-05 2.9130535e-05 6.7155792e-05 9.4285714 + 65300 0.000474477 0 3.9218249e-05 4.196618e-05 6.8795241e-05 9.4285714 + 65400 0.00047558993 0 3.8521073e-05 3.1043813e-05 7.1815292e-05 9.4285714 + 65500 0.00046258212 0 4.1593649e-05 3.414273e-05 7.5432256e-05 9.4285714 + 65600 0.00044433429 0 3.5579651e-05 5.4040477e-05 7.7356068e-05 9.4285714 + 65700 0.00045238336 0 3.9273267e-05 4.3267794e-05 6.3398702e-05 9.4285714 + 65800 0.00045926142 0 3.9114883e-05 4.3180432e-05 5.1925433e-05 9.4285714 + 65900 0.00045814994 0 3.5346175e-05 4.9168887e-05 5.5917302e-05 9.4285714 + 66000 0.00045395179 0 4.1802785e-05 4.1841434e-05 5.4654623e-05 9.4285714 + 66100 0.00044097892 0 4.303704e-05 4.8028086e-05 5.8818816e-05 9.4285714 + 66200 0.00041508101 0 4.8543666e-05 3.9621607e-05 7.3522108e-05 9.4285714 + 66300 0.00041227685 0 5.2084505e-05 4.5979245e-05 6.8430336e-05 9.4285714 + 66400 0.00039539458 0 4.6843181e-05 6.5667377e-05 6.7548286e-05 9.4285714 + 66500 0.00038647539 0 4.608784e-05 4.6277662e-05 6.9495307e-05 9.4285714 + 66600 0.00037432719 0 4.3913456e-05 3.8070862e-05 6.6935341e-05 9.4285714 + 66700 0.00035679642 0 5.5360539e-05 5.3483363e-05 7.063512e-05 9.4285714 + 66800 0.00034618795 0 5.847549e-05 4.4325179e-05 7.0488097e-05 9.4285714 + 66900 0.00032906055 0 5.8213474e-05 3.75252e-05 6.6649118e-05 9.4285714 + 67000 0.00031945785 0 6.3298441e-05 5.2701267e-05 7.7167191e-05 9.4285714 + 67100 0.00031672216 0 4.489739e-05 3.7559519e-05 7.3281523e-05 9.4285714 + 67200 0.00030445379 0 4.5513665e-05 4.0230046e-05 7.5439548e-05 9.4285714 + 67300 0.00028386109 0 5.0694754e-05 5.3700723e-05 8.5557097e-05 9.4285714 + 67400 0.00028463754 0 3.8391205e-05 3.3590941e-05 7.797623e-05 9.4285714 + 67500 0.00028212316 0 4.2863805e-05 4.5202441e-05 7.749573e-05 9.4285714 + 67600 0.00027447589 0 5.543118e-05 5.8396501e-05 7.4714483e-05 9.4285714 + 67700 0.00026388856 0 5.0592736e-05 4.4055104e-05 6.9911544e-05 9.4285714 + 67800 0.00024769801 0 6.5177148e-05 4.5745739e-05 6.5602599e-05 9.4285714 + 67900 0.00024192231 0 6.9377263e-05 4.6139865e-05 5.8414044e-05 9.4285714 + 68000 0.00023732277 0 5.0197197e-05 3.9809922e-05 5.4178627e-05 9.4285714 + 68100 0.0002230537 0 5.4643625e-05 4.3410202e-05 5.8363052e-05 9.4285714 + 68200 0.00020295655 0 5.7973425e-05 4.2934462e-05 5.3811509e-05 9.4285714 + 68300 0.0002040692 0 5.3065138e-05 3.4839799e-05 4.2275493e-05 9.4285714 + 68400 0.0001928169 0 6.1792781e-05 3.7412012e-05 4.3570824e-05 9.4285714 + 68500 0.00019326451 0 5.2340518e-05 3.8984277e-05 4.7626124e-05 9.4285714 + 68600 0.00019061041 0 3.3931824e-05 3.7677933e-05 4.0928013e-05 9.4285714 + 68700 0.00017904605 0 4.0673445e-05 4.3141559e-05 3.9727826e-05 9.4285714 + 68800 0.00017200167 0 3.8350528e-05 4.2946416e-05 3.8465748e-05 9.4285714 + 68900 0.00016728354 0 3.1344975e-05 4.3170379e-05 3.887812e-05 9.4285714 + 69000 0.00015703321 0 3.5673797e-05 4.8001887e-05 3.8324617e-05 9.4285714 + 69100 0.00014835113 0 4.4420071e-05 4.5039258e-05 3.7284097e-05 9.4285714 + 69200 0.00014631648 0 4.5177892e-05 3.9830143e-05 4.212271e-05 9.4285714 + 69300 0.00014587978 0 4.3274932e-05 3.563871e-05 4.1406359e-05 9.4285714 + 69400 0.0001418924 0 4.1983462e-05 3.3903645e-05 3.9133291e-05 9.4285714 + 69500 0.00013332024 0 4.1111435e-05 3.5405818e-05 4.5389867e-05 9.4285714 + 69600 0.00013320187 0 4.3136478e-05 3.8499769e-05 4.2978866e-05 9.4285714 + 69700 0.00013039836 0 3.9889343e-05 3.984009e-05 3.8089701e-05 9.4285714 + 69800 0.00012003394 0 4.0502669e-05 3.8418635e-05 4.4259944e-05 9.4285714 + 69900 0.00011651147 0 4.3215219e-05 3.6715848e-05 3.8146062e-05 9.4285714 + 70000 0.00012197106 0 3.5974329e-05 3.7263458e-05 3.1823087e-05 9.4285714 + 70100 0.00011813389 0 3.3261682e-05 3.922066e-05 3.7223065e-05 9.4285714 + 70200 0.00011097253 0 4.3507998e-05 4.1005238e-05 3.6828442e-05 9.4285714 + 70300 0.00010887364 0 4.2691098e-05 4.1645364e-05 3.1923473e-05 9.4285714 + 70400 0.00010916786 0 3.8897532e-05 3.8882274e-05 3.0505603e-05 9.4285714 + 70500 0.00010031774 0 4.4471407e-05 3.8144163e-05 3.4373186e-05 9.4285714 + 70600 9.1002834e-05 0 4.7098547e-05 3.649462e-05 3.426412e-05 9.4285714 + 70700 8.9186179e-05 0 4.3097819e-05 3.3856047e-05 2.6847974e-05 9.4285714 + 70800 9.1206485e-05 0 3.7704331e-05 3.2681829e-05 2.5848378e-05 9.4285714 + 70900 9.2333335e-05 0 3.5465377e-05 2.9981706e-05 2.5583227e-05 9.4285714 + 71000 9.1646266e-05 0 3.5132909e-05 2.8584216e-05 1.9282618e-05 9.4285714 + 71100 8.9976882e-05 0 3.1203655e-05 2.8088468e-05 2.108987e-05 9.4285714 + 71200 8.7702811e-05 0 2.9776889e-05 2.7094367e-05 2.4903607e-05 9.4285714 + 71300 8.6905185e-05 0 3.0520731e-05 2.732226e-05 2.3630509e-05 9.4285714 + 71400 8.5684023e-05 0 3.1640955e-05 2.8295849e-05 2.5514683e-05 9.4285714 + 71500 8.303695e-05 0 3.1906051e-05 2.8942238e-05 2.6131204e-05 9.4285714 + 71600 8.0199459e-05 0 3.0761704e-05 2.9470436e-05 2.487383e-05 9.4285714 + 71700 7.8917712e-05 0 3.2914973e-05 2.7677434e-05 2.5055145e-05 9.4285714 + 71800 8.006745e-05 0 3.1497824e-05 2.5000482e-05 2.4489101e-05 9.4285714 + 71900 7.8740588e-05 0 2.6991222e-05 2.460004e-05 2.3419712e-05 9.4285714 + 72000 7.758597e-05 0 2.8819401e-05 2.2478384e-05 2.4645592e-05 9.4285714 + 72100 7.7221401e-05 0 2.5009767e-05 1.991734e-05 2.4408972e-05 9.4285714 + 72200 7.6375029e-05 0 2.2842085e-05 2.1163227e-05 2.2915187e-05 9.4285714 + 72300 7.2834947e-05 0 2.6583555e-05 2.3097898e-05 2.3018668e-05 9.4285714 + 72400 7.2648265e-05 0 2.236431e-05 2.2607332e-05 2.3603044e-05 9.4285714 + 72500 7.3708292e-05 0 2.0776311e-05 2.25305e-05 2.4103466e-05 9.4285714 + 72600 7.1153221e-05 0 2.4306783e-05 2.313245e-05 2.3536247e-05 9.4285714 + 72700 6.9093949e-05 0 2.3601182e-05 2.178735e-05 2.3525837e-05 9.4285714 + 72800 7.0003138e-05 0 2.575131e-05 2.0944617e-05 2.5430066e-05 9.4285714 + 72900 7.097186e-05 0 2.6452603e-05 2.1328369e-05 2.53877e-05 9.4285714 + 73000 6.9754446e-05 0 2.213547e-05 2.0988145e-05 2.4646738e-05 9.4285714 + 73100 6.8919462e-05 0 2.2747069e-05 2.1416306e-05 2.4400352e-05 9.4285714 + 73200 7.0813485e-05 0 2.2484425e-05 2.0251199e-05 2.3243164e-05 9.4285714 + 73300 7.2448906e-05 0 1.9804724e-05 1.9246194e-05 2.1950811e-05 9.4285714 + 73400 7.1636811e-05 0 2.1255199e-05 2.0486399e-05 2.1055118e-05 9.4285714 + 73500 7.0735739e-05 0 2.0995952e-05 2.0423027e-05 2.0958957e-05 9.4285714 + 73600 7.103569e-05 0 2.0353207e-05 1.8013285e-05 2.1741465e-05 9.4285714 + 73700 7.1516165e-05 0 2.2806996e-05 1.7981222e-05 2.0668719e-05 9.4285714 + 73800 7.0454708e-05 0 2.2580346e-05 2.035185e-05 1.8435762e-05 9.4285714 + 73900 7.0921505e-05 0 2.1137284e-05 1.954202e-05 1.8049504e-05 9.4285714 + 74000 7.3462894e-05 0 2.0796149e-05 1.672734e-05 1.7886189e-05 9.4285714 + 74100 7.3200399e-05 0 1.9484009e-05 1.6171253e-05 1.7946802e-05 9.4285714 + 74200 7.1848724e-05 0 1.9770963e-05 1.743579e-05 1.9028311e-05 9.4285714 + 74300 7.2382347e-05 0 2.0879182e-05 1.7718467e-05 2.0981856e-05 9.4285714 + 74400 7.3931763e-05 0 2.0659065e-05 1.6936936e-05 2.2013677e-05 9.4285714 + 74500 7.4402751e-05 0 2.1252227e-05 1.8306621e-05 2.2140434e-05 9.4285714 + 74600 7.3859362e-05 0 2.1524301e-05 1.984441e-05 2.2433352e-05 9.4285714 + 74700 7.5361374e-05 0 2.0479515e-05 1.8257955e-05 2.2346749e-05 9.4285714 + 74800 7.7630509e-05 0 1.9658252e-05 1.7440486e-05 2.2082059e-05 9.4285714 + 74900 7.7455142e-05 0 1.9321421e-05 1.8948852e-05 2.2192267e-05 9.4285714 + 75000 7.6480769e-05 0 1.9864233e-05 1.958709e-05 2.2733891e-05 9.4285714 + 75100 7.7275693e-05 0 2.0777179e-05 1.8582778e-05 2.3848355e-05 9.4285714 + 75200 7.8822667e-05 0 2.0204804e-05 1.83074e-05 2.4082458e-05 9.4285714 + 75300 7.923137e-05 0 2.0681311e-05 2.0382671e-05 2.5228862e-05 9.4285714 + 75400 7.9015035e-05 0 2.1545898e-05 2.0989157e-05 2.7089143e-05 9.4285714 + 75500 8.0621162e-05 0 2.0520236e-05 1.9823266e-05 2.7897725e-05 9.4285714 + 75600 8.2299447e-05 0 1.9866765e-05 2.0164834e-05 2.7806735e-05 9.4285714 + 75700 8.1993378e-05 0 1.969152e-05 2.0690749e-05 2.7317517e-05 9.4285714 + 75800 8.1758987e-05 0 2.1884472e-05 2.0805882e-05 2.7195769e-05 9.4285714 + 75900 8.3084215e-05 0 2.4065485e-05 2.0289009e-05 2.8137854e-05 9.4285714 + 76000 8.197148e-05 0 2.3344459e-05 2.1043448e-05 2.9166608e-05 9.4285714 + 76100 7.3534139e-05 0 2.3656353e-05 2.1820885e-05 3.1715958e-05 9.4285714 + 76200 6.8283079e-05 0 1.8356974e-05 2.3351418e-05 3.3215539e-05 9.4285714 + 76300 7.8227289e-05 0 1.7533203e-05 2.0633655e-05 2.9627901e-05 9.4285714 + 76400 8.2994806e-05 0 2.2219758e-05 1.9318399e-05 2.6222999e-05 9.4285714 + 76500 8.3014892e-05 0 2.0667316e-05 2.3535727e-05 2.7388901e-05 9.4285714 + 76600 8.4226362e-05 0 1.8578669e-05 1.9657192e-05 2.6838122e-05 9.4285714 + 76700 8.6131526e-05 0 2.1318346e-05 1.9704283e-05 2.730706e-05 9.4285714 + 76800 8.5731394e-05 0 2.1580982e-05 2.4368187e-05 2.8520608e-05 9.4285714 + 76900 8.5941781e-05 0 2.0964064e-05 2.1327147e-05 2.8452609e-05 9.4285714 + 77000 8.8001094e-05 0 2.1055465e-05 2.1153136e-05 2.9261736e-05 9.4285714 + 77100 8.7224729e-05 0 2.157166e-05 2.54706e-05 3.1080633e-05 9.4285714 + 77200 8.4102799e-05 0 2.3215324e-05 2.4317882e-05 3.2166454e-05 9.4285714 + 77300 8.0313409e-05 0 2.3799728e-05 2.6151429e-05 3.549803e-05 9.4285714 + 77400 7.9230413e-05 0 2.5607704e-05 2.6668597e-05 3.4909306e-05 9.4285714 + 77500 7.811033e-05 0 2.7044141e-05 2.3924967e-05 3.6517465e-05 9.4285714 + 77600 7.7683573e-05 0 2.8108404e-05 2.590653e-05 4.0314953e-05 9.4285714 + 77700 7.5680467e-05 0 2.7599437e-05 2.6044761e-05 4.0283563e-05 9.4285714 + 77800 7.3449559e-05 0 2.8230675e-05 2.6304803e-05 4.0873298e-05 9.4285714 + 77900 7.3292429e-05 0 2.9736972e-05 2.7258167e-05 4.1876044e-05 9.4285714 + 78000 7.2392133e-05 0 3.1088456e-05 2.6772279e-05 4.2237468e-05 9.4285714 + 78100 7.0315679e-05 0 3.2315727e-05 2.629787e-05 4.2149426e-05 9.4285714 + 78200 7.1047062e-05 0 3.1623093e-05 2.447182e-05 4.0466876e-05 9.4285714 + 78300 6.8370248e-05 0 3.0139466e-05 2.3241895e-05 4.2084152e-05 9.4285714 + 78400 6.5550877e-05 0 3.5775791e-05 2.5111452e-05 4.5314214e-05 9.4285714 + 78500 6.1683926e-05 0 3.8020582e-05 2.4959462e-05 4.6453459e-05 9.4285714 + 78600 6.024047e-05 0 3.2986067e-05 2.5137808e-05 4.5563449e-05 9.4285714 + 78700 5.8543178e-05 0 3.3264031e-05 2.7364741e-05 4.56211e-05 9.4285714 + 78800 5.5383435e-05 0 3.3858442e-05 2.688989e-05 4.3178362e-05 9.4285714 + 78900 5.6871546e-05 0 3.3719755e-05 2.876403e-05 4.0383023e-05 9.4285714 + 79000 5.7192958e-05 0 3.419205e-05 3.2389045e-05 3.7915888e-05 9.4285714 + 79100 4.9998926e-05 0 3.9072498e-05 3.2982953e-05 4.5441877e-05 9.4285714 + 79200 4.9597887e-05 0 3.9993615e-05 3.3651972e-05 4.2214811e-05 9.4285714 + 79300 4.8603326e-05 0 3.4873095e-05 2.8101438e-05 2.9613495e-05 9.4285714 + 79400 4.7839304e-05 0 3.7935926e-05 2.6994548e-05 3.9174337e-05 9.4285714 + 79500 4.5739018e-05 0 3.7706927e-05 2.8505307e-05 3.9904116e-05 9.4285714 + 79600 4.2632104e-05 0 3.6880213e-05 3.0862386e-05 3.7417378e-05 9.4285714 + 79700 4.2716432e-05 0 3.862769e-05 3.295245e-05 4.4025915e-05 9.4285714 + 79800 4.3345358e-05 0 3.3850977e-05 2.8351966e-05 3.6271267e-05 9.4285714 + 79900 4.2476967e-05 0 3.1294363e-05 3.0560471e-05 3.5478598e-05 9.4285714 + 80000 4.0478442e-05 0 3.266321e-05 3.0397886e-05 3.74445e-05 9.4285714 + 80100 3.7842198e-05 0 3.3319254e-05 2.6553639e-05 3.0532809e-05 9.4285714 + 80200 2.8735215e-05 0 3.5014894e-05 3.2176514e-05 3.410418e-05 9.4285714 + 80300 2.5008575e-05 0 3.4679934e-05 3.3840734e-05 3.4314525e-05 9.4285714 + 80400 2.7560228e-05 0 3.2852873e-05 2.8962633e-05 3.0394406e-05 9.4285714 + 80500 3.0888649e-05 0 3.1507484e-05 2.597095e-05 3.271808e-05 9.4285714 + 80600 3.2512804e-05 0 3.0931277e-05 2.304269e-05 3.0253759e-05 9.4285714 + 80700 3.0635649e-05 0 3.1660238e-05 2.2282821e-05 2.8199016e-05 9.4285714 + 80800 2.7803874e-05 0 3.1776181e-05 2.4038027e-05 2.845472e-05 9.4285714 + 80900 2.7488104e-05 0 3.1599213e-05 2.3316746e-05 2.5212454e-05 9.4285714 + 81000 2.5760367e-05 0 3.5293658e-05 2.354429e-05 2.7532559e-05 9.4285714 + 81100 2.0516969e-05 0 3.67195e-05 2.8706508e-05 2.9782185e-05 9.4285714 + 81200 1.7005384e-05 0 3.5049273e-05 2.3159655e-05 2.8465517e-05 9.4285714 + 81300 1.8000969e-05 0 3.3259531e-05 2.0532469e-05 3.0967269e-05 9.4285714 + 81400 1.8404948e-05 0 2.8386836e-05 2.4730451e-05 2.8965301e-05 9.4285714 + 81500 1.7001638e-05 0 2.6431741e-05 2.1156098e-05 2.5679646e-05 9.4285714 + 81600 1.718853e-05 0 2.6737455e-05 2.2477484e-05 2.9190604e-05 9.4285714 + 81700 1.7653551e-05 0 2.5412396e-05 2.4251603e-05 2.8969143e-05 9.4285714 + 81800 1.60697e-05 0 2.5869197e-05 2.308932e-05 2.7379341e-05 9.4285714 + 81900 1.5286837e-05 0 2.6529612e-05 2.5419771e-05 2.8440593e-05 9.4285714 + 82000 1.6023107e-05 0 2.5756598e-05 2.4387052e-05 2.6106537e-05 9.4285714 + 82100 1.5242285e-05 0 2.7061408e-05 2.3032818e-05 2.4388599e-05 9.4285714 + 82200 1.3697011e-05 0 2.8635719e-05 2.3780226e-05 2.4906811e-05 9.4285714 + 82300 1.3126258e-05 0 2.9891427e-05 2.2014465e-05 2.4307976e-05 9.4285714 + 82400 1.3101796e-05 0 2.974623e-05 2.1196997e-05 2.3335031e-05 9.4285714 + 82500 1.2930812e-05 0 2.776572e-05 2.1405191e-05 2.1856013e-05 9.4285714 + 82600 1.2105591e-05 0 2.677033e-05 2.1158183e-05 2.1053083e-05 9.4285714 + 82700 1.1430058e-05 0 2.6491101e-05 2.2185095e-05 2.1741395e-05 9.4285714 + 82800 1.1220674e-05 0 2.5798118e-05 2.2107127e-05 2.2026313e-05 9.4285714 + 82900 1.0833337e-05 0 2.6248963e-05 2.2128181e-05 2.2633178e-05 9.4285714 + 83000 9.6966107e-06 0 2.6264061e-05 2.2728458e-05 2.4189433e-05 9.4285714 + 83100 9.7912048e-06 0 2.5500083e-05 2.1832923e-05 2.4004267e-05 9.4285714 + 83200 1.0342776e-05 0 2.5894996e-05 2.1114752e-05 2.2781046e-05 9.4285714 + 83300 9.1053605e-06 0 2.6844449e-05 2.1683135e-05 2.3018942e-05 9.4285714 + 83400 8.1376574e-06 0 2.7698506e-05 2.1715141e-05 2.3249723e-05 9.4285714 + 83500 8.3013823e-06 0 2.7841933e-05 2.1301843e-05 2.2608819e-05 9.4285714 + 83600 7.5747246e-06 0 2.7285945e-05 2.1917666e-05 2.1940362e-05 9.4285714 + 83700 6.7051973e-06 0 2.6570578e-05 2.2457872e-05 2.1768e-05 9.4285714 + 83800 6.7732855e-06 0 2.5876203e-05 2.1870094e-05 2.1810098e-05 9.4285714 + 83900 6.455146e-06 0 2.613284e-05 2.1133229e-05 2.141307e-05 9.4285714 + 84000 6.033363e-06 0 2.5796758e-05 2.0740854e-05 2.1789962e-05 9.4285714 + 84100 6.1544361e-06 0 2.4880893e-05 2.034968e-05 2.2632001e-05 9.4285714 + 84200 5.8120515e-06 0 2.4372967e-05 2.0939262e-05 2.3739495e-05 9.4285714 + 84300 5.5925414e-06 0 2.5190413e-05 2.2054067e-05 2.5134858e-05 9.4285714 + 84400 5.9495987e-06 0 2.5163487e-05 2.2235018e-05 2.5089027e-05 9.4285714 + 84500 5.7713446e-06 0 2.5203284e-05 2.2008136e-05 2.4683255e-05 9.4285714 + 84600 5.2346414e-06 0 2.5750616e-05 2.2385286e-05 2.5060127e-05 9.4285714 + 84700 5.3677312e-06 0 2.5671418e-05 2.2504517e-05 2.477615e-05 9.4285714 + 84800 5.5545452e-06 0 2.5270776e-05 2.203669e-05 2.4371077e-05 9.4285714 + 84900 5.35857e-06 0 2.4990364e-05 2.1994432e-05 2.4434211e-05 9.4285714 + 85000 5.4081539e-06 0 2.4614554e-05 2.1826659e-05 2.4080584e-05 9.4285714 + 85100 5.6686315e-06 0 2.4255405e-05 2.1348341e-05 2.3692087e-05 9.4285714 + 85200 5.6470622e-06 0 2.4490625e-05 2.1444906e-05 2.3461274e-05 9.4285714 + 85300 5.4542991e-06 0 2.5038089e-05 2.159186e-05 2.3411228e-05 9.4285714 + 85400 5.5974388e-06 0 2.5208624e-05 2.1456353e-05 2.3090313e-05 9.4285714 + 85500 5.9109345e-06 0 2.5019187e-05 2.1326993e-05 2.2631876e-05 9.4285714 + 85600 5.8895141e-06 0 2.4816097e-05 2.1032266e-05 2.2641694e-05 9.4285714 + 85700 5.8470051e-06 0 2.4753057e-05 2.1011299e-05 2.2893303e-05 9.4285714 + 85800 6.060997e-06 0 2.4718385e-05 2.1024683e-05 2.3160395e-05 9.4285714 + 85900 6.1217894e-06 0 2.4939406e-05 2.0910983e-05 2.3606002e-05 9.4285714 + 86000 5.7550467e-06 0 2.5292227e-05 2.1210494e-05 2.3980265e-05 9.4285714 + 86100 5.6513685e-06 0 2.5336254e-05 2.1695151e-05 2.4295958e-05 9.4285714 + 86200 5.7555479e-06 0 2.5214702e-05 2.2162992e-05 2.4153262e-05 9.4285714 + 86300 5.7587322e-06 0 2.5471626e-05 2.2752108e-05 2.4566282e-05 9.4285714 + 86400 5.8389333e-06 0 2.5581374e-05 2.2866696e-05 2.5080456e-05 9.4285714 + 86500 5.9431034e-06 0 2.5603078e-05 2.2611552e-05 2.557061e-05 9.4285714 + 86600 5.9655129e-06 0 2.5809196e-05 2.2505729e-05 2.5920358e-05 9.4285714 + 86700 6.042955e-06 0 2.5516399e-05 2.207345e-05 2.4941272e-05 9.4285714 + 86800 6.2666413e-06 0 2.5017309e-05 2.1757271e-05 2.4325659e-05 9.4285714 + 86900 6.5118003e-06 0 2.4709906e-05 2.1733726e-05 2.4359289e-05 9.4285714 + 87000 6.7509257e-06 0 2.424948e-05 2.1511123e-05 2.4005052e-05 9.4285714 + 87100 6.9118143e-06 0 2.4403465e-05 2.1411555e-05 2.4138929e-05 9.4285714 + 87200 6.9983412e-06 0 2.4855429e-05 2.1301042e-05 2.4635518e-05 9.4285714 + 87300 7.2267392e-06 0 2.4726242e-05 2.1200486e-05 2.4816636e-05 9.4285714 + 87400 7.3928522e-06 0 2.4568177e-05 2.1782095e-05 2.546145e-05 9.4285714 + 87500 7.1675783e-06 0 2.4583963e-05 2.2927936e-05 2.610685e-05 9.4285714 + 87600 6.9310557e-06 0 2.4419972e-05 2.3641933e-05 2.674206e-05 9.4285714 + 87700 6.8020949e-06 0 2.4799319e-05 2.3877016e-05 2.686282e-05 9.4285714 + 87800 6.7871509e-06 0 2.5501599e-05 2.3391832e-05 2.6476337e-05 9.4285714 + 87900 7.1459737e-06 0 2.5746275e-05 2.2468174e-05 2.6106668e-05 9.4285714 + 88000 7.4791665e-06 0 2.6452673e-05 2.2371733e-05 2.6426643e-05 9.4285714 + 88100 7.4418527e-06 0 2.7237517e-05 2.2696988e-05 2.6866222e-05 9.4285714 + 88200 6.8171325e-06 0 2.835739e-05 2.2805248e-05 2.7767937e-05 9.4285714 + 88300 5.9535317e-06 0 3.0022892e-05 2.3162212e-05 2.9121854e-05 9.4285714 + 88400 5.8054385e-06 0 3.0267499e-05 2.4036541e-05 2.9451731e-05 9.4285714 + 88500 5.7381974e-06 0 2.987853e-05 2.4412659e-05 2.9022854e-05 9.4285714 + 88600 5.8193958e-06 0 2.9306631e-05 2.4291387e-05 2.9042278e-05 9.4285714 + 88700 5.7843884e-06 0 2.8474902e-05 2.407517e-05 2.9342631e-05 9.4285714 + 88800 5.36122e-06 0 2.9228687e-05 2.4074387e-05 3.0069005e-05 9.4285714 + 88900 4.9662584e-06 0 2.9640221e-05 2.4381438e-05 3.0842974e-05 9.4285714 + 89000 5.0244565e-06 0 2.9242167e-05 2.3718494e-05 3.0959647e-05 9.4285714 + 89100 5.2140172e-06 0 2.9460854e-05 2.2966219e-05 3.0745899e-05 9.4285714 + 89200 5.4241028e-06 0 2.8931798e-05 2.2787347e-05 3.0505146e-05 9.4285714 + 89300 5.354843e-06 0 2.8226483e-05 2.2430309e-05 3.0543304e-05 9.4285714 + 89400 4.9583346e-06 0 2.8529104e-05 2.2510089e-05 3.0744349e-05 9.4285714 + 89500 4.7804845e-06 0 2.8283425e-05 2.3168387e-05 3.0368794e-05 9.4285714 + 89600 4.5353969e-06 0 2.8369715e-05 2.3890917e-05 2.9944272e-05 9.4285714 + 89700 4.3528727e-06 0 2.916536e-05 2.4717547e-05 2.9897586e-05 9.4285714 + 89800 4.0677397e-06 0 2.9671051e-05 2.5069631e-05 2.9727134e-05 9.4285714 + 89900 3.4743886e-06 0 3.0546148e-05 2.5204424e-05 2.9429413e-05 9.4285714 + 90000 2.9448035e-06 0 3.1386975e-05 2.504163e-05 2.8941476e-05 9.4285714 + 90100 2.8584378e-06 0 3.0989836e-05 2.426512e-05 2.8680422e-05 9.4285714 + 90200 3.0154097e-06 0 3.0109363e-05 2.3659678e-05 2.879077e-05 9.4285714 + 90300 3.0998012e-06 0 2.9214408e-05 2.3299406e-05 2.8821376e-05 9.4285714 + 90400 3.0622205e-06 0 2.866651e-05 2.2666679e-05 2.8865145e-05 9.4285714 + 90500 2.8987354e-06 0 2.8403824e-05 2.1925714e-05 2.8481892e-05 9.4285714 + 90600 2.6710434e-06 0 2.8143313e-05 2.1522559e-05 2.8171438e-05 9.4285714 + 90700 2.4095074e-06 0 2.8048981e-05 2.1523007e-05 2.8016792e-05 9.4285714 + 90800 2.202904e-06 0 2.8166412e-05 2.1813639e-05 2.7412255e-05 9.4285714 + 90900 2.3181295e-06 0 2.8435465e-05 2.2251451e-05 2.6819024e-05 9.4285714 + 91000 2.3141951e-06 0 2.8538853e-05 2.2733208e-05 2.6507917e-05 9.4285714 + 91100 2.0683071e-06 0 2.8191515e-05 2.3157829e-05 2.609377e-05 9.4285714 + 91200 1.8857219e-06 0 2.7771042e-05 2.3580857e-05 2.55034e-05 9.4285714 + 91300 1.8327584e-06 0 2.7428616e-05 2.360497e-05 2.4609829e-05 9.4285714 + 91400 1.804747e-06 0 2.713938e-05 2.3052505e-05 2.3890628e-05 9.4285714 + 91500 1.6349771e-06 0 2.7072497e-05 2.2465059e-05 2.3592759e-05 9.4285714 + 91600 1.5216476e-06 0 2.6887207e-05 2.1845019e-05 2.327018e-05 9.4285714 + 91700 1.6141413e-06 0 2.6727574e-05 2.134873e-05 2.3175757e-05 9.4285714 + 91800 1.6435107e-06 0 2.6837186e-05 2.1372811e-05 2.3272056e-05 9.4285714 + 91900 1.5649292e-06 0 2.6814814e-05 2.149563e-05 2.3262763e-05 9.4285714 + 92000 1.5598003e-06 0 2.6894688e-05 2.1612813e-05 2.3333181e-05 9.4285714 + 92100 1.5645521e-06 0 2.7093666e-05 2.1677323e-05 2.3393885e-05 9.4285714 + 92200 1.5384794e-06 0 2.725352e-05 2.1871439e-05 2.3309607e-05 9.4285714 + 92300 1.5428705e-06 0 2.7534493e-05 2.2028165e-05 2.3281919e-05 9.4285714 + 92400 1.5481835e-06 0 2.7738128e-05 2.1877013e-05 2.3365103e-05 9.4285714 + 92500 1.5193765e-06 0 2.7807402e-05 2.1697756e-05 2.3422801e-05 9.4285714 + 92600 1.4779648e-06 0 2.7822075e-05 2.1595936e-05 2.3653604e-05 9.4285714 + 92700 1.4401385e-06 0 2.7498575e-05 2.1565328e-05 2.3855716e-05 9.4285714 + 92800 1.4263884e-06 0 2.7219859e-05 2.1753979e-05 2.3901241e-05 9.4285714 + 92900 1.4318392e-06 0 2.696367e-05 2.202186e-05 2.4060393e-05 9.4285714 + 93000 1.4336111e-06 0 2.6591513e-05 2.2195157e-05 2.4122065e-05 9.4285714 + 93100 1.4541758e-06 0 2.6692487e-05 2.2344968e-05 2.4065021e-05 9.4285714 + 93200 1.4657669e-06 0 2.7168313e-05 2.2538418e-05 2.4214674e-05 9.4285714 + 93300 1.4040886e-06 0 2.7561907e-05 2.2761637e-05 2.4475223e-05 9.4285714 + 93400 1.2988064e-06 0 2.7861831e-05 2.2852224e-05 2.4956596e-05 9.4285714 + 93500 1.2005872e-06 0 2.7794033e-05 2.2910857e-05 2.5291935e-05 9.4285714 + 93600 1.1148329e-06 0 2.7652398e-05 2.3024188e-05 2.5433821e-05 9.4285714 + 93700 1.0710007e-06 0 2.7712404e-05 2.3143904e-05 2.5669435e-05 9.4285714 + 93800 1.0923979e-06 0 2.7720612e-05 2.3112739e-05 2.5821686e-05 9.4285714 + 93900 1.1070785e-06 0 2.7887865e-05 2.3159397e-05 2.5903855e-05 9.4285714 + 94000 1.0836182e-06 0 2.8174509e-05 2.3354232e-05 2.6074704e-05 9.4285714 + 94100 1.0712532e-06 0 2.8077928e-05 2.3330714e-05 2.6150142e-05 9.4285714 + 94200 1.1089242e-06 0 2.802336e-05 2.3220275e-05 2.6308674e-05 9.4285714 + 94300 1.1709624e-06 0 2.7885676e-05 2.3027073e-05 2.647883e-05 9.4285714 + 94400 1.1698851e-06 0 2.7597204e-05 2.2765961e-05 2.6575165e-05 9.4285714 + 94500 1.1331311e-06 0 2.7664548e-05 2.2696186e-05 2.6782703e-05 9.4285714 + 94600 1.1611176e-06 0 2.7821396e-05 2.2709988e-05 2.6961488e-05 9.4285714 + 94700 1.2014763e-06 0 2.8024363e-05 2.2788622e-05 2.7146644e-05 9.4285714 + 94800 1.1833928e-06 0 2.8490371e-05 2.3037146e-05 2.7316537e-05 9.4285714 + 94900 1.1648449e-06 0 2.8748715e-05 2.3166372e-05 2.7288373e-05 9.4285714 + 95000 1.1252279e-06 0 2.8777487e-05 2.3105996e-05 2.7264426e-05 9.4285714 + 95100 1.0516851e-06 0 2.8696839e-05 2.2985372e-05 2.7310067e-05 9.4285714 + 95200 1.0245214e-06 0 2.8641497e-05 2.2873e-05 2.7310438e-05 9.4285714 + 95300 1.0235812e-06 0 2.8690066e-05 2.3000448e-05 2.7335977e-05 9.4285714 + 95400 9.6956254e-07 0 2.8724738e-05 2.3259027e-05 2.7322308e-05 9.4285714 + 95500 8.9262312e-07 0 2.8843131e-05 2.3531751e-05 2.7254991e-05 9.4285714 + 95600 8.6064987e-07 0 2.8996711e-05 2.3635882e-05 2.7093251e-05 9.4285714 + 95700 8.7096432e-07 0 2.8878604e-05 2.3473478e-05 2.6743784e-05 9.4285714 + 95800 8.5278957e-07 0 2.8703214e-05 2.3266697e-05 2.6409822e-05 9.4285714 + 95900 7.9717781e-07 0 2.8645528e-05 2.3062215e-05 2.6251555e-05 9.4285714 + 96000 7.7875968e-07 0 2.8643986e-05 2.2987641e-05 2.6323848e-05 9.4285714 + 96100 7.8525813e-07 0 2.8773044e-05 2.3055913e-05 2.6556088e-05 9.4285714 + 96200 7.7518366e-07 0 2.8878871e-05 2.3101151e-05 2.6812081e-05 9.4285714 + 96300 7.6015915e-07 0 2.8820245e-05 2.3136672e-05 2.6915584e-05 9.4285714 + 96400 7.4067407e-07 0 2.8661992e-05 2.3169734e-05 2.6801804e-05 9.4285714 + 96500 7.0061605e-07 0 2.8400346e-05 2.3121121e-05 2.6529198e-05 9.4285714 + 96600 6.6164038e-07 0 2.8306211e-05 2.3011655e-05 2.6142152e-05 9.4285714 + 96700 6.5255615e-07 0 2.8340108e-05 2.2886154e-05 2.5768282e-05 9.4285714 + 96800 6.5992528e-07 0 2.8315654e-05 2.2712955e-05 2.5506907e-05 9.4285714 + 96900 6.618124e-07 0 2.8440952e-05 2.2580367e-05 2.5361502e-05 9.4285714 + 97000 6.7139818e-07 0 2.8508432e-05 2.253211e-05 2.5304698e-05 9.4285714 + 97100 6.8703272e-07 0 2.8403291e-05 2.25734e-05 2.5272649e-05 9.4285714 + 97200 6.9368757e-07 0 2.8254045e-05 2.2793415e-05 2.5257036e-05 9.4285714 + 97300 6.9652913e-07 0 2.8016561e-05 2.3040992e-05 2.5228068e-05 9.4285714 + 97400 6.9671901e-07 0 2.7837036e-05 2.330333e-05 2.5157239e-05 9.4285714 + 97500 6.891306e-07 0 2.7789433e-05 2.3471237e-05 2.5141846e-05 9.4285714 + 97600 6.76426e-07 0 2.7838847e-05 2.3472664e-05 2.518892e-05 9.4285714 + 97700 6.5763751e-07 0 2.794167e-05 2.3370888e-05 2.5139127e-05 9.4285714 + 97800 6.4854556e-07 0 2.7951511e-05 2.3224106e-05 2.5036326e-05 9.4285714 + 97900 6.5336861e-07 0 2.7923239e-05 2.3092342e-05 2.4920514e-05 9.4285714 + 98000 6.6394525e-07 0 2.7871431e-05 2.2947013e-05 2.480383e-05 9.4285714 + 98100 6.8885885e-07 0 2.7765273e-05 2.2790639e-05 2.4801777e-05 9.4285714 + 98200 7.2201864e-07 0 2.7755504e-05 2.2661812e-05 2.4861739e-05 9.4285714 + 98300 7.3816538e-07 0 2.7765573e-05 2.258486e-05 2.4844206e-05 9.4285714 + 98400 7.3631403e-07 0 2.7757701e-05 2.2578908e-05 2.4841191e-05 9.4285714 + 98500 7.2568853e-07 0 2.7848802e-05 2.2595958e-05 2.4892777e-05 9.4285714 + 98600 7.0490905e-07 0 2.7912207e-05 2.2591875e-05 2.4898698e-05 9.4285714 + 98700 6.8484202e-07 0 2.8009272e-05 2.2597685e-05 2.4985899e-05 9.4285714 + 98800 6.6994522e-07 0 2.8202402e-05 2.2643734e-05 2.5127513e-05 9.4285714 + 98900 6.2867752e-07 0 2.8292405e-05 2.2674349e-05 2.5309578e-05 9.4285714 + 99000 5.6999626e-07 0 2.8348569e-05 2.2698075e-05 2.5569326e-05 9.4285714 + 99100 5.2675078e-07 0 2.838436e-05 2.2796837e-05 2.5828965e-05 9.4285714 + 99200 4.9993032e-07 0 2.8326221e-05 2.2925652e-05 2.6095918e-05 9.4285714 + 99300 4.8034362e-07 0 2.8358043e-05 2.3048697e-05 2.6357518e-05 9.4285714 + 99400 4.633455e-07 0 2.8395008e-05 2.3187019e-05 2.6590148e-05 9.4285714 + 99500 4.423417e-07 0 2.840813e-05 2.3327273e-05 2.679518e-05 9.4285714 + 99600 4.2336865e-07 0 2.8409328e-05 2.3446846e-05 2.6875881e-05 9.4285714 + 99700 4.0950396e-07 0 2.831088e-05 2.347619e-05 2.6867125e-05 9.4285714 + 99800 3.8946719e-07 0 2.8187415e-05 2.3361958e-05 2.6862163e-05 9.4285714 + 99900 3.5789226e-07 0 2.8087326e-05 2.3222723e-05 2.6889683e-05 9.4285714 + 100000 3.23165e-07 0 2.7995448e-05 2.3145322e-05 2.7024051e-05 9.4285714 +Loop time of 205.426 on 4 procs for 100000 steps with 2520 atoms + +Performance: 2102947.143 tau/day, 486.793 timesteps/s +98.8% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.17838 | 1.2371 | 4.1955 | 153.6 | 0.60 +Bond | 3.018 | 52.249 | 174.87 | 982.2 | 25.43 +Neigh | 3.0057 | 3.0272 | 3.0411 | 0.8 | 1.47 +Comm | 2.8631 | 70.899 | 175.73 | 758.8 | 34.51 +Output | 0.1676 | 1.5052 | 3.0742 | 109.6 | 0.73 +Modify | 1.0679 | 5.7589 | 17.359 | 279.9 | 2.80 +Other | | 70.75 | | | 34.44 + +Nlocal: 630 ave 2513 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Nghost: 39.25 ave 150 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Neighs: 2458 ave 9821 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 9832 +Ave neighs/atom = 3.9015873 +Ave special neighs/atom = 36.31746 +Neighbor list builds = 5178 +Dangerous builds = 314 +Total wall time: 0:03:25 diff --git a/examples/mliap/README b/examples/mliap/README index c16fa218e0..070ce86bfd 100644 --- a/examples/mliap/README +++ b/examples/mliap/README @@ -1,6 +1,6 @@ -This directory contains multiple examples of -machine-learning potentials defined using the -MLIAP package in LAMMPS. The input files +This directory contains multiple examples of +machine-learning potentials defined using the +ML-IAP package in LAMMPS. The input files are described below. in.mliap.snap.Ta06A @@ -21,14 +21,14 @@ Run EME-SNAP, equivalent to examples/snap/in.snap.InP.JCPA2020 in.mliap.snap.compute --------------------- -Generate the A matrix, the gradients (w.r.t. coefficients) -of total potential energy, forces, and stress tensor for +Generate the A matrix, the gradients (w.r.t. coefficients) +of total potential energy, forces, and stress tensor for linear SNAP, equivalent to in.snap.compute in.mliap.quadratic.compute -------------------------- -Generate the A matrix, the gradients (w.r.t. coefficients) -of total potential energy, forces, and stress tensor for +Generate the A matrix, the gradients (w.r.t. coefficients) +of total potential energy, forces, and stress tensor for for quadratic SNAP, equivalent to in.snap.compute.quadratic in.mliap.pytorch.Ta06A @@ -41,8 +41,8 @@ This example can be run in two different ways: 1: Running a LAMMPS executable: in.mliap.pytorch.Ta06A First run ``python convert_mliap_Ta06A.py``. It creates -a PyTorch energy model that replicates the -SNAP Ta06A potential and saves it in the file +a PyTorch energy model that replicates the +SNAP Ta06A potential and saves it in the file "Ta06A.mliap.pytorch.model.pt". You can then run the example as follows @@ -52,7 +52,7 @@ You can then run the example as follows The resultant log.lammps output should be identical to that generated by in.mliap.snap.Ta06A. -If this fails, see the instructions for building the MLIAP package +If this fails, see the instructions for building the ML-IAP package with Python support enabled. Also, confirm that the LAMMPS Python embedded Python interpreter is working by running ../examples/in.python. @@ -62,7 +62,7 @@ working by running ../examples/in.python. Before testing this, ensure that the previous method (running a LAMMPS executable) works. -You can run the example in serial: +You can run the example in serial: `python mliap_pytorch_Ta06A.py` @@ -80,25 +80,25 @@ the script will exit with an error message. in.mliap.pytorch.relu1hidden ---------------------------- This example demonstrates a simple neural network potential -using PyTorch and SNAP descriptors. +using PyTorch and SNAP descriptors. `lmp -in in.mliap.pytorch.relu1hidden -echo both` -It was trained on just the energy component (no forces) of -the data used in the original SNAP Ta06A potential for -tantalum (Thompson, Swiler, Trott, Foiles, Tucker, +It was trained on just the energy component (no forces) of +the data used in the original SNAP Ta06A potential for +tantalum (Thompson, Swiler, Trott, Foiles, Tucker, J Comp Phys, 285, 316 (2015).). Because of the very small amount -of energy training data, it uses just 1 hidden layer with -a ReLU activation function. It is not expected to be -very accurate for forces. +of energy training data, it uses just 1 hidden layer with +a ReLU activation function. It is not expected to be +very accurate for forces. -NOTE: Unlike the previous example, this example uses -a pre-built PyTorch file `Ta06A.mliap.pytorch.model.pt`. +NOTE: Unlike the previous example, this example uses +a pre-built PyTorch file `Ta06A.mliap.pytorch.model.pt`. It is read using `torch.load`, which implicitly uses the Python `pickle` module. -This is known to be insecure. It is possible to construct malicious -pickle data that will execute arbitrary code during unpickling. Never -load data that could have come from an untrusted source, or that +This is known to be insecure. It is possible to construct malicious +pickle data that will execute arbitrary code during unpickling. Never +load data that could have come from an untrusted source, or that could have been tampered with. Only load data you trust. in.mliap.nn.Ta06A @@ -109,4 +109,54 @@ in.mliap.nn.cu ------------------------- Run a neural network potential for Cu, a combination of SNAP descriptors and the "nn" model style +in.mliap.unified.lj.Ar +----------------------- +This reproduces the output of examples/melt/in.melt, +but using the ``unified`` keyword and +the Python coupling to PyTorch. +This example can be run in two different ways: + +1: Running a LAMMPS executable: in.mliap.unified.lj.Ar + +You can run the example as follows + +`lmp -in in.mliap.unified.lj.Ar -echo both` + +The resultant thermo output should be identical to that generated +by in.melt. + +The input first runs some python code that creates an ML-IAP unified model +that replicates the ``lj/cut`` pair style with parameters as defined in +examples/melt/in/melt and saves it in the file "mliap_unified_lj_Ar.pkl". + +If this fails, see the instructions for building the ML-IAP package +with Python support enabled. Also, confirm that the LAMMPS Python +embedded Python interpreter is working by running ../examples/in.python +and that the LAMMPS python module is installed and working. + +2: Running a Python script: mliap_unified_lj_Ar.py + +Before testing this, ensure that the previous method +(running a LAMMPS executable) works. + +You can run the example in serial: + +`python mliap_unified_lj_Ar.py` + +or in parallel: + +`mpirun -np 4 python mliap_unified_lj_Ar.py` + +The resultant log.lammps output should be identical to that generated +by in.melt and in.mliap.unified.lj.Ar. + +in.mliap.so3.Ni_Mo +------------------ + +Example of linear model with SO3 descriptors for Ni/Mo + +in.mliap.so3.nn.Si +------------------ + +Example of NN model with SO3 descriptors for Si diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar new file mode 100644 index 0000000000..190ea1288f --- /dev/null +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -0,0 +1,53 @@ + +# create pickle of unified model + +python create_pickle here """ +import lammps +import lammps.mliap + +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ + +def create_pickle(): + unified = MLIAPUnifiedLJ(["Ar"]) + unified.pickle('mliap_unified_lj_Ar.pkl') +""" +python create_pickle invoke + +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass 1 1.0 + +velocity all create 3.0 87287 loop geom + +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 +pair_coeff * * Ar + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +#dump id all atom 50 dump.melt + +#dump 2 all image 25 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 1 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +#dump 4 all custom 1 forces.xyz fx fy fz + +thermo 50 +run 250 + +# clean up +shell rm -f mliap_unified_lj_Ar.pkl diff --git a/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 new file mode 100644 index 0000000000..1059b65538 --- /dev/null +++ b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 @@ -0,0 +1,107 @@ +LAMMPS (15 Sep 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task + +# create pickle of unified model + +python create_pickle here """ +import lammps +import lammps.mliap +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ +def create_pickle(): + unified = MLIAPUnifiedLJ(["Ar"]) + unified.pickle('mliap_unified_lj_Ar.pkl') +""" +python create_pickle invoke + +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 1 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 1 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +mass 1 1.0 + +velocity all create 3.0 87287 loop geom + +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 +pair_coeff * * Ar + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +#dump id all atom 50 dump.melt + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 1 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +#dump 4 all custom 1 forces.xyz fx fy fz + +thermo 50 +run 250 +Neighbor list info ... + update: every = 20 steps, delay = 0 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair mliap, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 12.7 | 12.7 | 12.7 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733681 0 -2.2744931 -3.7033504 + 50 1.6842865 -4.8082494 0 -2.2824513 5.5666131 + 100 1.6712577 -4.7875609 0 -2.281301 5.6613913 + 150 1.6444751 -4.7471034 0 -2.2810074 5.8614211 + 200 1.6471542 -4.7509053 0 -2.2807916 5.8805431 + 250 1.6645597 -4.7774327 0 -2.2812174 5.7526089 +Loop time of 3.48563 on 1 procs for 250 steps with 4000 atoms + +Performance: 30984.374 tau/day, 71.723 timesteps/s +79.5% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.3348 | 3.3348 | 3.3348 | 0.0 | 95.67 +Neigh | 0.13055 | 0.13055 | 0.13055 | 0.0 | 3.75 +Comm | 0.0089845 | 0.0089845 | 0.0089845 | 0.0 | 0.26 +Output | 0.00018194 | 0.00018194 | 0.00018194 | 0.0 | 0.01 +Modify | 0.0090026 | 0.0090026 | 0.0090026 | 0.0 | 0.26 +Other | | 0.002151 | | | 0.06 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5506 ave 5506 max 5506 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 303576 ave 303576 max 303576 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 303576 +Ave neighs/atom = 75.894 +Neighbor list builds = 12 +Dangerous builds not checked + +# clean up +shell rm -f mliap_unified_lj_Ar.pkl +Total wall time: 0:00:03 diff --git a/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 new file mode 100644 index 0000000000..236e415ae6 --- /dev/null +++ b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 @@ -0,0 +1,107 @@ +LAMMPS (15 Sep 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task + +# create pickle of unified model + +python create_pickle here """ +import lammps +import lammps.mliap +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ +def create_pickle(): + unified = MLIAPUnifiedLJ(["Ar"]) + unified.pickle('mliap_unified_lj_Ar.pkl') +""" +python create_pickle invoke + +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 1 box +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 1 by 2 by 2 MPI processor grid +create_atoms 1 box +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +mass 1 1.0 + +velocity all create 3.0 87287 loop geom + +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 +pair_coeff * * Ar + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +#dump id all atom 50 dump.melt + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 1 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +#dump 4 all custom 1 forces.xyz fx fy fz + +thermo 50 +run 250 +Neighbor list info ... + update: every = 20 steps, delay = 0 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair mliap, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.774 | 5.774 | 5.774 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733681 0 -2.2744931 -3.7033504 + 50 1.6842865 -4.8082494 0 -2.2824513 5.5666131 + 100 1.6712577 -4.7875609 0 -2.281301 5.6613913 + 150 1.6444751 -4.7471034 0 -2.2810074 5.8614211 + 200 1.6471542 -4.7509053 0 -2.2807916 5.8805431 + 250 1.6645597 -4.7774327 0 -2.2812174 5.7526089 +Loop time of 1.18059 on 4 procs for 250 steps with 4000 atoms + +Performance: 91479.359 tau/day, 211.758 timesteps/s +78.3% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.0795 | 1.1007 | 1.1197 | 1.7 | 93.23 +Neigh | 0.035618 | 0.03627 | 0.037413 | 0.4 | 3.07 +Comm | 0.019611 | 0.038646 | 0.060389 | 9.4 | 3.27 +Output | 0.00013034 | 0.0001421 | 0.00017083 | 0.0 | 0.01 +Modify | 0.0037233 | 0.0037641 | 0.0038121 | 0.1 | 0.32 +Other | | 0.001086 | | | 0.09 + +Nlocal: 1000 ave 1008 max 987 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Nghost: 2711.25 ave 2728 max 2693 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 75894 ave 77414 max 74214 min +Histogram: 1 0 0 1 0 0 0 1 0 1 + +Total # of neighbors = 303576 +Ave neighs/atom = 75.894 +Neighbor list builds = 12 +Dangerous builds not checked + +# clean up +shell rm -f mliap_unified_lj_Ar.pkl +Total wall time: 0:00:01 diff --git a/examples/mliap/mliap_numpy_Ta06A.py b/examples/mliap/mliap_numpy_Ta06A.py new file mode 100644 index 0000000000..25c928cd89 --- /dev/null +++ b/examples/mliap/mliap_numpy_Ta06A.py @@ -0,0 +1,101 @@ +before_loading =\ +"""# Demonstrate MLIAP/PyTorch interface to linear SNAP potential + +# Initialize simulation + +variable nsteps index 100 +variable nrep equal 4 +variable a equal 3.316 +units metal + +# generate the box and atom positions using a BCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice bcc $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box + +mass 1 180.88 + +# choose potential + +# DATE: 2014-09-05 UNITS: metal CONTRIBUTOR: Aidan Thompson athomps@sandia.gov CITATION: Thompson, Swiler, Trott, Foiles and Tucker, arxiv.org, 1409.3880 (2014) + +# Definition of SNAP potential Ta_Cand06A +# Assumes 1 LAMMPS atom type + +variable zblcutinner equal 4 +variable zblcutouter equal 4.8 +variable zblz equal 73 + +# Specify hybrid with SNAP, ZBL + +pair_style hybrid/overlay & +zbl ${zblcutinner} ${zblcutouter} & +mliap model mliappy LATER & +descriptor sna Ta06A.mliap.descriptor +pair_coeff 1 1 zbl ${zblz} ${zblz} +pair_coeff * * mliap Ta +""" +after_loading =\ +""" + +# Setup output + +compute eatom all pe/atom +compute energy all reduce sum c_eatom + +compute satom all stress/atom NULL +compute str all reduce sum c_satom[1] c_satom[2] c_satom[3] +variable press equal (c_str[1]+c_str[2]+c_str[3])/(3*vol) + +thermo_style custom step temp epair c_energy etotal press v_press +thermo 10 +thermo_modify norm yes + +# Set up NVE run + +timestep 0.5e-3 +neighbor 1.0 bin +neigh_modify once no every 1 delay 0 check yes + +# Run MD + +velocity all create 300.0 4928459 loop geom +fix 1 all nve +run ${nsteps} +""" + +import numpy as np + +class LinearModel(): + def __init__(self,file): + coeffs = np.genfromtxt(file,skip_header=6) + self.bias = coeffs[0] + self.weights = coeffs[1:] + self.n_params = len(coeffs) + self.n_descriptors = len(self.weights) + self.n_elements = 1 + def __call__(self,elems,bispectrum,beta,energy): + energy[:] = bispectrum @ self.weights + self.bias + beta[:] = self.weights + + +mymodel = LinearModel("Ta06A.mliap.model") + +import lammps + +lmp = lammps.lammps(cmdargs=['-echo','both']) + +import lammps.mliap +lammps.mliap.activate_mliappy(lmp) +lmp.commands_string(before_loading) +lammps.mliap.load_model(mymodel) +lmp.commands_string(after_loading) + diff --git a/examples/mliap/mliap_unified_lj_Ar.py b/examples/mliap/mliap_unified_lj_Ar.py new file mode 100644 index 0000000000..2b404bd98e --- /dev/null +++ b/examples/mliap/mliap_unified_lj_Ar.py @@ -0,0 +1,65 @@ +# Demonstrate how to load a unified model from python. +# This is essentially the same as in.mliap.unified.lj.Ar +# except that python is the driving program, and lammps +# is in library mode. + +before_loading =\ +"""# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass 1 1.0 + +velocity all create 3.0 87287 loop geom +""" +after_loading =\ +""" + +pair_style mliap unified EXISTS +pair_coeff * * Ar + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +""" + +import lammps + +lmp = lammps.lammps(cmdargs=['-echo','both']) + +# Before defining the pair style, you must do the following: +import lammps.mliap +lammps.mliap.activate_mliappy(lmp) +# Otherwise, when running lammps in library mode, +# you will get an error + +# Setup the simulation to just before declaring +# the mliap unified pair style +lmp.commands_string(before_loading) + +# Define the model however you like. In this example +# we simply import the unified L-J example from mliap +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ +unified = MLIAPUnifiedLJ(["Ar"]) + +# You can also load the model from a pickle file. +# import pickle +# with open('mliap_unified_lj_Ar.pkl', 'rb') as pfile: +# unified = pickle.load(pfile) + +# Connect the L-J model to the mliap unified pair style. +lammps.mliap.load_unified(unified) + + +# Run the simulation with the mliap unified pair style +# Use pre-loaded model by specifying model filename as "EXISTS" +lmp.commands_string(after_loading) diff --git a/examples/plugins/angle_zero2.cpp b/examples/plugins/angle_zero2.cpp index bc2f6869dc..2db7645245 100644 --- a/examples/plugins/angle_zero2.cpp +++ b/examples/plugins/angle_zero2.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/angle_zero2.h b/examples/plugins/angle_zero2.h index e9a5df3ae4..1bdda7472d 100644 --- a/examples/plugins/angle_zero2.h +++ b/examples/plugins/angle_zero2.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/bond_zero2.cpp b/examples/plugins/bond_zero2.cpp index 768f176c63..7ca904b31d 100644 --- a/examples/plugins/bond_zero2.cpp +++ b/examples/plugins/bond_zero2.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/bond_zero2.h b/examples/plugins/bond_zero2.h index e01ec8c1fc..52b919567a 100644 --- a/examples/plugins/bond_zero2.h +++ b/examples/plugins/bond_zero2.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/dihedral_zero2.cpp b/examples/plugins/dihedral_zero2.cpp index a597d7a48e..df4e873993 100644 --- a/examples/plugins/dihedral_zero2.cpp +++ b/examples/plugins/dihedral_zero2.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/dihedral_zero2.h b/examples/plugins/dihedral_zero2.h index ca0e49b21a..2e28d6e943 100644 --- a/examples/plugins/dihedral_zero2.h +++ b/examples/plugins/dihedral_zero2.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/fix_nve2.cpp b/examples/plugins/fix_nve2.cpp index 498cb40d21..321dd802b6 100644 --- a/examples/plugins/fix_nve2.cpp +++ b/examples/plugins/fix_nve2.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/fix_nve2.h b/examples/plugins/fix_nve2.h index 3be0131d28..83c334c658 100644 --- a/examples/plugins/fix_nve2.h +++ b/examples/plugins/fix_nve2.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/improper_zero2.cpp b/examples/plugins/improper_zero2.cpp index 9b0335df8b..c2b9203832 100644 --- a/examples/plugins/improper_zero2.cpp +++ b/examples/plugins/improper_zero2.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/improper_zero2.h b/examples/plugins/improper_zero2.h index f561a4ae19..8ce2f2d001 100644 --- a/examples/plugins/improper_zero2.h +++ b/examples/plugins/improper_zero2.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/pair_morse2.cpp b/examples/plugins/pair_morse2.cpp index 738fd53e87..f09be36585 100644 --- a/examples/plugins/pair_morse2.cpp +++ b/examples/plugins/pair_morse2.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/pair_morse2.h b/examples/plugins/pair_morse2.h index c796cd1164..149a518908 100644 --- a/examples/plugins/pair_morse2.h +++ b/examples/plugins/pair_morse2.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/pair_morse2_omp.cpp b/examples/plugins/pair_morse2_omp.cpp index 9c81bad970..71313bd5f3 100644 --- a/examples/plugins/pair_morse2_omp.cpp +++ b/examples/plugins/pair_morse2_omp.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org This software is distributed under the GNU General Public License. diff --git a/examples/plugins/pair_morse2_omp.h b/examples/plugins/pair_morse2_omp.h index ec8f28e074..79f729efde 100644 --- a/examples/plugins/pair_morse2_omp.h +++ b/examples/plugins/pair_morse2_omp.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/pair_zero2.cpp b/examples/plugins/pair_zero2.cpp index c5197a67a6..ed264aa00b 100644 --- a/examples/plugins/pair_zero2.cpp +++ b/examples/plugins/pair_zero2.cpp @@ -1,7 +1,7 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/examples/plugins/pair_zero2.h b/examples/plugins/pair_zero2.h index 8c8ed6f59e..6be0c5b0f1 100644 --- a/examples/plugins/pair_zero2.h +++ b/examples/plugins/pair_zero2.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/ Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov + LAMMPS development team: developers@lammps.org Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains diff --git a/fortran/README b/fortran/README index 653b6a966e..6a19cd7dc2 100644 --- a/fortran/README +++ b/fortran/README @@ -1,11 +1,11 @@ -This directory contains Fortran code which interface LAMMPS as a library -and allows the LAMMPS library interface to be invoked from Fortran codes. -It requires a Fortran compiler that supports the Fortran 2003 standard. +This directory contains Fortran code that acts as an interface to LAMMPS as a +library and allows the LAMMPS library interface to be invoked from Fortran +code. It requires a Fortran compiler that supports the Fortran 2003 standard. This interface is based on and supersedes the previous Fortran interfaces -in the examples/COUPLE/fortran* folders. But is fully supported by the +in the examples/COUPLE/fortran* folders, but it is fully supported by the LAMMPS developers and included in the documentation and unit testing. Details on this Fortran interface and how to build programs using it -are in the manual in the doc/html/pg_fortran.html file. +are in the manual in the doc/html/Fortran.html file. diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 144fd15652..3ab7a26d25 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -1,7 +1,7 @@ ! ------------------------------------------------------------------------- ! LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator ! https://www.lammps.org/ Sandia National Laboratories -! Steve Plimpton, sjplimp@sandia.gov +! LAMMPS Development team: developers@lammps.org ! ! Copyright (2003) Sandia Corporation. Under the terms of Contract ! DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains @@ -19,117 +19,757 @@ ! Karl D. Hammond ! University of Missouri, 2012-2020 ! -! The Fortran module tries to follow the API of the C-library interface -! closely, but like the Python wrapper it employs an object oriented -! approach. To accommodate the object oriented approach, all exported -! subroutine and functions have to be implemented in Fortran to then -! call the interfaced C style functions with adapted calling conventions -! as needed. The C-library interfaced functions retain their names -! starting with "lammps_" while the Fortran versions start with "lmp_". +! Contributing authors: +! - Axel Kohlmeyer , Temple University, 2020-2022 +! - Karl D. Hammond , University of Missouri, 2022 +! +! The Fortran module tries to follow the API of the C library interface +! closely, but like the Python wrapper, it employs an object-oriented +! approach. To accommodate the object-oriented approach, all exported +! subroutines and functions have to be implemented in Fortran and +! call the interfaced C-style functions with adapted calling conventions +! as needed. The C library interface functions retain their names +! starting with "lammps_", while the Fortran versions start with "lmp_". ! MODULE LIBLAMMPS - USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, c_loc, & - c_int, c_char, c_null_char, c_double, c_size_t, c_f_pointer + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, C_ASSOCIATED, & + C_LOC, c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, & + C_F_POINTER IMPLICIT NONE PRIVATE - PUBLIC :: lammps + PUBLIC :: lammps, ASSIGNMENT(=) + + ! Data type constants for extracting data from global, atom, compute, and fix + ! + ! Must be kept in sync with the equivalent declarations in + ! src/library.h, python/lammps/constants.py, tools/swig/lammps.i, + ! and examples/COUPLE/plugin/liblammpsplugin.h + ! + ! These are NOT part of the API (the part the user sees) + INTEGER(c_int), PARAMETER :: & + LAMMPS_INT = 0, & ! 32-bit integer (or array) + LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array + LAMMPS_DOUBLE = 2, & ! 64-bit double (or array) + LAMMPS_DOUBLE_2D = 3, & ! two-dimensional 64-bit double array + LAMMPS_INT64 = 4, & ! 64-bit integer (or array) + LAMMPS_INT64_2D = 5, & ! two-dimensional 64-bit integer array + LAMMPS_STRING = 6, & ! C-String + LMP_STYLE_GLOBAL = 0, & ! request global compute/fix/etc. data + LMP_STYLE_ATOM = 1, & ! request per-atom compute/fix/etc. data + LMP_STYLE_LOCAL = 2, & ! request local compute/fix/etc. data + LMP_TYPE_SCALAR = 0, & ! request scalar + LMP_TYPE_VECTOR = 1, & ! request vector + LMP_TYPE_ARRAY = 2, & ! request array + LMP_SIZE_VECTOR = 3, & ! request size of vector + LMP_SIZE_ROWS = 4, & ! request rows (actually columns) + LMP_SIZE_COLS = 5, & ! request colums (actually rows) + LMP_ERROR_WARNING = 0, & ! call Error::warning() + LMP_ERROR_ONE = 1, & ! call Error::one() (from this MPI rank) + LMP_ERROR_ALL = 2, & ! call Error::all() (from all MPI ranks) + LMP_ERROR_WORLD = 4, & ! error on comm->world + LMP_ERROR_UNIVERSE = 8, & ! error on comm->universe + LMP_VAR_EQUAL = 0, & ! equal-style variables (and compatible) + LMP_VAR_ATOM = 1, & ! atom-style variables + LMP_VAR_VECTOR = 2, & ! vector variables + LMP_VAR_STRING = 3 ! string variables (everything else) + + ! "Constants" to use with extract_compute and friends + TYPE lammps_style + INTEGER(c_int) :: global, atom, local + END TYPE lammps_style + + TYPE lammps_type + INTEGER(c_int) :: scalar, vector, array + END TYPE lammps_type TYPE lammps - TYPE(c_ptr) :: handle - CONTAINS - PROCEDURE :: close => lmp_close - PROCEDURE :: file => lmp_file - PROCEDURE :: command => lmp_command - PROCEDURE :: commands_list => lmp_commands_list - PROCEDURE :: commands_string => lmp_commands_string - PROCEDURE :: version => lmp_version - PROCEDURE :: get_natoms => lmp_get_natoms + TYPE(c_ptr) :: handle = c_null_ptr + TYPE(lammps_style) :: style + TYPE(lammps_type) :: type + CONTAINS + PROCEDURE :: close => lmp_close + PROCEDURE :: error => lmp_error + PROCEDURE :: file => lmp_file + PROCEDURE :: command => lmp_command + PROCEDURE :: commands_list => lmp_commands_list + PROCEDURE :: commands_string => lmp_commands_string + PROCEDURE :: get_natoms => lmp_get_natoms + PROCEDURE :: get_thermo => lmp_get_thermo + PROCEDURE :: extract_box => lmp_extract_box + PROCEDURE :: reset_box => lmp_reset_box + PROCEDURE :: memory_usage => lmp_memory_usage + PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm + PROCEDURE :: extract_setting => lmp_extract_setting + PROCEDURE :: extract_global => lmp_extract_global + PROCEDURE :: extract_atom => lmp_extract_atom + PROCEDURE :: extract_compute => lmp_extract_compute + PROCEDURE :: extract_fix => lmp_extract_fix + PROCEDURE :: extract_variable => lmp_extract_variable + PROCEDURE :: set_variable => lmp_set_variable + PROCEDURE, PRIVATE :: lmp_gather_atoms_int + PROCEDURE, PRIVATE :: lmp_gather_atoms_double + GENERIC :: gather_atoms => lmp_gather_atoms_int, & + lmp_gather_atoms_double + PROCEDURE, PRIVATE :: lmp_gather_atoms_concat_int + PROCEDURE, PRIVATE :: lmp_gather_atoms_concat_double + GENERIC :: gather_atoms_concat => lmp_gather_atoms_concat_int, & + lmp_gather_atoms_concat_double + PROCEDURE, PRIVATE :: lmp_gather_atoms_subset_int + PROCEDURE, PRIVATE :: lmp_gather_atoms_subset_double + GENERIC :: gather_atoms_subset => lmp_gather_atoms_subset_int, & + lmp_gather_atoms_subset_double + PROCEDURE, PRIVATE :: lmp_scatter_atoms_int + PROCEDURE, PRIVATE :: lmp_scatter_atoms_double + GENERIC :: scatter_atoms => lmp_scatter_atoms_int, & + lmp_scatter_atoms_double + PROCEDURE, PRIVATE :: lmp_scatter_atoms_subset_int + PROCEDURE, PRIVATE :: lmp_scatter_atoms_subset_double + GENERIC :: scatter_atoms_subset => lmp_scatter_atoms_subset_int, & + lmp_scatter_atoms_subset_double + PROCEDURE, PRIVATE :: lmp_gather_bonds_small + PROCEDURE, PRIVATE :: lmp_gather_bonds_big + GENERIC :: gather_bonds => lmp_gather_bonds_small, & + lmp_gather_bonds_big +! + PROCEDURE, PRIVATE :: lmp_create_atoms_int + PROCEDURE, PRIVATE :: lmp_create_atoms_bigbig + GENERIC :: create_atoms => lmp_create_atoms_int, & + lmp_create_atoms_bigbig + PROCEDURE :: find_pair_neighlist => lmp_find_pair_neighlist + PROCEDURE :: find_fix_neighlist => lmp_find_fix_neighlist + PROCEDURE :: find_compute_neighlist => lmp_find_compute_neighlist + PROCEDURE :: neighlist_num_elements => lmp_neighlist_num_elements + PROCEDURE :: neighlist_element_neighbors => lmp_neighlist_element_neighbors + PROCEDURE :: version => lmp_version + PROCEDURE, NOPASS :: get_os_info => lmp_get_os_info + PROCEDURE, NOPASS :: config_has_mpi_support => lmp_config_has_mpi_support + PROCEDURE, NOPASS :: config_has_gzip_support => lmp_config_has_gzip_support + PROCEDURE, NOPASS :: config_has_png_support => lmp_config_has_png_support + PROCEDURE, NOPASS :: config_has_jpeg_support => lmp_config_has_jpeg_support + PROCEDURE, NOPASS :: config_has_ffmpeg_support & + => lmp_config_has_ffmpeg_support + PROCEDURE, NOPASS :: config_has_exceptions => lmp_config_has_exceptions + PROCEDURE, NOPASS :: config_has_package => lmp_config_has_package + PROCEDURE, NOPASS :: config_package_count => lammps_config_package_count + PROCEDURE :: config_package_name => lmp_config_package_name + PROCEDURE :: installed_packages => lmp_installed_packages + PROCEDURE, NOPASS :: config_accelerator => lmp_config_accelerator + PROCEDURE, NOPASS :: has_gpu_device => lmp_has_gpu_device + PROCEDURE, NOPASS :: get_gpu_device_info => lmp_get_gpu_device_info + PROCEDURE :: has_style => lmp_has_style + PROCEDURE :: style_count => lmp_style_count + PROCEDURE :: style_name => lmp_style_name + PROCEDURE :: has_id => lmp_has_id + PROCEDURE :: id_count => lmp_id_count + PROCEDURE :: id_name => lmp_id_name + PROCEDURE, NOPASS :: plugin_count => lammps_plugin_count + PROCEDURE :: plugin_name => lmp_plugin_name + PROCEDURE :: encode_image_flags => lmp_encode_image_flags + PROCEDURE, PRIVATE :: lmp_decode_image_flags + PROCEDURE, PRIVATE :: lmp_decode_image_flags_bigbig + GENERIC :: decode_image_flags => lmp_decode_image_flags, & + lmp_decode_image_flags_bigbig +! + PROCEDURE :: flush_buffers => lmp_flush_buffers + PROCEDURE :: is_running => lmp_is_running + PROCEDURE :: force_timeout => lmp_force_timeout + PROCEDURE :: has_error => lmp_has_error + PROCEDURE :: get_last_error_message => lmp_get_last_error_message END TYPE lammps INTERFACE lammps - MODULE PROCEDURE lmp_open + MODULE PROCEDURE lmp_open END INTERFACE lammps + ! Constants to use in working with lammps_data + ENUM, BIND(C) + ENUMERATOR :: DATA_INT, DATA_INT_1D, DATA_INT_2D + ENUMERATOR :: DATA_INT64, DATA_INT64_1D, DATA_INT64_2D + ENUMERATOR :: DATA_DOUBLE, DATA_DOUBLE_1D, DATA_DOUBLE_2D + ENUMERATOR :: DATA_STRING + END ENUM + + ! Base class for receiving LAMMPS data (to reduce code duplication) + TYPE lammps_data_baseclass + INTEGER(c_int) :: datatype = -1_c_int + ! in case we need to call the Error class in an assignment + CLASS(lammps), POINTER, PRIVATE :: lammps_instance => NULL() + END TYPE lammps_data_baseclass + + ! Derived type for receiving LAMMPS data (in lieu of the ability to type cast + ! pointers). Used for extract_compute, extract_atom + TYPE, EXTENDS(lammps_data_baseclass) :: lammps_data + INTEGER(c_int), POINTER :: i32 => NULL() + INTEGER(c_int), DIMENSION(:), POINTER :: i32_vec => NULL() + INTEGER(c_int64_t), POINTER :: i64 => NULL() + INTEGER(c_int64_t), DIMENSION(:), POINTER :: i64_vec => NULL() + REAL(c_double), POINTER :: r64 => NULL() + REAL(c_double), DIMENSION(:), POINTER :: r64_vec => NULL() + REAL(c_double), DIMENSION(:,:), POINTER :: r64_mat => NULL() + CHARACTER(LEN=:), ALLOCATABLE :: str + END TYPE lammps_data + + ! Derived type for holding LAMMPS fix data + ! Done this way because fix global data are not pointers, but computed + ! on-the-fly, whereas per-atom and local data are pointers to the actual + ! array. Doing it this way saves the user from having to explicitly + ! deallocate all of the pointers. + TYPE, EXTENDS(lammps_data_baseclass) :: lammps_fix_data + REAL(c_double) :: r64 + REAL(c_double), DIMENSION(:), POINTER :: r64_vec => NULL() + REAL(c_double), DIMENSION(:,:), POINTER :: r64_mat => NULL() + END TYPE lammps_fix_data + + ! Derived type for holding LAMMPS variable data + ! Done this way because extract_variable calculates variable values, it does + ! not return pointers to LAMMPS data. + TYPE, EXTENDS(lammps_data_baseclass) :: lammps_variable_data + REAL(c_double) :: r64 + REAL(c_double), DIMENSION(:), ALLOCATABLE :: r64_vec + CHARACTER(LEN=:), ALLOCATABLE :: str + END TYPE lammps_variable_data + + TYPE, EXTENDS(lammps_data_baseclass) :: lammps_image_data + INTEGER(c_int) :: i32 + INTEGER(c_int64_t) :: i64 + END TYPE lammps_image_data + + ! This overloads the assignment operator (=) so that assignments of the + ! form + ! nlocal = extract_global('nlocal') + ! which are of the form "pointer to double = type(lammps_data)" result in + ! re-associating the pointer on the left with the appropriate piece of + ! LAMMPS data (after checking type-kind-rank compatibility) + INTERFACE ASSIGNMENT(=) + MODULE PROCEDURE assign_int_to_lammps_data, assign_int64_to_lammps_data, & + assign_intvec_to_lammps_data, assign_int64vec_to_lammps_data, & + assign_double_to_lammps_data, assign_doublevec_to_lammps_data, & + assign_doublemat_to_lammps_data, & + assign_string_to_lammps_data + ! We handle fix data (slightly) differently + MODULE PROCEDURE assign_double_to_lammps_fix_data, & + assign_doublevec_to_lammps_fix_data, & + assign_doublemat_to_lammps_fix_data + ! Variables, too + MODULE PROCEDURE assign_double_to_lammps_variable_data, & + assign_doublevec_to_lammps_variable_data, & + assign_string_to_lammps_variable_data + ! Image data, too + MODULE PROCEDURE assign_int_to_lammps_image_data, & + assign_int64_to_lammps_image_data + END INTERFACE + ! interface definitions for calling functions in library.cpp INTERFACE - FUNCTION lammps_open(argc, argv, comm) BIND(C, name='lammps_open_fortran') - IMPORT :: c_ptr, c_int - INTEGER(c_int), VALUE, INTENT(in) :: argc, comm - TYPE(c_ptr), DIMENSION(*), INTENT(in) :: argv - TYPE(c_ptr) :: lammps_open - END FUNCTION lammps_open + FUNCTION lammps_open(argc, argv, comm) BIND(C,name='lammps_open_fortran') + IMPORT :: c_ptr, c_int + IMPLICIT NONE + INTEGER(c_int), VALUE, INTENT(IN) :: argc, comm + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv + TYPE(c_ptr) :: lammps_open + END FUNCTION lammps_open - FUNCTION lammps_open_no_mpi(argc, argv, handle) BIND(C, name='lammps_open_no_mpi') - IMPORT :: c_ptr, c_int - INTEGER(c_int), VALUE, INTENT(in) :: argc - TYPE(c_ptr), DIMENSION(*), INTENT(in) :: argv - TYPE(c_ptr), VALUE, INTENT(in) :: handle - TYPE(c_ptr) :: lammps_open_no_mpi - END FUNCTION lammps_open_no_mpi + FUNCTION lammps_open_no_mpi(argc, argv, handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + INTEGER(c_int), VALUE, INTENT(IN) :: argc + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv + TYPE(c_ptr), VALUE, INTENT(IN) :: handle + TYPE(c_ptr) :: lammps_open_no_mpi + END FUNCTION lammps_open_no_mpi - SUBROUTINE lammps_close(handle) BIND(C, name='lammps_close') - IMPORT :: c_ptr - TYPE(c_ptr), VALUE :: handle - END SUBROUTINE lammps_close + SUBROUTINE lammps_close(handle) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + END SUBROUTINE lammps_close - SUBROUTINE lammps_mpi_init() BIND(C, name='lammps_mpi_init') - END SUBROUTINE lammps_mpi_init + SUBROUTINE lammps_mpi_init() BIND(C) + END SUBROUTINE lammps_mpi_init - SUBROUTINE lammps_mpi_finalize() BIND(C, name='lammps_mpi_finalize') - END SUBROUTINE lammps_mpi_finalize + SUBROUTINE lammps_mpi_finalize() BIND(C) + END SUBROUTINE lammps_mpi_finalize - SUBROUTINE lammps_kokkos_finalize() BIND(C, name='lammps_kokkos_finalize') - END SUBROUTINE lammps_kokkos_finalize + SUBROUTINE lammps_kokkos_finalize() BIND(C) + END SUBROUTINE lammps_kokkos_finalize - SUBROUTINE lammps_file(handle, filename) BIND(C, name='lammps_file') - IMPORT :: c_ptr - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: filename - END SUBROUTINE lammps_file + SUBROUTINE lammps_error(handle, error_type, error_text) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int), VALUE :: error_type + TYPE(c_ptr), VALUE :: error_text + END SUBROUTINE lammps_error - SUBROUTINE lammps_command(handle, cmd) BIND(C, name='lammps_command') - IMPORT :: c_ptr - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: cmd - END SUBROUTINE lammps_command + SUBROUTINE lammps_file(handle, filename) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + TYPE(c_ptr), VALUE :: filename + END SUBROUTINE lammps_file - SUBROUTINE lammps_commands_list(handle, ncmd, cmds) BIND(C, name='lammps_commands_list') - IMPORT :: c_ptr, c_int - TYPE(c_ptr), VALUE :: handle - INTEGER(c_int), VALUE, INTENT(in) :: ncmd - TYPE(c_ptr), DIMENSION(*), INTENT(in) :: cmds - END SUBROUTINE lammps_commands_list + SUBROUTINE lammps_command(handle, cmd) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle + TYPE(c_ptr), INTENT(IN), VALUE :: cmd + END SUBROUTINE lammps_command - SUBROUTINE lammps_commands_string(handle, str) BIND(C, name='lammps_commands_string') - IMPORT :: c_ptr - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: str - END SUBROUTINE lammps_commands_string + SUBROUTINE lammps_commands_list(handle, ncmd, cmds) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle + INTEGER(c_int), INTENT(IN), VALUE :: ncmd + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: cmds + END SUBROUTINE lammps_commands_list - FUNCTION lammps_malloc(size) BIND(C, name='malloc') - IMPORT :: c_ptr, c_size_t - INTEGER(c_size_t), value :: size - TYPE(c_ptr) :: lammps_malloc - END FUNCTION lammps_malloc + SUBROUTINE lammps_commands_string(handle, str) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle + TYPE(c_ptr), INTENT(IN), VALUE :: str + END SUBROUTINE lammps_commands_string - SUBROUTINE lammps_free(ptr) BIND(C, name='lammps_free') - IMPORT :: c_ptr - TYPE(c_ptr), VALUE :: ptr - END SUBROUTINE lammps_free + FUNCTION lammps_get_natoms(handle) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle + REAL(c_double) :: lammps_get_natoms + END FUNCTION lammps_get_natoms - FUNCTION lammps_version(handle) BIND(C, name='lammps_version') - IMPORT :: c_ptr, c_int - TYPE(c_ptr), VALUE :: handle - INTEGER(c_int) :: lammps_version - END FUNCTION lammps_version + FUNCTION lammps_get_thermo(handle,name) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + REAL(c_double) :: lammps_get_thermo + TYPE(c_ptr), INTENT(IN), VALUE :: handle + TYPE(c_ptr), INTENT(IN), VALUE :: name + END FUNCTION lammps_get_thermo + + SUBROUTINE lammps_extract_box(handle,boxlo,boxhi,xy,yz,xz,pflags, & + boxflag) BIND(C) + IMPORT :: c_ptr, c_double, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, boxlo, boxhi, xy, yz, xz, & + pflags, boxflag + END SUBROUTINE lammps_extract_box + + SUBROUTINE lammps_reset_box(handle,boxlo,boxhi,xy,yz,xz) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle + REAL(c_double), DIMENSION(3), INTENT(IN) :: boxlo, boxhi + REAL(c_double), INTENT(IN), VALUE :: xy, yz, xz + END SUBROUTINE lammps_reset_box + + SUBROUTINE lammps_memory_usage(handle,meminfo) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle + REAL(c_double), DIMENSION(*), INTENT(OUT) :: meminfo + END SUBROUTINE lammps_memory_usage + + FUNCTION lammps_get_mpi_comm(handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle + INTEGER(c_int) :: lammps_get_mpi_comm + END FUNCTION lammps_get_mpi_comm + + FUNCTION lammps_extract_setting(handle,keyword) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, keyword + INTEGER(c_int) :: lammps_extract_setting + END FUNCTION lammps_extract_setting + + FUNCTION lammps_extract_global_datatype(handle,name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name + INTEGER(c_int) :: lammps_extract_global_datatype + END FUNCTION lammps_extract_global_datatype + + FUNCTION lammps_extract_global(handle, name) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name + TYPE(c_ptr) :: lammps_extract_global + END FUNCTION lammps_extract_global + + FUNCTION lammps_extract_atom_datatype(handle, name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name + INTEGER(c_int) :: lammps_extract_atom_datatype + END FUNCTION lammps_extract_atom_datatype + + FUNCTION lammps_extract_atom(handle, name) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name + TYPE(c_ptr) :: lammps_extract_atom + END FUNCTION lammps_extract_atom + + FUNCTION lammps_extract_compute(handle, id, style, type) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, id + INTEGER(c_int), INTENT(IN), VALUE :: style, type + TYPE(c_ptr) :: lammps_extract_compute + END FUNCTION lammps_extract_compute + + FUNCTION lammps_extract_fix(handle, id, style, type, nrow, ncol) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, id + INTEGER(c_int), INTENT(IN), VALUE :: style, type, nrow, ncol + TYPE(c_ptr) :: lammps_extract_fix + END FUNCTION lammps_extract_fix + + FUNCTION lammps_extract_variable_datatype(handle,name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name + INTEGER(c_int) :: lammps_extract_variable_datatype + END FUNCTION lammps_extract_variable_datatype + + FUNCTION lammps_extract_variable(handle, name, group) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name, group + TYPE(c_ptr) :: lammps_extract_variable + END FUNCTION lammps_extract_variable + + FUNCTION lammps_set_variable(handle, name, str) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, str + INTEGER(c_int) :: lammps_set_variable + END FUNCTION lammps_set_variable + + SUBROUTINE lammps_gather_atoms(handle, name, type, count, data) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, data + INTEGER(c_int), VALUE :: type, count + END SUBROUTINE lammps_gather_atoms + + SUBROUTINE lammps_gather_atoms_concat(handle, name, type, count, data) & + BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, data + INTEGER(c_int), VALUE :: type, count + END SUBROUTINE lammps_gather_atoms_concat + + SUBROUTINE lammps_gather_atoms_subset(handle, name, type, count, ndata, & + ids, data) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, ids, data + INTEGER(c_int), VALUE :: type, count, ndata + END SUBROUTINE lammps_gather_atoms_subset + + SUBROUTINE lammps_scatter_atoms(handle, name, type, count, data) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, data + INTEGER(c_int), VALUE :: type, count + END SUBROUTINE lammps_scatter_atoms + + SUBROUTINE lammps_scatter_atoms_subset(handle, name, type, count, & + ndata, ids, data) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, ids, data + INTEGER(c_int), VALUE :: count, ndata, type + END SUBROUTINE lammps_scatter_atoms_subset + + SUBROUTINE lammps_gather_bonds(handle, data) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, data + END SUBROUTINE lammps_gather_bonds + + !SUBROUTINE lammps_gather + + !SUBROUTINE lammps_gather_concat + + !SUBROUTINE lammps_gather_subset + + !SUBROUTINE lammps_scatter_subset + + FUNCTION lammps_create_atoms(handle, n, id, type, x, v, image, bexpand) & + BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, id, type, x, v, image + INTEGER(c_int), VALUE :: n, bexpand + INTEGER(c_int) :: lammps_create_atoms + END FUNCTION lammps_create_atoms + + FUNCTION lammps_find_pair_neighlist(handle, style, exact, nsub, reqid) & + BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, style + INTEGER(c_int), VALUE :: exact, nsub, reqid + INTEGER(c_int) :: lammps_find_pair_neighlist + END FUNCTION lammps_find_pair_neighlist + + FUNCTION lammps_find_fix_neighlist(handle, id, reqid) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, id + INTEGER(c_int), VALUE :: reqid + INTEGER(c_int) :: lammps_find_fix_neighlist + END FUNCTION lammps_find_fix_neighlist + + FUNCTION lammps_find_compute_neighlist(handle, id, reqid) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, id + INTEGER(c_int), VALUE :: reqid + INTEGER(c_int) :: lammps_find_compute_neighlist + END FUNCTION lammps_find_compute_neighlist + + FUNCTION lammps_neighlist_num_elements(handle, idx) BIND(C) + IMPORT :: c_ptr, c_int + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int), VALUE :: idx + INTEGER(c_int) :: lammps_neighlist_num_elements + END FUNCTION lammps_neighlist_num_elements + + SUBROUTINE lammps_neighlist_element_neighbors(handle, idx, element, & + iatom, numneigh, neighbors) BIND(C) + IMPORT :: c_ptr, c_int + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int), VALUE :: idx, element + INTEGER(c_int) :: iatom, numneigh + TYPE(c_ptr) :: neighbors + END SUBROUTINE lammps_neighlist_element_neighbors + + FUNCTION lammps_version(handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int) :: lammps_version + END FUNCTION lammps_version + + SUBROUTINE lammps_get_os_info(buffer, buf_size) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: buffer + INTEGER(c_int), VALUE :: buf_size + END SUBROUTINE lammps_get_os_info + + FUNCTION lammps_config_has_mpi_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_mpi_support + END FUNCTION lammps_config_has_mpi_support + + FUNCTION lammps_config_has_gzip_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_gzip_support + END FUNCTION lammps_config_has_gzip_support + + FUNCTION lammps_config_has_png_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_png_support + END FUNCTION lammps_config_has_png_support + + FUNCTION lammps_config_has_jpeg_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_jpeg_support + END FUNCTION lammps_config_has_jpeg_support + + FUNCTION lammps_config_has_ffmpeg_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_ffmpeg_support + END FUNCTION lammps_config_has_ffmpeg_support + + FUNCTION lammps_config_has_exceptions() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_exceptions + END FUNCTION lammps_config_has_exceptions + + FUNCTION lammps_config_has_package(name) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: name + INTEGER(c_int) :: lammps_config_has_package + END FUNCTION lammps_config_has_package + + FUNCTION lammps_config_package_count() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_package_count + END FUNCTION lammps_config_package_count + + FUNCTION lammps_config_package_name(idx, buffer, buf_size) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_package_name + INTEGER(c_int), VALUE :: idx, buf_size + TYPE(c_ptr), VALUE :: buffer + END FUNCTION lammps_config_package_name + + FUNCTION lammps_config_accelerator(package, category, setting) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: package, category, setting + INTEGER(c_int) :: lammps_config_accelerator + END FUNCTION lammps_config_accelerator + + FUNCTION lammps_has_gpu_device() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_has_gpu_device + END FUNCTION lammps_has_gpu_device + + SUBROUTINE lammps_get_gpu_device_info(buffer, buf_size) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: buffer + INTEGER(c_int), VALUE :: buf_size + END SUBROUTINE lammps_get_gpu_device_info + + FUNCTION lammps_has_style(handle, category, name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, category, name + INTEGER(c_int) :: lammps_has_style + END FUNCTION lammps_has_style + + FUNCTION lammps_style_count(handle, category) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, category + INTEGER(c_int) :: lammps_style_count + END FUNCTION lammps_style_count + + FUNCTION lammps_style_name(handle, category, idx, buffer, buf_size) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, category, buffer + INTEGER(c_int), VALUE :: idx, buf_size + INTEGER(c_int) :: lammps_style_name + END FUNCTION lammps_style_name + + FUNCTION lammps_has_id(handle, category, name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, category, name + INTEGER(c_int) :: lammps_has_id + END FUNCTION lammps_has_id + + FUNCTION lammps_id_count(handle, category) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, category + INTEGER(c_int) :: lammps_id_count + END FUNCTION lammps_id_count + + FUNCTION lammps_id_name(handle, category, idx, buffer, buf_size) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, category, buffer + INTEGER(c_int), VALUE :: idx, buf_size + INTEGER(c_int) :: lammps_id_name + END FUNCTION lammps_id_name + + FUNCTION lammps_plugin_count() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_plugin_count + END FUNCTION lammps_plugin_count + + FUNCTION lammps_plugin_name(idx, stylebuf, namebuf, buf_size) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + INTEGER(c_int), VALUE :: idx, buf_size + TYPE(c_ptr), VALUE :: stylebuf, namebuf + INTEGER(c_int) :: lammps_plugin_name + END FUNCTION lammps_plugin_name + + ! We don't call lammps_encode_image_flags because its interface is + ! ambiguous: we don't know sizeof(imageint) prior to compile time. + ! It is re-written in Fortran below. It was easier to do the same for + ! lammps_decode_image_flags's equivalent. + + !SUBROUTINE lammps_set_fix_external_callback ! may have trouble.... + !FUNCTION lammps_fix_external_get_force() ! returns real(c_double)(:) + + !SUBROUTINE lammps_fix_external_set_energy_global + !SUBROUTINE lammps_fix_external_set_energy_peratom + !SUBROUTINE lammps_fix_external_set_virial_global + !SUBROUTINE lammps_fix_external_set_virial_peratom + !SUBROUTINE lammps_fix_external_set_vector_length + !SUBROUTINE lammps_fix_external_set_vector + + SUBROUTINE lammps_flush_buffers(handle) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + END SUBROUTINE lammps_flush_buffers + + SUBROUTINE lammps_free(ptr) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: ptr + END SUBROUTINE lammps_free + + INTEGER(c_int) FUNCTION lammps_is_running(handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + END FUNCTION lammps_is_running + + SUBROUTINE lammps_force_timeout(handle) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + END SUBROUTINE lammps_force_timeout + + INTEGER(c_int) FUNCTION lammps_has_error(handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + END FUNCTION lammps_has_error + + INTEGER(c_int) FUNCTION lammps_get_last_error_message & + (handle, buffer, buf_size) BIND(C) + IMPORT :: c_ptr, c_int, c_char + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, buffer + INTEGER(c_int), VALUE :: buf_size + END FUNCTION lammps_get_last_error_message + + !--------------------------------------------------------------------- + ! Utility functions imported for convenience (not in library.h) + !--------------------------------------------------------------------- + FUNCTION lammps_malloc(size) BIND(C, name='malloc') + IMPORT :: c_ptr, c_size_t + IMPLICIT NONE + INTEGER(c_size_t), VALUE :: size + TYPE(c_ptr) :: lammps_malloc + END FUNCTION lammps_malloc + + FUNCTION c_strlen(str) BIND(C, name='strlen') + IMPORT :: c_ptr, c_size_t + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: str + INTEGER(c_size_t) :: c_strlen + END FUNCTION c_strlen - FUNCTION lammps_get_natoms(handle) BIND(C, name='lammps_get_natoms') - IMPORT :: c_ptr, c_double - TYPE(c_ptr), VALUE :: handle - REAL(c_double) :: lammps_get_natoms - END FUNCTION lammps_get_natoms END INTERFACE CONTAINS @@ -138,9 +778,8 @@ CONTAINS ! Constructor for the LAMMPS class. ! Combined wrapper around lammps_open_fortran() and lammps_open_no_mpi() TYPE(lammps) FUNCTION lmp_open(args, comm) - IMPLICIT NONE - INTEGER, INTENT(in), OPTIONAL :: comm - CHARACTER(len=*), INTENT(in), OPTIONAL :: args(:) + INTEGER, INTENT(IN), OPTIONAL :: comm + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: args(:) TYPE(c_ptr), ALLOCATABLE :: argv(:) INTEGER(c_int) :: i, c_comm, argc @@ -169,13 +808,20 @@ CONTAINS CALL lammps_free(argv(i)) END DO DEALLOCATE(argv) + + ! Assign style and type members so lmp_open%style%global and such work + lmp_open%style%global = LMP_STYLE_GLOBAL + lmp_open%style%atom = LMP_STYLE_ATOM + lmp_open%style%local = LMP_STYLE_LOCAL + lmp_open%type%scalar = LMP_TYPE_SCALAR + lmp_open%type%vector = LMP_TYPE_VECTOR + lmp_open%type%array = LMP_TYPE_ARRAY END FUNCTION lmp_open ! Combined Fortran wrapper around lammps_close() and lammps_mpi_finalize() SUBROUTINE lmp_close(self, finalize) - IMPLICIT NONE - CLASS(lammps) :: self - LOGICAL, INTENT(in), OPTIONAL :: finalize + CLASS(lammps), INTENT(IN) :: self + LOGICAL, INTENT(IN), OPTIONAL :: finalize CALL lammps_close(self%handle) @@ -187,23 +833,21 @@ CONTAINS END IF END SUBROUTINE lmp_close - INTEGER FUNCTION lmp_version(self) - IMPLICIT NONE + ! equivalent function to lammps_error() + SUBROUTINE lmp_error(self, error_type, error_text) CLASS(lammps) :: self + INTEGER(c_int) :: error_type + CHARACTER(len=*) :: error_text + TYPE(c_ptr) :: str - lmp_version = lammps_version(self%handle) - END FUNCTION lmp_version - - DOUBLE PRECISION FUNCTION lmp_get_natoms(self) - IMPLICIT NONE - CLASS(lammps) :: self - - lmp_get_natoms = lammps_get_natoms(self%handle) - END FUNCTION lmp_get_natoms + str = f2c_string(error_text) + CALL lammps_error(self%handle, error_type, str) + CALL lammps_free(str) + END SUBROUTINE lmp_error + ! equivalent function to lammps_file() SUBROUTINE lmp_file(self, filename) - IMPLICIT NONE - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self CHARACTER(len=*) :: filename TYPE(c_ptr) :: str @@ -214,8 +858,7 @@ CONTAINS ! equivalent function to lammps_command() SUBROUTINE lmp_command(self, cmd) - IMPLICIT NONE - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self CHARACTER(len=*) :: cmd TYPE(c_ptr) :: str @@ -226,9 +869,8 @@ CONTAINS ! equivalent function to lammps_commands_list() SUBROUTINE lmp_commands_list(self, cmds) - IMPLICIT NONE - CLASS(lammps) :: self - CHARACTER(len=*), INTENT(in), OPTIONAL :: cmds(:) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cmds(:) TYPE(c_ptr), ALLOCATABLE :: cmdv(:) INTEGER :: i, ncmd @@ -250,8 +892,7 @@ CONTAINS ! equivalent function to lammps_commands_string() SUBROUTINE lmp_commands_string(self, str) - IMPLICIT NONE - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self CHARACTER(len=*) :: str TYPE(c_ptr) :: tmp @@ -260,13 +901,1726 @@ CONTAINS CALL lammps_free(tmp) END SUBROUTINE lmp_commands_string + ! equivalent function to lammps_get_natoms + REAL(c_double) FUNCTION lmp_get_natoms(self) + CLASS(lammps) :: self + + lmp_get_natoms = lammps_get_natoms(self%handle) + END FUNCTION lmp_get_natoms + + ! equivalent function to lammps_get_thermo + REAL(c_double) FUNCTION lmp_get_thermo(self,name) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*) :: name + TYPE(c_ptr) :: Cname + + Cname = f2c_string(name) + lmp_get_thermo = lammps_get_thermo(self%handle, Cname) + CALL lammps_free(Cname) + END FUNCTION lmp_get_thermo + + ! equivalent subroutine to lammps_extract_box + SUBROUTINE lmp_extract_box(self, boxlo, boxhi, xy, yz, xz, pflags, boxflag) + CLASS(lammps), INTENT(IN) :: self + REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: boxlo(3), boxhi(3) + REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: xy, yz, xz + LOGICAL, INTENT(OUT), OPTIONAL :: pflags(3), boxflag + INTEGER(c_int), TARGET :: c_pflags(3), c_boxflag + TYPE(c_ptr) :: ptr(7) + + ptr = c_null_ptr + IF (PRESENT(boxlo)) ptr(1) = C_LOC(boxlo(1)) + IF (PRESENT(boxhi)) ptr(2) = C_LOC(boxhi(1)) + IF (PRESENT(xy)) ptr(3) = C_LOC(xy) + IF (PRESENT(yz)) ptr(4) = C_LOC(yz) + IF (PRESENT(xz)) ptr(5) = C_LOC(xz) + IF (PRESENT(pflags)) ptr(6) = C_LOC(c_pflags(1)) + IF (PRESENT(boxflag)) ptr(7) = C_LOC(c_boxflag) + CALL lammps_extract_box(self%handle, ptr(1), ptr(2), ptr(3), ptr(4), & + ptr(5), ptr(6), ptr(7)) + IF (PRESENT(pflags)) pflags = (c_pflags /= 0_c_int) + IF (PRESENT(boxflag)) boxflag = (c_boxflag /= 0_c_int) + END SUBROUTINE lmp_extract_box + + ! equivalent function to lammps_reset_box + SUBROUTINE lmp_reset_box(self, boxlo, boxhi, xy, yz, xz) + CLASS(lammps), INTENT(IN) :: self + REAL(c_double), INTENT(IN) :: boxlo(3), boxhi(3), xy, yz, xz + + CALL lammps_reset_box(self%handle, boxlo, boxhi, xy, yz, xz) + END SUBROUTINE lmp_reset_box + + ! equivalent function to lammps_memory_usage + SUBROUTINE lmp_memory_usage(self,meminfo) + CLASS(lammps), INTENT(IN) :: self + INTEGER, PARAMETER :: MEMINFO_ELEM = 3 + REAL(c_double), DIMENSION(MEMINFO_ELEM), INTENT(OUT) :: meminfo + + CALL lammps_memory_usage(self%handle,meminfo) + END SUBROUTINE lmp_memory_usage + + ! equivalent function to lammps_get_mpi_comm + INTEGER FUNCTION lmp_get_mpi_comm(self) + CLASS(lammps), INTENT(IN) :: self + + lmp_get_mpi_comm = lammps_get_mpi_comm(self%handle) + END FUNCTION lmp_get_mpi_comm + + ! equivalent function to lammps_extract_setting + INTEGER(c_int) FUNCTION lmp_extract_setting(self, keyword) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: keyword + TYPE(c_ptr) :: Ckeyword + + Ckeyword = f2c_string(keyword) + lmp_extract_setting = lammps_extract_setting(self%handle, Ckeyword) + CALL lammps_free(Ckeyword) + END FUNCTION lmp_extract_setting + + ! equivalent function to lammps_extract_global + ! the assignment is actually overloaded so as to bind the pointers to + ! lammps data based on the information available from LAMMPS + FUNCTION lmp_extract_global(self, name) RESULT(global_data) + CLASS(lammps), INTENT(IN), TARGET :: self + CHARACTER(LEN=*), INTENT(IN) :: name + TYPE(lammps_data) :: global_data + INTEGER(c_int) :: datatype + TYPE(c_ptr) :: Cname, Cptr + INTEGER(c_size_t) :: length + + ! Determine vector length + ! FIXME Is there a way to get the length of the vector from C rather + ! than defining it here AND in the Python API? + SELECT CASE (name) + CASE ('boxlo','boxhi','sublo','subhi','sublo_lambda','subhi_lambda', & + 'periodicity') + length = 3 + CASE DEFAULT + length = 1 + ! string cases doesn't use "length" + END SELECT + + Cname = f2c_string(name) + datatype = lammps_extract_global_datatype(self%handle, Cname) + ! above could be c_null_ptr in place of self%handle...doesn't matter + Cptr = lammps_extract_global(self%handle, Cname) + CALL lammps_free(Cname) + + global_data%lammps_instance => self + SELECT CASE (datatype) + CASE (LAMMPS_INT) + IF (length == 1) THEN + global_data%datatype = DATA_INT + CALL C_F_POINTER(Cptr, global_data%i32) + ELSE + global_data%datatype = DATA_INT_1D + CALL C_F_POINTER(Cptr, global_data%i32_vec, [length]) + END IF + CASE (LAMMPS_INT64) + IF (length == 1) THEN + global_data%datatype = DATA_INT64 + CALL C_F_POINTER(Cptr, global_data%i64) + ELSE + global_data%datatype = DATA_INT64_1D + CALL C_F_POINTER(Cptr, global_data%i64_vec, [length]) + END IF + CASE (LAMMPS_DOUBLE) + IF (length == 1) THEN + global_data%datatype = DATA_DOUBLE + CALL C_F_POINTER(Cptr, global_data%r64) + ELSE + global_data%datatype = DATA_DOUBLE_1D + CALL C_F_POINTER(Cptr, global_data%r64_vec, [length]) + END IF + CASE (LAMMPS_STRING) + global_data%datatype = DATA_STRING + global_data%str = c2f_string(Cptr) + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Unknown pointer type in extract_global') + END SELECT + END FUNCTION + + ! equivalent function to lammps_extract_atom + ! the assignment is actually overloaded so as to bind the pointers to + ! lammps data based on the information available from LAMMPS + FUNCTION lmp_extract_atom(self, name) RESULT(peratom_data) + CLASS(lammps), INTENT(IN), TARGET :: self + CHARACTER(LEN=*), INTENT(IN) :: name + TYPE(lammps_data) :: peratom_data + + INTEGER(c_int) :: datatype + TYPE(c_ptr) :: Cname, Cptr + INTEGER(c_int) :: ntypes, nmax + INTEGER :: nrows, ncols + REAL(c_double), DIMENSION(:), POINTER :: dummy + TYPE(c_ptr), DIMENSION(:), POINTER :: Catomptr + CHARACTER(LEN=:), ALLOCATABLE :: error_msg + + nmax = lmp_extract_setting(self, 'nmax') + ntypes = lmp_extract_setting(self, 'ntypes') + Cname = f2c_string(name) + datatype = lammps_extract_atom_datatype(self%handle, Cname) + Cptr = lammps_extract_atom(self%handle, Cname) + CALL lammps_free(Cname) + + SELECT CASE (name) + CASE ('mass') + ncols = ntypes + 1 + nrows = 1 + CASE ('x','v','f','mu','omega','torque','angmom') + ncols = nmax + nrows = 3 + CASE DEFAULT + ncols = nmax + nrows = 1 + END SELECT + + peratom_data%lammps_instance => self + SELECT CASE (datatype) + CASE (LAMMPS_INT) + peratom_data%datatype = DATA_INT_1D + CALL C_F_POINTER(Cptr, peratom_data%i32_vec, [ncols]) + CASE (LAMMPS_INT64) + peratom_data%datatype = DATA_INT64_1D + CALL C_F_POINTER(Cptr, peratom_data%i64_vec, [ncols]) + CASE (LAMMPS_DOUBLE) + peratom_data%datatype = DATA_DOUBLE_1D + IF (name == 'mass') THEN + CALL C_F_POINTER(Cptr, dummy, [ncols]) + peratom_data%r64_vec(0:) => dummy + ELSE + CALL C_F_POINTER(Cptr, peratom_data%r64_vec, [ncols]) + END IF + CASE (LAMMPS_DOUBLE_2D) + peratom_data%datatype = DATA_DOUBLE_2D + ! First, we dereference the void** pointer to point to the void* + CALL C_F_POINTER(Cptr, Catomptr, [ncols]) + ! Catomptr(1) now points to the first element of the array + CALL C_F_POINTER(Catomptr(1), peratom_data%r64_mat, [nrows,ncols]) + CASE (-1) + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'per-atom property ' // name // 'not found in extract_setting') + CASE DEFAULT + error_msg = '' + WRITE(error_msg,'(A,I0,A)') 'return value ', datatype, & + ' from lammps_extract_atom_datatype not known [Fortran/extract_atom]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END SELECT + END FUNCTION lmp_extract_atom + + ! equivalent function to lammps_extract_compute + ! the assignment operator is overloaded so as to bind the pointers to + ! lammps data based on the information available from LAMMPS + FUNCTION lmp_extract_compute(self, id, style, type) RESULT(compute_data) + CLASS(lammps), INTENT(IN), TARGET :: self + CHARACTER(LEN=*), INTENT(IN) :: id + INTEGER(c_int), INTENT(IN) :: style, type + TYPE(lammps_data) :: compute_data + + TYPE(c_ptr) :: Cid, Cptr, Ctemp + INTEGER :: nrows, ncols, length + INTEGER(c_int), POINTER :: temp + TYPE(c_ptr), DIMENSION(:), POINTER :: Ccomputeptr + + Cid = f2c_string(id) + Cptr = lammps_extract_compute(self%handle, Cid, style, type) + + IF (.NOT. C_ASSOCIATED(Cptr)) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Pointer from LAMMPS is NULL [Fortran/extract_compute]') + END IF + + ! Remember that rows and columns in C are transposed in Fortran! + compute_data%lammps_instance => self + SELECT CASE (type) + CASE (LMP_TYPE_SCALAR) + compute_data%datatype = DATA_DOUBLE + length = 1 + nrows = 1 + ncols = 1 + CALL C_F_POINTER(Cptr, compute_data%r64) + CASE (LMP_TYPE_VECTOR) + compute_data%datatype = DATA_DOUBLE_1D + IF (style == LMP_STYLE_ATOM) THEN + length = self%extract_setting('nmax') + ELSE + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_VECTOR) + CALL C_F_POINTER(Ctemp, temp) + length = temp + END IF + CALL C_F_POINTER(Cptr, compute_data%r64_vec, [length]) + CASE (LMP_TYPE_ARRAY) + compute_data%datatype = DATA_DOUBLE_2D + IF (style == LMP_STYLE_ATOM) THEN + ncols = self%extract_setting('nmax') + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_COLS) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + ELSE + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_ROWS) + CALL C_F_POINTER(Ctemp, temp) + ncols = temp + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_COLS) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + END IF + ! First, we dereference the void** pointer to point to a void* pointer + CALL C_F_POINTER(Cptr, Ccomputeptr, [ncols]) + ! Ccomputeptr(1) now points to the first element of the array + CALL C_F_POINTER(Ccomputeptr(1), compute_data%r64_mat, [nrows, ncols]) + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'unknown type value passed to extract_compute [Fortran API]') + END SELECT + CALL lammps_free(Cid) + END FUNCTION lmp_extract_compute + + FUNCTION lmp_extract_fix(self, id, style, type, nrow, ncol) RESULT(fix_data) + CLASS(lammps), INTENT(IN), TARGET :: self + CHARACTER(LEN=*), INTENT(IN) :: id + INTEGER(c_int), INTENT(IN) :: style, type + INTEGER(c_int), INTENT(IN), OPTIONAL :: nrow, ncol + TYPE(lammps_fix_data) :: fix_data + + TYPE(c_ptr) :: Cid, Cptr, Ctemp + TYPE(c_ptr), DIMENSION(:), POINTER :: Cfixptr + INTEGER(c_int) :: Cnrow, Cncol + REAL(c_double), POINTER :: Fptr + INTEGER :: nrows, ncols + INTEGER(c_int), POINTER :: temp + + ! We transpose ncol and nrow so the array appears to be transposed for + ! global data, as it would be if we could access the C++ array directly + Cnrow = -1 + Cncol = -1 + IF (PRESENT(nrow)) THEN + IF (.NOT. PRESENT(ncol)) THEN + ! Presumably the argument that's there is the vector length + Cnrow = nrow - 1_c_int + Cncol = -1_c_int + ELSE + ! Otherwise, the array is transposed, so...reverse the indices + Cncol = nrow - 1_c_int + END IF + END IF + + IF (PRESENT(ncol)) Cnrow = ncol - 1_c_int + + Cid = f2c_string(id) + Cptr = lammps_extract_fix(self%handle, Cid, style, type, Cnrow, Cncol) + IF (.NOT. C_ASSOCIATED(Cptr)) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Pointer from LAMMPS is NULL for fix id "' // id & + // '" [Fortran/extract_fix]') + END IF + + fix_data%lammps_instance => self + SELECT CASE (style) + CASE (LMP_STYLE_GLOBAL) + fix_data%datatype = DATA_DOUBLE + CALL C_F_POINTER(Cptr, Fptr) + fix_data%r64 = Fptr + CALL lammps_free(Cptr) + CASE (LMP_STYLE_ATOM, LMP_STYLE_LOCAL) + SELECT CASE (type) + CASE (LMP_TYPE_SCALAR) + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'There is no such thing as a per-atom or local scalar& + & [Fortran/extract_fix]') + CASE (LMP_TYPE_VECTOR) + fix_data%datatype = DATA_DOUBLE_1D + IF (STYLE == LMP_STYLE_ATOM) THEN + nrows = self%extract_setting('nmax') + ELSE + Ctemp = lammps_extract_fix(self%handle, Cid, style, & + LMP_SIZE_VECTOR, 0_c_int,0_c_int) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + END IF + CALL C_F_POINTER(Cptr, fix_data%r64_vec, [nrows]) + CASE (LMP_TYPE_ARRAY) + fix_data%datatype = DATA_DOUBLE_2D + IF (STYLE == LMP_STYLE_ATOM) THEN + ! Fortran array is transposed relative to C + ncols = self%extract_setting('nmax') + Ctemp = lammps_extract_fix(self%handle, Cid, style, & + LMP_SIZE_COLS, 0_c_int,0_c_int) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + ELSE + ! Fortran array is transposed relative to C + Ctemp = lammps_extract_fix(self%handle, Cid, style, & + LMP_SIZE_COLS, 0_c_int,0_c_int) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + Ctemp = lammps_extract_fix(self%handle, Cid, style, & + LMP_SIZE_ROWS, 0_c_int,0_c_int) + CALL C_F_POINTER(Ctemp, temp) + ncols = temp + END IF + ! First, we dereference the void** to point to a void* pointer + CALL C_F_POINTER(Cptr, Cfixptr, [ncols]) + ! Cfixptr(1) now points to the first element of the array + CALL C_F_POINTER(Cfixptr(1), fix_data%r64_mat, [nrows, ncols]) + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'unknown type value passed to extract_fix [Fortran API]') + END SELECT + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'unknown style value passed to extract_fix [Fortran API]') + END SELECT + CALL lammps_free(Cid) + END FUNCTION lmp_extract_fix + + ! equivalent function to lammps_extract_variable + FUNCTION lmp_extract_variable(self, name, group) RESULT(variable_data) + CLASS(lammps), INTENT(IN), TARGET :: self + CHARACTER(LEN=*), INTENT(IN) :: name + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: group + TYPE(lammps_variable_data) :: variable_data + + TYPE(c_ptr) :: Cptr, Cname, Cgroup, Cveclength + INTEGER(c_size_t) :: length + INTEGER(c_int) :: datatype + REAL(c_double), POINTER :: double => NULL() + REAL(c_double), DIMENSION(:), POINTER :: double_vec => NULL() + INTEGER(c_int), POINTER :: Clength => NULL() + + Cname = f2c_string(name) + IF (PRESENT(group)) THEN + Cgroup = f2c_string(group) + ELSE + Cgroup = c_null_ptr + END IF + datatype = lammps_extract_variable_datatype(self%handle, Cname) + Cptr = lammps_extract_variable(self%handle, Cname, Cgroup) + CALL lammps_free(Cname) + CALL lammps_free(Cgroup) + + variable_data%lammps_instance => self + SELECT CASE (datatype) + CASE (LMP_VAR_EQUAL) + variable_data%datatype = DATA_DOUBLE + CALL C_F_POINTER(Cptr, double) + variable_data%r64 = double + CALL lammps_free(Cptr) + CASE (LMP_VAR_ATOM) + variable_data%datatype = DATA_DOUBLE_1D + length = lmp_extract_setting(self, 'nlocal') + CALL C_F_POINTER(Cptr, double_vec, [length]) + IF (ALLOCATED(variable_data%r64_vec)) DEALLOCATE(variable_data%r64_vec) + ALLOCATE(variable_data%r64_vec(length)) + variable_data%r64_vec = double_vec + CALL lammps_free(Cptr) + CASE (LMP_VAR_VECTOR) + variable_data%datatype = DATA_DOUBLE_1D + Cgroup = f2c_string('LMP_SIZE_VECTOR') ! must match library.cpp + Cname = f2c_string(name) + Cveclength = lammps_extract_variable(self%handle, Cname, Cgroup) + CALL C_F_POINTER(Cveclength, Clength) + length = Clength + CALL lammps_free(Cgroup) + CALL lammps_free(Cname) + CALL lammps_free(Cveclength) + CALL C_F_POINTER(Cptr, double_vec, [length]) + IF (ALLOCATED(variable_data%r64_vec)) & + DEALLOCATE(variable_data%r64_vec) + ALLOCATE(variable_data%r64_vec(length)) + variable_data%r64_vec = double_vec + ! DO NOT deallocate the C pointer + CASE (LMP_VAR_STRING) + variable_data%datatype = DATA_STRING + length = c_strlen(Cptr) + ALLOCATE(CHARACTER(LEN=length) :: variable_data%str) + variable_data%str = c2f_string(Cptr) + ! DO NOT deallocate the C pointer + CASE (-1) + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Variable "' // TRIM(name) // & + '" not found [Fortran/extract_variable]') + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Unknown variable type returned from & + &lammps_extract_variable_datatype [Fortran/extract_variable]') + END SELECT + END FUNCTION lmp_extract_variable + + ! equivalent function to lammps_set_variable + SUBROUTINE lmp_set_variable(self, name, str) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name, str + INTEGER :: err + TYPE(c_ptr) :: Cstr, Cname + + Cstr = f2c_string(str) + Cname = f2c_string(name) + err = lammps_set_variable(self%handle, Cname, Cstr) + CALL lammps_free(Cname) + CALL lammps_free(Cstr) + IF (err /= 0) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'WARNING: unable to set string variable "' // name & + // '" [Fortran/set_variable]') + END IF + END SUBROUTINE lmp_set_variable + + ! equivalent function to lammps_gather_atoms (for integers) + SUBROUTINE lmp_gather_atoms_int(self, name, count, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + TYPE(c_ptr) :: Cdata, Cname + INTEGER(c_int) :: natoms + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg + + IF (count /= 1 .AND. count /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& + & requires "count" to be 1 or 3 [Fortran/gather_atoms]') + END IF + + dnatoms = lmp_get_natoms(self) + IF (dnatoms > HUGE(1_c_int)) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function gather_atoms with more than', & + HUGE(0_c_int), 'atoms [Fortran/gather_atoms]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + IF (ALLOCATED(data)) DEALLOCATE(data) + ALLOCATE(data(natoms*count)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_atoms(self%handle, Cname, Ctype, count, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_int + + ! equivalent function to lammps_gather_atoms (for doubles) + SUBROUTINE lmp_gather_atoms_double(self, name, count, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + TYPE(c_ptr) :: Cdata, Cname + INTEGER(c_int) :: natoms + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg + + IF (count /= 1 .AND. count /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& + & requires "count" to be 1 or 3 [Fortran/gather_atoms]') + END IF + + dnatoms = lmp_get_natoms(self) + IF (dnatoms > HUGE(1_c_int)) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function gather_atoms with more than', & + HUGE(0_c_int), 'atoms [Fortran/gather_atoms]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + IF (ALLOCATED(data)) DEALLOCATE(data) + ALLOCATE(data(natoms*count)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_atoms(self%handle, Cname, Ctype, count, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_double + + ! equivalent function to lammps_gather_atoms_concat (for integers) + SUBROUTINE lmp_gather_atoms_concat_int(self, name, count, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + TYPE(c_ptr) :: Cdata, Cname + INTEGER(c_int) :: natoms + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg + + IF (count /= 1 .AND. count /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'gather_atoms_concat requires "count" to be 1 or 3 & + &[Fortran/gather_atoms_concat]') + END IF + + dnatoms = lmp_get_natoms(self) + IF (dnatoms > HUGE(1_c_int)) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function gather_atoms_concat with more than', & + HUGE(0_c_int), 'atoms [Fortran/gather_atoms_concat]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + IF (ALLOCATED(data)) DEALLOCATE(data) + ALLOCATE(data(natoms*count)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_atoms_concat(self%handle, Cname, Ctype, count, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_concat_int + + ! equivalent function to lammps_gather_atoms_concat (for doubles) + SUBROUTINE lmp_gather_atoms_concat_double(self, name, count, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + TYPE(c_ptr) :: Cdata, Cname + INTEGER(c_int) :: natoms + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg + + IF (count /= 1 .AND. count /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'gather_atoms_concat requires "count" to be 1 or 3 & + &[Fortran/gather_atoms_concat]') + END IF + + dnatoms = lmp_get_natoms(self) + IF (dnatoms > HUGE(1_c_int)) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function gather_atoms_concat with more than', & + HUGE(0_c_int), 'atoms [Fortran/gather_atoms_concat]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + IF (ALLOCATED(data)) DEALLOCATE(data) + ALLOCATE(data(natoms*count)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_atoms_concat(self%handle, Cname, Ctype, count, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_concat_double + + ! equivalent function to lammps_gather_atoms_subset (for integers) + SUBROUTINE lmp_gather_atoms_subset_int(self, name, count, ids, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + INTEGER(c_int), DIMENSION(:), TARGET, INTENT(IN) :: ids + INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + INTEGER(c_int) :: ndata + TYPE(c_ptr) :: Cdata, Cname, Cids + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + + IF (count /= 1 .AND. count /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'gather_atoms_subset requires "count" to be 1 or 3 & + &[Fortran/gather_atoms]') + END IF + + ndata = SIZE(ids, KIND=c_int) + + Cname = f2c_string(name) + IF (ALLOCATED(data)) DEALLOCATE(data) + ALLOCATE(data(ndata*count)) + data = -1_c_int + Cdata = C_LOC(data(1)) + Cids = C_LOC(ids(1)) + CALL lammps_gather_atoms_subset(self%handle, Cname, Ctype, count, & + ndata, Cids, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_subset_int + + ! equivalent function to lammps_gather_atoms_subset (for doubles) + SUBROUTINE lmp_gather_atoms_subset_double(self, name, count, ids, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + INTEGER(c_int), DIMENSION(:), TARGET, INTENT(IN) :: ids + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + INTEGER(c_int) :: ndata + TYPE(c_ptr) :: Cdata, Cname, Cids + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + + IF (count /= 1 .AND. count /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'gather_atoms_subset requires "count" to be 1 or 3 & + &[Fortran/gather_atoms]') + END IF + + ndata = SIZE(ids, KIND=c_int) + + Cname = f2c_string(name) + IF (ALLOCATED(data)) DEALLOCATE(data) + ALLOCATE(data(ndata*count)) + Cdata = C_LOC(data(1)) + Cids = C_LOC(ids(1)) + CALL lammps_gather_atoms_subset(self%handle, Cname, Ctype, count, & + ndata, Cids, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_subset_double + + ! equivalent function to lammps_scatter_atoms (for integers) + SUBROUTINE lmp_scatter_atoms_int(self, name, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), DIMENSION(:), TARGET :: data + INTEGER(c_int) :: natoms, Ccount + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + TYPE(c_ptr) :: Cname, Cdata + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg + + dnatoms = lmp_get_natoms(self) + IF (dnatoms > HUGE(1_c_int)) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function scatter_atoms with more than', & + HUGE(0_c_int), 'atoms [Fortran/scatter_atoms]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + Cdata = C_LOC(data(1)) + Ccount = SIZE(data) / natoms + + IF (Ccount /= 1 .AND. Ccount /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'lammps_scatter_atoms requires either 1 or 3 data per atom') + END IF + CALL lammps_scatter_atoms(self%handle, Cname, Ctype, Ccount, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_scatter_atoms_int + + ! equivalent function to lammps_scatter_atoms (for doubles) + SUBROUTINE lmp_scatter_atoms_double(self, name, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + REAL(c_double), DIMENSION(:), TARGET :: data + INTEGER(c_int) :: natoms, Ccount + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + TYPE(c_ptr) :: Cname, Cdata + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg + + dnatoms = lmp_get_natoms(self) + IF (dnatoms > HUGE(1_c_int)) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function scatter_atoms with more than', & + HUGE(0_c_int), 'atoms [Fortran/scatter_atoms]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + Cdata = C_LOC(data(1)) + Ccount = SIZE(data) / natoms + + IF (Ccount /= 1 .AND. Ccount /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'scatter_atoms requires either 1 or 3 data per atom & + &[Fortran/scatter_atoms]') + END IF + CALL lammps_scatter_atoms(self%handle, Cname, Ctype, Ccount, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_scatter_atoms_double + + ! equivalent function to lammps_scatter_atoms_subset (for integers) + SUBROUTINE lmp_scatter_atoms_subset_int(self, name, ids, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), DIMENSION(:), TARGET :: ids + INTEGER(c_int), DIMENSION(:), TARGET :: data + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + INTEGER(c_int) :: Cndata, Ccount + TYPE(c_ptr) :: Cdata, Cname, Cids + + Cndata = SIZE(ids, KIND=c_int) + Ccount = SIZE(data, KIND=c_int) / Cndata + IF (Ccount /= 1 .AND. Ccount /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'scatter_atoms_subset requires either 1 or 3 data per atom') + END IF + + Cname = f2c_string(name) + Cdata = C_LOC(data(1)) + Cids = C_LOC(ids(1)) + CALL lammps_scatter_atoms_subset(self%handle, Cname, Ctype, Ccount, & + Cndata, Cids, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_scatter_atoms_subset_int + + ! equivalent function to lammps_scatter_atoms_subset (for doubles) + SUBROUTINE lmp_scatter_atoms_subset_double(self, name, ids, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), DIMENSION(:), TARGET :: ids + REAL(c_double), DIMENSION(:), TARGET :: data + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + INTEGER(c_int) :: Cndata, Ccount + TYPE(c_ptr) :: Cdata, Cname, Cids + + Cndata = SIZE(ids, KIND=c_int) + Ccount = SIZE(data, KIND=c_int) / Cndata + IF (Ccount /= 1 .AND. Ccount /= 3) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'scatter_atoms_subset requires either 1 or 3 data per atom') + END IF + + Cname = f2c_string(name) + Cdata = C_LOC(data(1)) + Cids = C_LOC(ids(1)) + CALL lammps_scatter_atoms_subset(self%handle, Cname, Ctype, Ccount, & + Cndata, Cids, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_scatter_atoms_subset_double + + ! equivalent function to lammps_gather_bonds (LAMMPS_SMALLSMALL or SMALLBIG) + SUBROUTINE lmp_gather_bonds_small(self, data) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + INTEGER(c_int) :: size_tagint, size_bigint + INTEGER(c_int), POINTER :: nbonds_small + INTEGER(c_int64_t), POINTER :: nbonds_big + TYPE(c_ptr) :: Cdata + + size_tagint = lmp_extract_setting(self, 'tagint') + IF (size_tagint /= 4_c_int) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Incompatible integer kind in gather_bonds [Fortran API]') + END IF + IF (ALLOCATED(data)) DEALLOCATE(data) + size_bigint = lmp_extract_setting(self, 'bigint') + IF (size_bigint == 4_c_int) THEN + nbonds_small = lmp_extract_global(self, 'nbonds') + ALLOCATE(data(3*nbonds_small)) + ELSE + nbonds_big = lmp_extract_global(self, 'nbonds') + ALLOCATE(data(3*nbonds_big)) + END IF + Cdata = C_LOC(data(1)) + CALL lammps_gather_bonds(self%handle, Cdata) + END SUBROUTINE lmp_gather_bonds_small + + ! equivalent function to lammps_gather_bonds (LAMMPS_BIGBIG) + SUBROUTINE lmp_gather_bonds_big(self, data) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int64_t), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + INTEGER(c_int) :: size_tagint + INTEGER(c_int64_t), POINTER :: nbonds + TYPE(c_ptr) :: Cdata + + size_tagint = lmp_extract_setting(self, 'tagint') + IF (size_tagint /= 8_c_int) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Incompatible integer kind in gather_bonds [Fortran API]') + END IF + nbonds = lmp_extract_global(self, 'nbonds') + IF (ALLOCATED(data)) DEALLOCATE(data) + ALLOCATE(data(3*nbonds)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_bonds(self%handle, Cdata) + END SUBROUTINE lmp_gather_bonds_big + + ! equivalent function to lammps_create_atoms (int ids or id absent) + SUBROUTINE lmp_create_atoms_int(self, id, type, x, v, image, bexpand) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int), DIMENSION(:), TARGET, OPTIONAL :: id, image + INTEGER(c_int), DIMENSION(:), TARGET, OPTIONAL :: type + REAL(c_double), DIMENSION(:), TARGET, OPTIONAL :: x, v + LOGICAL, OPTIONAL :: bexpand + INTEGER(c_int) :: n, Cbexpand + TYPE(c_ptr) :: Cid, Ctype, Cx, Cv, Cimage + INTEGER(c_int) :: tagint_size, atoms_created + + ! type is actually NOT optional, but we can't make id optional without it, + ! so we check at run-time + IF (.NOT. PRESENT(type)) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'the "type" argument to create_atoms is required& + & [Fortran/create_atoms]') + END IF + + tagint_size = lmp_extract_setting(self, 'tagint') + IF (tagint_size /= 4_c_int .AND. (PRESENT(id) .OR. PRESENT(image))) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Unable to create_atoms; your id/image array types are incompatible& + & with LAMMPS_SMALLBIG and LAMMPS_SMALLSMALL [Fortran/create_atoms]') + END IF + n = SIZE(type, KIND=c_int) + IF (PRESENT(bexpand)) THEN + IF (bexpand) THEN + Cbexpand = 1_c_int + ELSE + Cbexpand = 0_c_int + END IF + ELSE + Cbexpand = 0_c_int + END IF + IF (PRESENT(id)) THEN + Cid = C_LOC(id(1)) + ELSE + Cid = c_null_ptr + END IF + IF (PRESENT(type)) THEN + Ctype = C_LOC(type(1)) + END IF + IF (PRESENT(image)) THEN + Cimage = C_LOC(image(1)) + ELSE + Cimage = c_null_ptr + END IF + IF (PRESENT(x)) THEN + Cx = C_LOC(x(1)) + ELSE + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'the argument "x" to create_atoms is required') + END IF + IF (PRESENT(v)) THEN + Cv = C_LOC(v(1)) + ELSE + Cv = c_null_ptr + END IF + atoms_created = lammps_create_atoms(self%handle, n, Cid, Ctype, Cx, Cv, & + Cimage, Cbexpand) + IF ( atoms_created < 0_c_int ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'error when trying to create atoms [Fortran/create_atoms]') + ELSE IF ( atoms_created /= n ) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'atoms created /= atoms asked to create [Fortran/create_atoms]') + END IF + END SUBROUTINE lmp_create_atoms_int + + ! equivalent function to lammps_create_atoms (long int ids and images) + SUBROUTINE lmp_create_atoms_bigbig(self, id, type, x, v, image, bexpand) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int64_t), DIMENSION(:), TARGET :: id + INTEGER(c_int), DIMENSION(:), TARGET :: type + REAL(c_double), DIMENSION(:), TARGET :: x + REAL(c_double), DIMENSION(:), OPTIONAL, TARGET :: v + INTEGER(c_int64_t), DIMENSION(:), OPTIONAL, TARGET :: image + LOGICAL, OPTIONAL :: bexpand + INTEGER(c_int) :: n, Cbexpand + TYPE(c_ptr) :: Cid, Ctype, Cx, Cv, Cimage + INTEGER(c_int) :: tagint_size, atoms_created + + tagint_size = lmp_extract_setting(self, 'tagint') + IF ( tagint_size /= 8_c_int ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Unable to create_atoms; your id/image array types are incompatible& + & with LAMMPS_BIGBIG') + END IF + n = SIZE(type, KIND=c_int) + IF (PRESENT(bexpand)) THEN + IF (bexpand) THEN + Cbexpand = 1_c_int + ELSE + Cbexpand = 0_c_int + END IF + ELSE + Cbexpand = 0_c_int + END IF + Cid = C_LOC(id(1)) + Ctype = C_LOC(type(1)) + IF (PRESENT(image)) THEN + Cimage = C_LOC(image(1)) + ELSE + Cimage = c_null_ptr + END IF + Cx = C_LOC(x(1)) + IF (PRESENT(v)) THEN + Cv = C_LOC(v(1)) + ELSE + Cv = c_null_ptr + END IF + atoms_created = lammps_create_atoms(self%handle, n, Cid, Ctype, Cx, Cv, & + Cimage, Cbexpand) + IF ( atoms_created < 0_c_int ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'error when trying to create atoms [Fortran/create_atoms]') + ELSE IF ( atoms_created /= n ) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'atoms created /= atoms asked to create [Fortran/create_atoms]') + END IF + END SUBROUTINE lmp_create_atoms_bigbig + + ! equivalent function to lammps_find_pair_neighlist + INTEGER(c_int) FUNCTION lmp_find_pair_neighlist(self, style, exact, nsub, & + reqid) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: style + LOGICAL, INTENT(IN), OPTIONAL :: exact + INTEGER(c_int), INTENT(IN), OPTIONAL :: nsub, reqid + TYPE(c_ptr) :: Cstyle + INTEGER(c_int) :: Cexact, Cnsub, Creqid + + Cexact = 0_c_int + IF (PRESENT(exact)) THEN + IF (exact) THEN + Cexact = 1_c_int + END IF + END IF + IF (PRESENT(nsub)) THEN + Cnsub = nsub + ELSE + Cnsub = 0_c_int + END IF + IF (PRESENT(reqid)) THEN + Creqid = reqid + ELSE + Creqid = 0_c_int + END IF + Cstyle = f2c_string(style) + lmp_find_pair_neighlist = lammps_find_pair_neighlist(self%handle, Cstyle, & + Cexact, Cnsub, Creqid) + IF (lmp_find_pair_neighlist < 0) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'unable to find pair neighbor list [Fortran/find_pair_neighlist]') + END IF + CALL lammps_free(Cstyle) + END FUNCTION lmp_find_pair_neighlist + + ! equivalent function to lammps_find_fix_neighlist + INTEGER(c_int) FUNCTION lmp_find_fix_neighlist(self, id, reqid) RESULT(idx) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: id + INTEGER(c_int), INTENT(IN), OPTIONAL :: reqid + TYPE(c_ptr) :: Cid + INTEGER(c_int) :: Creqid + + IF (PRESENT(reqid)) THEN + Creqid = reqid + ELSE + Creqid = 0_c_int + END IF + Cid = f2c_string(id) + idx = lammps_find_fix_neighlist(self%handle, Cid, Creqid) + IF (idx < 0) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'neighbor list not found [Fortran/find_fix_neighlist]') + END IF + CALL lammps_free(Cid) + END FUNCTION lmp_find_fix_neighlist + + ! equivalent function to lammps_find_compute_neighlist + INTEGER(c_int) FUNCTION lmp_find_compute_neighlist(self, id, reqid) & + RESULT(idx) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: id + INTEGER(c_int), INTENT(IN), OPTIONAL :: reqid + TYPE(c_ptr) :: Cid + INTEGER(c_int) :: Creqid + + IF (PRESENT(reqid)) THEN + Creqid = reqid + ELSE + Creqid = 0_c_int + END IF + Cid = f2c_string(id) + idx = lammps_find_compute_neighlist(self%handle, Cid, Creqid) + IF (idx < 0) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'neighbor list not found [Fortran/find_compute_neighlist]') + END IF + CALL lammps_free(Cid) + END FUNCTION lmp_find_compute_neighlist + + INTEGER(c_int) FUNCTION lmp_neighlist_num_elements(self, idx) RESULT(inum) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int), INTENT(IN) :: idx + + inum = lammps_neighlist_num_elements(self%handle, idx) + IF (inum < 0) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'neighbor list not found [Fortran/neighlist_num_elements]') + END IF + END FUNCTION lmp_neighlist_num_elements + + SUBROUTINE lmp_neighlist_element_neighbors(self, idx, element, iatom, & + neighbors) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int), INTENT(IN) :: idx, element + INTEGER(c_int), INTENT(OUT) :: iatom + INTEGER(c_int), DIMENSION(:), POINTER, INTENT(OUT) :: neighbors + INTEGER(c_int) :: numneigh + TYPE(c_ptr) :: Cneighbors + + CALL lammps_neighlist_element_neighbors(self%handle, idx, element, iatom, & + numneigh, Cneighbors) + CALL C_F_POINTER(Cneighbors, neighbors, [numneigh]) + END SUBROUTINE lmp_neighlist_element_neighbors + + ! equivalent function to lammps_version + INTEGER FUNCTION lmp_version(self) + CLASS(lammps), INTENT(IN) :: self + + lmp_version = lammps_version(self%handle) + END FUNCTION lmp_version + + ! equivalent function to lammps_get_os_info + SUBROUTINE lmp_get_os_info(buffer) + CHARACTER(LEN=*) :: buffer + INTEGER(c_int) :: buf_size + CHARACTER(LEN=1, KIND=c_char), DIMENSION(LEN(buffer)+1), TARGET :: Cbuffer + TYPE(c_ptr) :: ptr + + buffer = '' + buf_size = LEN(buffer, KIND=c_int) + 1_c_int + ptr = C_LOC(Cbuffer(1)) + CALL lammps_get_os_info(ptr, INT(buf_size, KIND=c_int)) + buffer = array2string(Cbuffer) + END SUBROUTINE lmp_get_os_info + + ! equivalent function to lammps_config_has_mpi_support + LOGICAL FUNCTION lmp_config_has_mpi_support() + INTEGER(c_int) :: has_mpi_support + + has_mpi_support = lammps_config_has_mpi_support() + lmp_config_has_mpi_support = (has_mpi_support /= 0_c_int) + END FUNCTION lmp_config_has_mpi_support + + ! equivalent function to lammps_config_has_gzip_support + LOGICAL FUNCTION lmp_config_has_gzip_support() + INTEGER(c_int) :: has_gzip_support + + has_gzip_support = lammps_config_has_gzip_support() + lmp_config_has_gzip_support = (has_gzip_support /= 0_c_int) + END FUNCTION lmp_config_has_gzip_support + + ! equivalent function to lammps_config_has_png_support + LOGICAL FUNCTION lmp_config_has_png_support() + INTEGER(c_int) :: has_png_support + + has_png_support = lammps_config_has_png_support() + lmp_config_has_png_support = (has_png_support /= 0_c_int) + END FUNCTION lmp_config_has_png_support + + ! equivalent function to lammps_config_has_jpeg_support + LOGICAL FUNCTION lmp_config_has_jpeg_support() + INTEGER(c_int) :: has_jpeg_support + + has_jpeg_support = lammps_config_has_jpeg_support() + lmp_config_has_jpeg_support = (has_jpeg_support /= 0_c_int) + END FUNCTION lmp_config_has_jpeg_support + + ! equivalent function to lammps_config_has_ffmpeg_support + LOGICAL FUNCTION lmp_config_has_ffmpeg_support() + INTEGER(c_int) :: has_ffmpeg_support + + has_ffmpeg_support = lammps_config_has_ffmpeg_support() + lmp_config_has_ffmpeg_support = (has_ffmpeg_support /= 0_c_int) + END FUNCTION lmp_config_has_ffmpeg_support + + ! equivalent function to lammps_config_has_exceptions + LOGICAL FUNCTION lmp_config_has_exceptions() + INTEGER(c_int) :: has_exceptions + + has_exceptions = lammps_config_has_exceptions() + lmp_config_has_exceptions = (has_exceptions /= 0_c_int) + END FUNCTION lmp_config_has_exceptions + + ! equivalent function to lammps_config_has_package + LOGICAL FUNCTION lmp_config_has_package(name) + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int) :: has_package + TYPE(c_ptr) :: Cname + + Cname = f2c_string(name) + has_package = lammps_config_has_package(Cname) + lmp_config_has_package = (has_package /= 0_c_int) + CALL lammps_free(Cname) + END FUNCTION lmp_config_has_package + + ! equivalent subroutine to lammps_config_package_name + SUBROUTINE lmp_config_package_name(self, idx, buffer) + CLASS(lammps), INTENT(IN) :: self + INTEGER, INTENT(IN) :: idx + CHARACTER(LEN=*), INTENT(OUT) :: buffer + CHARACTER(LEN=1, KIND=c_char), DIMENSION(LEN(buffer)+1), TARGET :: Cbuffer + INTEGER(c_int) :: Cidx, Csuccess + TYPE(c_ptr) :: Cptr + + Cidx = idx - 1 + Cptr = C_LOC(Cbuffer(1)) + Csuccess = lammps_config_package_name(Cidx, Cptr, LEN(buffer)+1) + buffer = '' + IF (Csuccess /= 0_c_int) THEN + buffer = array2string(Cbuffer) + ELSE + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'failure of lammps_config_package_name [Fortran/config_package_name]') + END IF + END SUBROUTINE lmp_config_package_name + + ! equivalent function to Python routine lammps.installed_packages() + SUBROUTINE lmp_installed_packages(self, package, length) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=:), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: package + INTEGER, INTENT(IN), OPTIONAL :: length + INTEGER, PARAMETER :: MAX_BUFFER_LENGTH = 31 + INTEGER :: i, npackage, buf_length + + IF (PRESENT(length)) THEN + buf_length = length + ELSE + buf_length = MAX_BUFFER_LENGTH + END IF + + IF (ALLOCATED(package)) DEALLOCATE(package) + npackage = lammps_config_package_count() + ALLOCATE(CHARACTER(LEN=MAX_BUFFER_LENGTH) :: package(npackage)) + DO i=1, npackage + CALL lmp_config_package_name(self, i, package(i)) + END DO + END SUBROUTINE lmp_installed_packages + + ! equivalent function to lammps_config_accelerator + LOGICAL FUNCTION lmp_config_accelerator(package, category, setting) + CHARACTER(LEN=*), INTENT(IN) :: package, category, setting + TYPE(c_ptr) :: Cpackage, Ccategory, Csetting + INTEGER(c_int) :: is_configured + + Cpackage = f2c_string(package) + Ccategory = f2c_string(category) + Csetting = f2c_string(setting) + is_configured = lammps_config_accelerator(Cpackage, Ccategory, Csetting) + CALL lammps_free(Cpackage) + CALL lammps_free(Ccategory) + CALL lammps_free(Csetting) + lmp_config_accelerator = (is_configured /= 0_c_int) + END FUNCTION lmp_config_accelerator + + ! equivalent function to lammps_has_gpu_device + LOGICAL FUNCTION lmp_has_gpu_device() + lmp_has_gpu_device = (lammps_has_gpu_device() /= 0_c_int) + END FUNCTION lmp_has_gpu_device + + ! equivalent subroutine to lammps_get_gpu_device_info + SUBROUTINE lmp_get_gpu_device_info(buffer) + CHARACTER(LEN=*), INTENT(OUT) :: buffer + INTEGER(c_int) :: buf_size + CHARACTER(LEN=1, KIND=c_char), DIMENSION(LEN(buffer)+1), TARGET :: Cbuffer + TYPE(c_ptr) :: Cptr + + buffer = '' + buf_size = LEN(buffer) + 1 + Cptr = C_LOC(Cbuffer) + CALL lammps_get_gpu_device_info(Cptr, buf_size) + buffer = array2string(Cbuffer) + END SUBROUTINE lmp_get_gpu_device_info + + ! equivalent function to lammps_has_style + LOGICAL FUNCTION lmp_has_style(self, category, name) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: category, name + TYPE(c_ptr) :: Ccategory, Cname + INTEGER(c_int) :: has_style + + Ccategory = f2c_string(category) + Cname = f2c_string(name) + has_style = lammps_has_style(self%handle, Ccategory, Cname) + CALL lammps_free(Ccategory) + CALL lammps_free(Cname) + lmp_has_style = (has_style /= 0_c_int) + END FUNCTION + + ! equivalent function to lammps_style_count + INTEGER(c_int) FUNCTION lmp_style_count(self, category) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: category + TYPE(c_ptr) :: Ccategory + + Ccategory = f2c_string(category) + lmp_style_count = lammps_style_count(self%handle, Ccategory) + CALL lammps_free(Ccategory) + END FUNCTION lmp_style_count + + ! equivalent function to lammps_style_name + SUBROUTINE lmp_style_name(self, category, idx, buffer) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: category + INTEGER(c_int), INTENT(IN) :: idx + CHARACTER(LEN=*), INTENT(OUT) :: buffer + INTEGER(c_int) :: buf_size, success + CHARACTER(LEN=1, KIND=c_char), DIMENSION(LEN(buffer)+1), TARGET :: Cbuffer + TYPE(c_ptr) :: Ccategory, Cptr + + buffer = '' + buf_size = LEN(buffer, KIND=c_int) + 1_c_int + Ccategory = f2c_string(category) + Cptr = C_LOC(Cbuffer) + success = lammps_style_name(self%handle, Ccategory, idx - 1, Cptr, buf_size) + IF (success == 1_c_int) THEN + buffer = array2string(Cbuffer) + ELSE + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'idx value not in range [Fortran/style_name]') + END IF + CALL lammps_free(Ccategory) + END SUBROUTINE lmp_style_name + + ! equivalent function to lammps_has_id + LOGICAL FUNCTION lmp_has_id(self, category, name) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: category, name + TYPE(c_ptr) :: Ccategory, Cname + INTEGER(c_int) :: has_id + + Ccategory = f2c_string(category) + Cname = f2c_string(name) + has_id = lammps_has_id(self%handle, Ccategory, Cname) + CALL lammps_free(Ccategory) + CALL lammps_free(Cname) + lmp_has_id = (has_id /= 0_c_int) + END FUNCTION lmp_has_id + + ! equivalent function to lammps_id_count + INTEGER(c_int) FUNCTION lmp_id_count(self, category) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: category + TYPE(c_ptr) :: Ccategory + + Ccategory = f2c_string(category) + lmp_id_count = lammps_id_count(self%handle, Ccategory) + CALL lammps_free(Ccategory) + END FUNCTION lmp_id_count + + ! equivalent function to lammps_id_name + SUBROUTINE lmp_id_name(self, category, idx, buffer) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: category + INTEGER(c_int), INTENT(IN) :: idx + CHARACTER(LEN=*), INTENT(OUT) :: buffer + INTEGER(c_int) :: success + INTEGER(c_int) :: buf_size + TYPE(c_ptr) :: Ccategory, Cptr + CHARACTER(LEN=1, KIND=c_char), DIMENSION(LEN(buffer)+1), TARGET :: Cbuffer + + buffer = '' + Ccategory = f2c_string(category) + buf_size = LEN(buffer, KIND=c_int) + Cptr = C_LOC(Cbuffer(1)) + success = lammps_id_name(self%handle, Ccategory, idx - 1, Cptr, buf_size) + IF (success /= 0) THEN + buffer = array2string(Cbuffer) + ELSE + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'lammps_id_name failed [Fortran/id_name]') + END IF + CALL lammps_free(Ccategory) + END SUBROUTINE lmp_id_name + + ! equivalent function to lammps_plugin_name + SUBROUTINE lmp_plugin_name(self, idx, stylebuf, namebuf) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int), INTENT(IN) :: idx + CHARACTER(LEN=*), INTENT(OUT) :: stylebuf, namebuf + INTEGER(c_int) :: buf_size, success + TYPE(c_ptr) :: Cstylebuf, Cnamebuf + + buf_size = MIN(LEN(stylebuf, KIND=c_int), LEN(namebuf, KIND=c_int)) + Cstylebuf = lammps_malloc(INT(buf_size, KIND=c_size_t)) + Cnamebuf = lammps_malloc(INT(buf_size, KIND=c_size_t)) + success = lammps_plugin_name(idx - 1, Cstylebuf, Cnamebuf, buf_size) + IF (success /= 0_c_int) THEN + stylebuf = c2f_string(Cstylebuf) + namebuf = c2f_string(Cnamebuf) + ELSE + stylebuf = '' + namebuf = '' + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'call to lammps_plugin_name failed [Fortran/plugin_name]') + END IF + CALL lammps_free(Cstylebuf) + CALL lammps_free(Cnamebuf) + END SUBROUTINE lmp_plugin_name + + ! equivalent function to lammps_encode_image_flags + FUNCTION lmp_encode_image_flags(self, ix, iy, iz) RESULT (image) + CLASS(lammps), INTENT(IN), TARGET :: self + INTEGER(c_int), INTENT(IN) :: ix, iy, iz + TYPE(lammps_image_data) :: image + INTEGER(c_int) :: imageint_size + INTEGER(c_int) :: IMGMAX, IMGMASK, IMGBITS, IMG2BITS + INTEGER(c_int64_t) :: ibx, iby, ibz, BIMGMAX, BIMGMASK, BIMGBITS, BIMG2BITS + + image%lammps_instance => self + IMGMASK = lmp_extract_setting(self, 'IMGMASK') + IMGMAX = lmp_extract_setting(self, 'IMGMAX') + IMGBITS = lmp_extract_setting(self, 'IMGBITS') + IMG2BITS = lmp_extract_setting(self, 'IMG2BITS') + imageint_size = lmp_extract_setting(self, 'imageint') + IF (imageint_size == 4_c_int) THEN + image%datatype = DATA_INT + image%i32 = IOR( IOR(IAND(ix + IMGMAX, IMGMASK), & + ISHFT(IAND(iy + IMGMAX, IMGMASK), IMGBITS)), & + ISHFT(IAND(iz + IMGMAX, IMGMASK), IMG2BITS) ) + ELSE + image%datatype = DATA_INT64 + ibx = ix + iby = iy + ibz = iz + BIMGMAX = IMGMAX + BIMGMASK = IMGMASK + BIMGBITS = IMGBITS + BIMG2BITS = IMG2BITS + image%i64 = IOR( IOR(IAND(ibx + BIMGMAX, BIMGMASK), & + ISHFT(IAND(iby + BIMGMAX, BIMGMASK), BIMGBITS)), & + ISHFT(IAND(ibz + BIMGMAX, BIMGMASK), BIMG2BITS) ) + END IF + END FUNCTION lmp_encode_image_flags + + ! equivalent function to lammps_decode_image_flags + SUBROUTINE lmp_decode_image_flags(self, image, flags) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int), INTENT(IN) :: image + INTEGER(c_int), DIMENSION(3), TARGET, INTENT(OUT) :: flags + INTEGER(c_int) :: size_imageint + INTEGER(c_int) :: IMGMASK, IMGMAX, IMGBITS, IMG2BITS + + size_imageint = lmp_extract_setting(self, 'imageint') + IF (size_imageint == 4_c_int) THEN + IMGMASK = lmp_extract_setting(self, 'IMGMASK') + IMGMAX = lmp_extract_setting(self, 'IMGMAX') + IMGBITS = lmp_extract_setting(self, 'IMGBITS') + IMG2BITS = lmp_extract_setting(self, 'IMG2BITS') + flags(1) = IAND(image, IMGMASK) - IMGMAX + flags(2) = IAND(ISHFT(image, -IMGBITS), IMGMASK) - IMGMAX + flags(3) = ISHFT(image, -IMG2BITS) - IMGMAX + ELSE + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'Incorrect& + & integer kind passed as "image" [Fortran/decode_image_flags]') + END IF + END SUBROUTINE lmp_decode_image_flags + + ! equivalent function to lammps_decode_image_flags if -DLAMMPS_BIGBIG is used + SUBROUTINE lmp_decode_image_flags_bigbig(self, image, flags) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int64_t), INTENT(IN) :: image + INTEGER(c_int), DIMENSION(3), TARGET, INTENT(OUT) :: flags + INTEGER(c_int) :: size_imageint + INTEGER(c_int) :: IMGMASK, IMGMAX, IMGBITS, IMG2BITS + INTEGER(c_int64_t) :: BIMGMASK, BIMGMAX, BIMGBITS, BIMG2BITS + + size_imageint = lmp_extract_setting(self, 'imageint') + IF (size_imageint == 8_c_int) THEN + IMGMASK = lmp_extract_setting(self, 'IMGMASK') + IMGMAX = lmp_extract_setting(self, 'IMGMAX') + IMGBITS = lmp_extract_setting(self, 'IMGBITS') + IMG2BITS = lmp_extract_setting(self, 'IMG2BITS') + BIMGMASK = IMGMASK + BIMGMAX = IMGMAX + BIMGBITS = IMGBITS + BIMG2BITS = IMG2BITS + flags(1) = INT(IAND(image, BIMGMASK) - BIMGMAX, KIND=c_int) + flags(2) = INT(IAND(ISHFT(image, -BIMGBITS), BIMGMASK) - BIMGMAX, & + KIND=c_int) + flags(3) = INT(ISHFT(image, -BIMG2BITS) - BIMGMAX, KIND=c_int) + ELSE + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'Incorrect& + & integer kind passed as "image" [Fortran/decode_image_flags]') + END IF + END SUBROUTINE lmp_decode_image_flags_bigbig + + ! equivalent function to lammps_flush_buffers + SUBROUTINE lmp_flush_buffers(self) + CLASS(lammps), INTENT(IN) :: self + + CALL lammps_flush_buffers(self%handle) + END SUBROUTINE lmp_flush_buffers + + ! equivalent function to lammps_is_running + LOGICAL FUNCTION lmp_is_running(self) + CLASS(lammps), INTENT(IN) :: self + + lmp_is_running = (lammps_is_running(self%handle) /= 0_c_int) + END FUNCTION lmp_is_running + + ! equivalent function to lammps_force_timeout + SUBROUTINE lmp_force_timeout(self) + CLASS(lammps), INTENT(IN) :: self + + CALL lammps_force_timeout(self%handle) + END SUBROUTINE + + ! equivalent function to lammps_has_error + LOGICAL FUNCTION lmp_has_error(self) + CLASS(lammps), INTENT(IN) :: self + INTEGER(c_int) :: has_error + + has_error = lammps_has_error(self%handle) + lmp_has_error = (has_error /= 0_c_int) + END FUNCTION lmp_has_error + + ! equivalent function to lammps_get_last_error_message + SUBROUTINE lmp_get_last_error_message(self, buffer, status) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(OUT) :: buffer + INTEGER, INTENT(OUT), OPTIONAL :: status + INTEGER(c_int) :: buflen, Cstatus + CHARACTER(LEN=1, KIND=c_char), DIMENSION(LEN(buffer)+1), TARGET :: Cbuffer + TYPE(c_ptr) :: Cptr + + buffer = '' + IF (lmp_has_error(self)) THEN + buflen = LEN(buffer, KIND=c_int) + 1_c_int + Cptr = C_LOC(Cbuffer(1)) + Cstatus = lammps_get_last_error_message(self%handle, Cptr, buflen) + buffer = array2string(Cbuffer) + IF (PRESENT(status)) THEN + status = Cstatus + END IF + ELSE + buffer = '' + IF (PRESENT(status)) THEN + status = 0 + END IF + END IF + END SUBROUTINE lmp_get_last_error_message + + ! ---------------------------------------------------------------------- + ! functions to assign user-space pointers to LAMMPS data + ! ---------------------------------------------------------------------- + SUBROUTINE assign_int_to_lammps_data(lhs, rhs) + INTEGER(c_int), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_INT) THEN + lhs => rhs%i32 + ELSE + CALL assignment_error(rhs, 'scalar int') + END IF + END SUBROUTINE assign_int_to_lammps_data + + SUBROUTINE assign_int64_to_lammps_data(lhs, rhs) + INTEGER(c_int64_t), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_INT64) THEN + lhs => rhs%i64 + ELSE + CALL assignment_error(rhs, 'scalar long int') + END IF + END SUBROUTINE assign_int64_to_lammps_data + + SUBROUTINE assign_intvec_to_lammps_data(lhs, rhs) + INTEGER(c_int), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_INT_1D) THEN + lhs => rhs%i32_vec + ELSE + CALL assignment_error(rhs, 'vector of ints') + END IF + END SUBROUTINE assign_intvec_to_lammps_data + + SUBROUTINE assign_int64vec_to_lammps_data(lhs, rhs) + INTEGER(c_int64_t), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_INT64_1D) THEN + lhs => rhs%i64_vec + ELSE + CALL assignment_error(rhs, 'vector of long ints') + END IF + END SUBROUTINE assign_int64vec_to_lammps_data + + SUBROUTINE assign_double_to_lammps_data(lhs, rhs) + REAL(c_double), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_DOUBLE) THEN + lhs => rhs%r64 + ELSE + CALL assignment_error(rhs, 'scalar double') + END IF + END SUBROUTINE assign_double_to_lammps_data + + SUBROUTINE assign_doublevec_to_lammps_data(lhs, rhs) + REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_DOUBLE_1D) THEN + lhs => rhs%r64_vec + ELSE + CALL assignment_error(rhs, 'vector of doubles') + END IF + END SUBROUTINE assign_doublevec_to_lammps_data + + SUBROUTINE assign_doublemat_to_lammps_data(lhs, rhs) + REAL(c_double), DIMENSION(:,:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_DOUBLE_2D) THEN + lhs => rhs%r64_mat + ELSE + CALL assignment_error(rhs, 'matrix of doubles') + END IF + END SUBROUTINE assign_doublemat_to_lammps_data + + SUBROUTINE assign_string_to_lammps_data(lhs, rhs) + CHARACTER(LEN=*), INTENT(OUT) :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_STRING) THEN + lhs = rhs%str + IF (LEN_TRIM(rhs%str) > LEN(lhs)) THEN + CALL lmp_error(rhs%lammps_instance, LMP_ERROR_WARNING, & + 'String provided by user required truncation [Fortran API]') + END IF + ELSE + CALL assignment_error(rhs, 'string') + END IF + END SUBROUTINE assign_string_to_lammps_data + + ! ---------------------------------------------------------------------- + ! functions to assign user-space pointers to LAMMPS *fix* data + ! ---------------------------------------------------------------------- + SUBROUTINE assign_double_to_lammps_fix_data(lhs, rhs) + REAL(c_double), INTENT(OUT) :: lhs + CLASS(lammps_fix_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_DOUBLE) THEN + lhs = rhs%r64 + ELSE + CALL assignment_error(rhs, 'scalar double') + END IF + END SUBROUTINE assign_double_to_lammps_fix_data + + SUBROUTINE assign_doublevec_to_lammps_fix_data(lhs, rhs) + REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_fix_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_DOUBLE_1D) THEN + lhs => rhs%r64_vec + ELSE + CALL assignment_error(rhs, 'vector of doubles') + END IF + END SUBROUTINE assign_doublevec_to_lammps_fix_data + + SUBROUTINE assign_doublemat_to_lammps_fix_data(lhs, rhs) + REAL(c_double), DIMENSION(:,:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_fix_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_DOUBLE_2D) THEN + lhs => rhs%r64_mat + ELSE + CALL assignment_error(rhs, 'matrix of doubles') + END IF + END SUBROUTINE assign_doublemat_to_lammps_fix_data + + ! ---------------------------------------------------------------------- + ! functions to assign user-space pointers to LAMMPS *variable* data + ! ---------------------------------------------------------------------- + SUBROUTINE assign_double_to_lammps_variable_data(lhs, rhs) + REAL(c_double), INTENT(OUT) :: lhs + CLASS(lammps_variable_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_DOUBLE) THEN + lhs = rhs%r64 + ELSE + CALL assignment_error(rhs, 'scalar double') + END IF + END SUBROUTINE assign_double_to_lammps_variable_data + + SUBROUTINE assign_doublevec_to_lammps_variable_data(lhs, rhs) + REAL(c_double), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: lhs + CLASS(lammps_variable_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_DOUBLE_1D) THEN + IF (ALLOCATED(lhs)) DEALLOCATE(lhs) + ALLOCATE(lhs(SIZE(rhs%r64_vec))) + lhs = rhs%r64_vec + ELSE + CALL assignment_error(rhs, 'vector of doubles') + END IF + END SUBROUTINE assign_doublevec_to_lammps_variable_data + + SUBROUTINE assign_string_to_lammps_variable_data(lhs, rhs) + CHARACTER(LEN=*), INTENT(OUT) :: lhs + CLASS(lammps_variable_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_STRING) THEN + lhs = rhs%str + IF (LEN_TRIM(rhs%str) > LEN(lhs)) THEN + CALL lmp_error(rhs%lammps_instance, LMP_ERROR_WARNING, & + 'String provided by user required truncation [Fortran API]') + END IF + ELSE + CALL assignment_error(rhs, 'string') + END IF + END SUBROUTINE assign_string_to_lammps_variable_data + + SUBROUTINE assign_int_to_lammps_image_data(lhs, rhs) + INTEGER(c_int), INTENT(OUT) :: lhs + CLASS(lammps_image_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_INT) THEN + lhs = rhs%i32 + ELSE + CALL assignment_error(rhs, 'scalar int') + END IF + END SUBROUTINE assign_int_to_lammps_image_data + + SUBROUTINE assign_int64_to_lammps_image_data(lhs, rhs) + INTEGER(c_int64_t), INTENT(OUT) :: lhs + CLASS(lammps_image_data), INTENT(IN) :: rhs + + IF (rhs%datatype == DATA_INT64) THEN + lhs = rhs%i64 + ELSE + CALL assignment_error(rhs, 'scalar long int') + END IF + END SUBROUTINE assign_int64_to_lammps_image_data + + ! ---------------------------------------------------------------------- + ! Generic function to catch all errors in assignments of LAMMPS data to + ! user-space variables/pointers + ! ---------------------------------------------------------------------- + SUBROUTINE assignment_error(type1, str2) + CLASS(lammps_data_baseclass), INTENT(IN) :: type1 + CHARACTER(LEN=*), INTENT(IN) :: str2 + CHARACTER(LEN=:), ALLOCATABLE :: str1 + + SELECT CASE(type1%datatype) + CASE(DATA_INT) + str1 = 'scalar int' + CASE(DATA_INT_1D) + str1 = 'vector of ints' + CASE(DATA_INT_2D) + str1 = 'matrix of ints' + CASE(DATA_INT64) + str1 = 'scalar long int' + CASE(DATA_INT64_1D) + str1 = 'vector of long ints' + CASE(DATA_INT64_2D) + str1 = 'matrix of long ints' + CASE(DATA_DOUBLE) + str1 = 'scalar double' + CASE(DATA_DOUBLE_1D) + str1 = 'vector of doubles' + CASE(DATA_DOUBLE_2D) + str1 = 'matrix of doubles' + CASE(DATA_STRING) + str1 = 'string' + CASE DEFAULT + str1 = 'that type' + END SELECT + CALL lmp_error(type1%lammps_instance, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'cannot associate ' // str1 // ' with ' // str2 // ' [Fortran API]') + END SUBROUTINE assignment_error + ! ---------------------------------------------------------------------- ! local helper functions ! copy fortran string to zero terminated c string ! ---------------------------------------------------------------------- FUNCTION f2c_string(f_string) RESULT(ptr) - CHARACTER (len=*), INTENT(in) :: f_string - CHARACTER (len=1, kind=c_char), POINTER :: c_string(:) + CHARACTER(LEN=*), INTENT(IN) :: f_string + CHARACTER(LEN=1, KIND=c_char), POINTER :: c_string(:) TYPE(c_ptr) :: ptr INTEGER(c_size_t) :: i, n @@ -278,4 +2632,46 @@ CONTAINS END DO c_string(n+1) = c_null_char END FUNCTION f2c_string + + ! copy null-terminated C string to fortran string + FUNCTION c2f_string(ptr) RESULT(f_string) + TYPE(c_ptr), INTENT(IN) :: ptr + CHARACTER(LEN=:), ALLOCATABLE :: f_string + CHARACTER(LEN=1, KIND=c_char), DIMENSION(:), POINTER :: c_string + INTEGER :: n + + IF (.NOT. C_ASSOCIATED(ptr)) THEN + f_string = '' + ELSE + n = INT(c_strlen(ptr), KIND=KIND(n)) + CALL C_F_POINTER(ptr, c_string, [n+1]) + f_string = array2string(c_string, n) + END IF + END FUNCTION c2f_string + + ! Copy a known-length or null-terminated array of C characters into a string + FUNCTION array2string(array, length) RESULT(string) + CHARACTER(LEN=1, KIND=c_char), DIMENSION(:) :: array +! NOTE: giving "length" the VALUE attribute reveals a bug in gfortran 12.2.1 +! https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107441 + INTEGER, INTENT(IN), OPTIONAL :: length + CHARACTER(LEN=:), ALLOCATABLE :: string + INTEGER :: n, i + + IF (PRESENT(length)) THEN + n = length + ELSE + n = 1 + DO WHILE (n < SIZE(array) .AND. array(n+1) /= c_null_char) + n = n + 1 + END DO + END IF + ALLOCATE(CHARACTER(LEN=n) :: string) + DO i = 1, n + string(i:i) = array(i) + END DO + END FUNCTION array2string + END MODULE LIBLAMMPS + +! vim: ts=2 sts=2 sw=2 et diff --git a/lib/electrode/Makefile.serial b/lib/electrode/Makefile.serial index 8bdd02bae3..0bcc22a58a 100644 --- a/lib/electrode/Makefile.serial +++ b/lib/electrode/Makefile.serial @@ -11,7 +11,7 @@ OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ -# include any MPI settings needed for the ATC library to build with +# include any MPI settings needed for the electrode library to build with # the same MPI library that LAMMPS is built with CC = g++ diff --git a/lib/gpu/Makefile.oneapi b/lib/gpu/Makefile.oneapi index 015ab47057..d0ed78d0c4 100644 --- a/lib/gpu/Makefile.oneapi +++ b/lib/gpu/Makefile.oneapi @@ -1,5 +1,5 @@ -# /* ---------------------------------------------------------------------- -# Generic Linux Makefile for OpenCL +# /* ---------------------------------------------------------------------- +# Linux Makefile for Intel oneAPI - Mixed precision # ------------------------------------------------------------------------- */ # which file will be copied to Makefile.lammps @@ -11,11 +11,14 @@ EXTRAMAKE = Makefile.lammps.opencl LMP_INC = -DLAMMPS_SMALLBIG -OCL_INC = -OCL_CPP = mpiicpc -std=c++11 -xHost -O2 -qopenmp -qopenmp-simd -DMPICH_IGNORE_CXX_SEEK $(LMP_INC) $(OCL_INC) -OCL_LINK = -lOpenCL +OCL_INC = -I$(ONEAPI_ROOT)/compiler/latest/linux/include/sycl/ +CPP_OPT = -xHost -O2 -qopenmp -qopenmp-simd -fp-model fast=2 -no-prec-div \ + -qoverride-limits +OCL_CPP = mpiicpc -std=c++11 -diag-disable=10441 -DMPICH_IGNORE_CXX_SEEK \ + $(LMP_INC) $(OCL_INC) $(CPP_OPT) +OCL_LINK = -L$(ONEAPI_ROOT)/compiler/latest/linux/lib -lOpenCL OCL_PREC = -D_SINGLE_DOUBLE -OCL_TUNE = -DMPI_GERYON -DGERYON_NUMA_FISSION -DUCL_NO_EXIT -fp-model fast=2 -no-prec-div +OCL_TUNE = -DMPI_GERYON -DCUDA_PROXY -DGERYON_NUMA_FISSION -DUCL_NO_EXIT BIN_DIR = ./ OBJ_DIR = ./ diff --git a/lib/gpu/README b/lib/gpu/README index 100179feca..79397a7066 100644 --- a/lib/gpu/README +++ b/lib/gpu/README @@ -264,6 +264,20 @@ GERYON_KERNEL_DUMP Dump all compiled OpenCL programs with compiler flags and build logs GPU_CAST Casting performed on GPU, untested recently THREE_CONCURRENT Concurrent 3-body calcs in separate queues, untested +LAL_SERIALIZE_INIT Force serialization of initialization and compilation + for multiple MPI tasks sharing the same accelerator. + Some accelerator API implementations have had issues + with temporary file conflicts in the past. +GERYON_FORCE_SHARED_MAIN_MEM_ON Should only be used for builds where the + accelerator is guaranteed to share physical + main memory with the host (e.g. integrated + GPU or CPU device). Default behavior is to + auto-detect. Impacts OpenCL only. +GERYON_FORCE_SHARED_MAIN_MEM_OFF Should only be used for builds where the + accelerator is guaranteed to have discrete + physical main memory vs the host (discrete + GPU card). Default behavior is to + auto-detect. Impacts OpenCL only. ------------------------------------------------------------------------------ diff --git a/lib/gpu/geryon/hip_device.h b/lib/gpu/geryon/hip_device.h index f809323ee7..6692078629 100644 --- a/lib/gpu/geryon/hip_device.h +++ b/lib/gpu/geryon/hip_device.h @@ -81,6 +81,10 @@ class UCL_Device { /// Return the number of devices that support CUDA inline int num_devices() { return _properties.size(); } + /// Specify whether profiling (device timers) will be used for the device (yes=true) + /** No-op for CUDA and HIP **/ + inline void configure_profiling(const bool profiling_on) {} + /// Set the CUDA device to the specified device number /** A context and default command queue will be created for the device * Returns UCL_SUCCESS if successful or UCL_ERROR if the device could not diff --git a/lib/gpu/geryon/nvd_device.h b/lib/gpu/geryon/nvd_device.h index 5e2444b4d1..1b2e5b8c77 100644 --- a/lib/gpu/geryon/nvd_device.h +++ b/lib/gpu/geryon/nvd_device.h @@ -95,6 +95,10 @@ class UCL_Device { /// Return the number of devices that support CUDA inline int num_devices() { return _properties.size(); } + /// Specify whether profiling (device timers) will be used for the device (yes=true) + /** No-op for CUDA and HIP **/ + inline void configure_profiling(const bool profiling_on) {} + /// Set the CUDA device to the specified device number /** A context and default command queue will be created for the device * Returns UCL_SUCCESS if successful or UCL_ERROR if the device could not @@ -305,9 +309,9 @@ class UCL_Device { /// For compatability with OCL API inline int auto_set_platform(const enum UCL_DEVICE_TYPE type=UCL_GPU, - const std::string vendor="", - const int ndevices=-1, - const int first_device=-1) + const std::string vendor="", + const int ndevices=-1, + const int first_device=-1) { return set_platform(0); } private: diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h index 092b4ad11b..4163d40881 100644 --- a/lib/gpu/geryon/ocl_device.h +++ b/lib/gpu/geryon/ocl_device.h @@ -99,6 +99,7 @@ struct OCLProperties { int cl_device_version; bool has_subgroup_support; bool has_shuffle_support; + bool shared_main_memory; }; /// Class for looking at data parallel device properties @@ -125,6 +126,14 @@ class UCL_Device { /// Return the number of devices that support OpenCL inline int num_devices() { return _num_devices; } + /// Specify whether profiling (device timers) will be used (yes=true) + /** No-op for CUDA and HIP **/ + inline void configure_profiling(const bool profiling_on) { + #ifndef GERYON_NO_OCL_MARKERS + _cq_profiling = profiling_on; + #endif + } + /// Set the OpenCL device to the specified device number /** A context and default command queue will be created for the device * * Returns UCL_SUCCESS if successful or UCL_ERROR if the device could not @@ -169,10 +178,22 @@ class UCL_Device { _cq.push_back(cl_command_queue()); #ifdef CL_VERSION_2_0 - cl_queue_properties props[] = {CL_QUEUE_PROPERTIES, CL_QUEUE_PROFILING_ENABLE, 0}; - _cq.back()=clCreateCommandQueueWithProperties(_context, _cl_device, props, &errorv); + if (_cq_profiling) { + cl_queue_properties props[] = {CL_QUEUE_PROPERTIES, + CL_QUEUE_PROFILING_ENABLE, 0}; + _cq.back()=clCreateCommandQueueWithProperties(_context, _cl_device, props, + &errorv); + } else { + cl_queue_properties props[] = {0}; + _cq.back()=clCreateCommandQueueWithProperties(_context, _cl_device, props, + &errorv); + } #else - _cq.back()=clCreateCommandQueue(_context, _cl_device, CL_QUEUE_PROFILING_ENABLE, &errorv); + if (_cq_profiling) + _cq.back()=clCreateCommandQueue(_context, _cl_device, + CL_QUEUE_PROFILING_ENABLE, &errorv); + else + _cq.back()=clCreateCommandQueue(_context, _cl_device, 0, &errorv); #endif if (errorv!=CL_SUCCESS) { std::cerr << "Could not create command queue on device: " << name() @@ -209,7 +230,7 @@ class UCL_Device { inline bool shared_memory() { return shared_memory(_device); } /// Returns true if host memory is efficiently addressable from device inline bool shared_memory(const int i) - { return _shared_mem_device(_cl_devices[i]); } + { return _properties[i].shared_main_memory; } /// Returns preferred vector width inline int preferred_fp32_width() { return preferred_fp32_width(_device); } @@ -370,6 +391,7 @@ class UCL_Device { cl_platform_id _cl_platforms[20]; // OpenCL IDs for all platforms cl_context _context; // Context used for accessing the device std::vector _cq;// The default command queue for this device + bool _cq_profiling; // True=create command queues w/ profiling support int _device; // UCL_Device ID for current device cl_device_id _cl_device; // OpenCL ID for current device std::vector _cl_devices; // OpenCL IDs for all devices @@ -384,6 +406,11 @@ class UCL_Device { // Grabs the properties for all devices UCL_Device::UCL_Device() { _device=-1; + #ifndef GERYON_NO_OCL_MARKERS + _cq_profiling=true; + #else + _cq_profiling=false; + #endif // --- Get Number of Platforms cl_uint nplatforms; @@ -462,6 +489,7 @@ int UCL_Device::set_platform(int pid) { _num_devices = 0; for (int i=0; i 1) { - 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 (cl_uint j=0; j 1) { + subdevice_list = new cl_device_id[num_subdevices]; + err = clCreateSubDevices(device_list[i], props, num_subdevices, + subdevice_list, &num_subdevices); + if (err != CL_SUCCESS) { + delete[] subdevice_list; + num_subdevices = 1; + subdevice_list = device_list + i; } - delete[] subdevice_list; - } else { - _cl_devices.push_back(device_list[i]); - add_properties(device_list[i]); - _num_devices++; } #endif + + for (cl_uint j=0; j 1) delete[] subdevice_list; } // for i #endif @@ -504,9 +536,9 @@ int UCL_Device::create_context() { cl_int errorv; cl_context_properties props[3]; props[0]=CL_CONTEXT_PLATFORM; - props[1]=_platform; + props[1]=(cl_context_properties)_cl_platform; props[2]=0; - _context=clCreateContext(0,1,&_cl_device,nullptr,nullptr,&errorv); + _context=clCreateContext(props,1,&_cl_device,nullptr,nullptr,&errorv); if (errorv!=CL_SUCCESS) { #ifndef UCL_NO_EXIT std::cerr << "UCL Error: Could not access accelerator number " << _device @@ -563,8 +595,9 @@ void UCL_Device::add_properties(cl_device_id device_list) { op.preferred_vector_width64=double_width; // Determine if double precision is supported: All bits in the mask must be set. - cl_device_fp_config double_mask = (CL_FP_FMA|CL_FP_ROUND_TO_NEAREST|CL_FP_ROUND_TO_ZERO| - CL_FP_ROUND_TO_INF|CL_FP_INF_NAN|CL_FP_DENORM); + cl_device_fp_config double_mask = (CL_FP_FMA|CL_FP_ROUND_TO_NEAREST| + CL_FP_ROUND_TO_ZERO|CL_FP_ROUND_TO_INF| + CL_FP_INF_NAN|CL_FP_DENORM); cl_device_fp_config double_avail; CL_SAFE_CALL(clGetDeviceInfo(device_list,CL_DEVICE_DOUBLE_FP_CONFIG, sizeof(double_avail),&double_avail,nullptr)); @@ -668,6 +701,7 @@ void UCL_Device::add_properties(cl_device_id device_list) { } delete[] buffer2; #endif + op.shared_main_memory=_shared_mem_device(device_list); _properties.push_back(op); } diff --git a/lib/gpu/geryon/ocl_memory.h b/lib/gpu/geryon/ocl_memory.h index adf7b6c952..bfc260889a 100644 --- a/lib/gpu/geryon/ocl_memory.h +++ b/lib/gpu/geryon/ocl_memory.h @@ -118,15 +118,19 @@ inline int _host_alloc(mat_type &mat, copy_type &cm, const size_t n, template inline int _host_view(mat_type &mat, copy_type &cm, const size_t o, const size_t n) { - cl_int error_flag; - cl_buffer_region subbuffer; - subbuffer.origin = o; - subbuffer.size = n; - mat.cbegin()=clCreateSubBuffer(cm.cbegin(), 0, - CL_BUFFER_CREATE_TYPE_REGION, &subbuffer, - &error_flag); - - CL_CHECK_ERR(error_flag); + // When viewing outside host allocation with discrete main memory on accelerator, + // no cl_buffer object is created to avoid unnecessary creation of device allocs + if (cm.shared_mem_device()) { + cl_int error_flag; + cl_buffer_region subbuffer; + subbuffer.origin = o; + subbuffer.size = n; + mat.cbegin()=clCreateSubBuffer(cm.cbegin(), 0, + CL_BUFFER_CREATE_TYPE_REGION, &subbuffer, + &error_flag); + CL_CHECK_ERR(error_flag); + } else + mat.cbegin()=(cl_mem)0; CL_SAFE_CALL(clRetainCommandQueue(mat.cq())); return UCL_SUCCESS; } @@ -170,10 +174,13 @@ inline int _host_alloc(mat_type &mat, UCL_Device &dev, const size_t n, template inline int _host_view(mat_type &mat, UCL_Device &dev, const size_t n) { - cl_int error_flag; - mat.cbegin()=clCreateBuffer(dev.context(), CL_MEM_USE_HOST_PTR, - n,*mat.host_ptr(),&error_flag); - CL_CHECK_ERR(error_flag); + if (mat.shared_mem_device()) { + cl_int error_flag; + mat.cbegin()=clCreateBuffer(dev.context(), CL_MEM_USE_HOST_PTR, + n,*mat.host_ptr(),&error_flag); + CL_CHECK_ERR(error_flag); + } else + mat.cbegin()=(cl_mem)0; CL_SAFE_CALL(clRetainCommandQueue(mat.cq())); return UCL_SUCCESS; } @@ -181,7 +188,10 @@ inline int _host_view(mat_type &mat, UCL_Device &dev, const size_t n) { template inline void _host_free(mat_type &mat) { if (mat.cols()>0) { - CL_DESTRUCT_CALL(clReleaseMemObject(mat.cbegin())); + // When viewing outside host allocation with discrete main memory on accelerator, + // no cl_buffer object is created to avoid unnecessary creation of device allocs + if (mat.cbegin()!=(cl_mem)(0)) + CL_DESTRUCT_CALL(clReleaseMemObject(mat.cbegin())); CL_DESTRUCT_CALL(clReleaseCommandQueue(mat.cq())); } } diff --git a/lib/gpu/geryon/ocl_texture.h b/lib/gpu/geryon/ocl_texture.h index 43de4b258c..8ddde5b2a3 100644 --- a/lib/gpu/geryon/ocl_texture.h +++ b/lib/gpu/geryon/ocl_texture.h @@ -76,7 +76,7 @@ class UCL_Const { /// Copy from array on host to const memory template inline void update_device(UCL_H_Vec &src, const int numel) { - const int bytes=numel*sizeof(numtyp); + const size_t bytes=numel*sizeof(numtyp); if (_global_bytes < bytes) { if (_global_bytes) CL_SAFE_CALL(clReleaseMemObject(_global)); cl_int e; @@ -84,7 +84,7 @@ class UCL_Const { CL_SAFE_CALL(e); } CL_SAFE_CALL(clEnqueueWriteBuffer(_cq, _global, CL_FALSE, 0, bytes, - (void *)src.begin(), 0, NULL, NULL)); + (void *)src.begin(), 0, NULL, NULL)); } /// Get device ptr associated with object inline const cl_mem * begin() const { return &_global; } diff --git a/lib/gpu/geryon/ocl_timer.h b/lib/gpu/geryon/ocl_timer.h index 25b20beea5..189871e631 100644 --- a/lib/gpu/geryon/ocl_timer.h +++ b/lib/gpu/geryon/ocl_timer.h @@ -27,11 +27,15 @@ #include "ocl_macros.h" #include "ocl_device.h" +#ifndef GERYON_NO_OCL_MARKERS #ifdef CL_VERSION_1_2 #define UCL_OCL_MARKER(cq,event) clEnqueueMarkerWithWaitList(cq,0,nullptr,event) #else #define UCL_OCL_MARKER clEnqueueMarker #endif +#else +#define UCL_OCL_MARKER(cq,event) +#endif namespace ucl_opencl { @@ -50,11 +54,17 @@ class UCL_Timer { /** \note init() must be called to reuse timer after a clear() **/ inline void clear() { if (_initialized) { + if (has_measured_time) { + #ifndef GERYON_NO_OCL_MARKERS + clReleaseEvent(start_event); + clReleaseEvent(stop_event); + #endif + has_measured_time = false; + } CL_DESTRUCT_CALL(clReleaseCommandQueue(_cq)); _initialized=false; _total_time=0.0; } - has_measured_time = false; } /// Initialize default command queue for timing @@ -71,8 +81,14 @@ class UCL_Timer { /// Start timing on default command queue inline void start() { + if (has_measured_time) { + #ifndef GERYON_NO_OCL_MARKERS + clReleaseEvent(start_event); + clReleaseEvent(stop_event); + #endif + has_measured_time = false; + } UCL_OCL_MARKER(_cq,&start_event); - has_measured_time = false; } /// Stop timing on default command queue @@ -83,13 +99,26 @@ class UCL_Timer { /// Block until the start event has been reached on device inline void sync_start() { + #ifndef GERYON_NO_OCL_MARKERS CL_SAFE_CALL(clWaitForEvents(1,&start_event)); + if (has_measured_time) { + clReleaseEvent(start_event); + clReleaseEvent(stop_event); + has_measured_time = false; + } + #else + CL_SAFE_CALL(clFinish(_cq)); has_measured_time = false; + #endif } /// Block until the stop event has been reached on device inline void sync_stop() { + #ifndef GERYON_NO_OCL_MARKERS CL_SAFE_CALL(clWaitForEvents(1,&stop_event)); + #else + CL_SAFE_CALL(clFinish(_cq)); + #endif has_measured_time = true; } @@ -114,6 +143,7 @@ class UCL_Timer { /// Return the time (ms) of last start to stop - Forces synchronization inline double time() { if(!has_measured_time) return 0.0; + #ifndef GERYON_NO_OCL_MARKERS cl_ulong tstart,tend; CL_SAFE_CALL(clWaitForEvents(1,&stop_event)); CL_SAFE_CALL(clGetEventProfilingInfo(stop_event, @@ -126,6 +156,11 @@ class UCL_Timer { clReleaseEvent(stop_event); has_measured_time = false; return (tend-tstart)*1e-6; + #else + CL_SAFE_CALL(clFinish(_cq)); + has_measured_time = false; + return 0.0; + #endif } /// Return the time (s) of last start to stop - Forces synchronization diff --git a/lib/gpu/geryon/ucl_basemat.h b/lib/gpu/geryon/ucl_basemat.h index 51fd33d623..349873d59b 100644 --- a/lib/gpu/geryon/ucl_basemat.h +++ b/lib/gpu/geryon/ucl_basemat.h @@ -75,13 +75,21 @@ class UCL_BaseMat { inline enum UCL_MEMOPT kind() const { return _kind; } inline bool shared_mem_device() { - #ifdef _OCL_MAT + #ifndef _OCL_MAT + return false; + #else + + #if defined(GERYON_FORCE_SHARED_MAIN_MEM_ON) + return true; + #elif defined(GERYON_FORCE_SHARED_MAIN_MEM_OFF) + return false; + #else cl_device_id device; CL_SAFE_CALL(clGetCommandQueueInfo(_cq,CL_QUEUE_DEVICE, sizeof(cl_device_id),&device,NULL)); return _shared_mem_device(device); - #else - return false; + #endif + #endif } diff --git a/lib/gpu/geryon/ucl_d_vec.h b/lib/gpu/geryon/ucl_d_vec.h index 6c10568f86..9158e145b3 100644 --- a/lib/gpu/geryon/ucl_d_vec.h +++ b/lib/gpu/geryon/ucl_d_vec.h @@ -375,7 +375,7 @@ class UCL_D_Vec : public UCL_BaseMat { /// Resize (only if bigger) the allocation to contain cols elements /** \note Cannot be used on views **/ inline int resize_ib(const int cols) - { if (cols>_cols) return resize(cols); else return UCL_SUCCESS; } + { if (cols > (int)_cols) return resize(cols); else return UCL_SUCCESS; } /// Set each element to zero asynchronously in the default command_queue inline void zero() { zero(_cq); } diff --git a/lib/gpu/geryon/ucl_h_mat.h b/lib/gpu/geryon/ucl_h_mat.h index 41dad2b285..082cfd5980 100644 --- a/lib/gpu/geryon/ucl_h_mat.h +++ b/lib/gpu/geryon/ucl_h_mat.h @@ -140,7 +140,10 @@ class UCL_H_Mat : public UCL_BaseMat { _end=_array+_cols; #ifdef _OCL_MAT _carray=input.cbegin(); - CL_SAFE_CALL(clRetainMemObject(input.cbegin())); + // When viewing outside host allocation with discrete main memory on accelerator, + // no cl_buffer object is created to avoid unnecessary creation of device allocs + if (_carray!=(cl_mem)(0)) + CL_SAFE_CALL(clRetainMemObject(input.cbegin())); CL_SAFE_CALL(clRetainCommandQueue(input.cq())); #endif } diff --git a/lib/gpu/geryon/ucl_h_vec.h b/lib/gpu/geryon/ucl_h_vec.h index d9ce0bbba6..2f49f9f633 100644 --- a/lib/gpu/geryon/ucl_h_vec.h +++ b/lib/gpu/geryon/ucl_h_vec.h @@ -139,7 +139,10 @@ class UCL_H_Vec : public UCL_BaseMat { _end=_array+_cols; #ifdef _OCL_MAT _carray=input.cbegin(); - CL_SAFE_CALL(clRetainMemObject(input.cbegin())); + // When viewing outside host allocation with discrete main memory on accelerator, + // no cl_buffer object is created to avoid unnecessary creation of device allocs + if (_carray!=(cl_mem)(0)) + CL_SAFE_CALL(clRetainMemObject(input.cbegin())); CL_SAFE_CALL(clRetainCommandQueue(input.cq())); #endif } diff --git a/lib/gpu/lal_base_atomic.cpp b/lib/gpu/lal_base_atomic.cpp index b668399a48..bb0e815b3f 100644 --- a/lib/gpu/lal_base_atomic.cpp +++ b/lib/gpu/lal_base_atomic.cpp @@ -340,8 +340,7 @@ void BaseAtomicT::compile_kernels(UCL_Device &dev, const void *pair_str, #if defined(LAL_OCL_EV_JIT) mx_subgroup_sz = std::min(mx_subgroup_sz, k_pair_noev.max_subgroup_size(_block_size)); #endif - if (_threads_per_atom > mx_subgroup_sz) - _threads_per_atom = mx_subgroup_sz; + if (_threads_per_atom > (int)mx_subgroup_sz) _threads_per_atom = mx_subgroup_sz; device->set_simd_size(mx_subgroup_sz); } #endif diff --git a/lib/gpu/lal_base_charge.cpp b/lib/gpu/lal_base_charge.cpp index 84fbddd4e9..4a59f70d83 100644 --- a/lib/gpu/lal_base_charge.cpp +++ b/lib/gpu/lal_base_charge.cpp @@ -359,8 +359,7 @@ void BaseChargeT::compile_kernels(UCL_Device &dev, const void *pair_str, #if defined(LAL_OCL_EV_JIT) mx_subgroup_sz = std::min(mx_subgroup_sz, k_pair_noev.max_subgroup_size(_block_size)); #endif - if (_threads_per_atom > mx_subgroup_sz) - _threads_per_atom = mx_subgroup_sz; + if (_threads_per_atom > (int)mx_subgroup_sz) _threads_per_atom = mx_subgroup_sz; device->set_simd_size(mx_subgroup_sz); } #endif diff --git a/lib/gpu/lal_base_dipole.cpp b/lib/gpu/lal_base_dipole.cpp index 439637cbde..66e03de651 100644 --- a/lib/gpu/lal_base_dipole.cpp +++ b/lib/gpu/lal_base_dipole.cpp @@ -361,8 +361,7 @@ void BaseDipoleT::compile_kernels(UCL_Device &dev, const void *pair_str, #if defined(LAL_OCL_EV_JIT) mx_subgroup_sz = std::min(mx_subgroup_sz, k_pair_noev.max_subgroup_size(_block_size)); #endif - if (_threads_per_atom > mx_subgroup_sz) - _threads_per_atom = mx_subgroup_sz; + if (_threads_per_atom > (int)mx_subgroup_sz) _threads_per_atom = mx_subgroup_sz; device->set_simd_size(mx_subgroup_sz); } #endif diff --git a/lib/gpu/lal_base_dpd.cpp b/lib/gpu/lal_base_dpd.cpp index d3c3353415..44b86abeeb 100644 --- a/lib/gpu/lal_base_dpd.cpp +++ b/lib/gpu/lal_base_dpd.cpp @@ -361,8 +361,7 @@ void BaseDPDT::compile_kernels(UCL_Device &dev, const void *pair_str, #if defined(LAL_OCL_EV_JIT) mx_subgroup_sz = std::min(mx_subgroup_sz, k_pair_noev.max_subgroup_size(_block_size)); #endif - if (_threads_per_atom > mx_subgroup_sz) - _threads_per_atom = mx_subgroup_sz; + if (_threads_per_atom > (int)mx_subgroup_sz) _threads_per_atom = mx_subgroup_sz; device->set_simd_size(mx_subgroup_sz); } #endif diff --git a/lib/gpu/lal_base_ellipsoid.cpp b/lib/gpu/lal_base_ellipsoid.cpp index ca7dc645bc..0bc20615a1 100644 --- a/lib/gpu/lal_base_ellipsoid.cpp +++ b/lib/gpu/lal_base_ellipsoid.cpp @@ -569,8 +569,7 @@ void BaseEllipsoidT::compile_kernels(UCL_Device &dev, if (e_s) mx_subgroup_sz = std::min(mx_subgroup_sz, k_ellipsoid_sphere_noev.max_subgroup_size(_block_size)); #endif - if (_threads_per_atom > mx_subgroup_sz) - _threads_per_atom = mx_subgroup_sz; + if (_threads_per_atom > (int)mx_subgroup_sz) _threads_per_atom = mx_subgroup_sz; device->set_simd_size(mx_subgroup_sz); } #endif diff --git a/lib/gpu/lal_base_three.cpp b/lib/gpu/lal_base_three.cpp index 8ba6147582..3457955b3e 100644 --- a/lib/gpu/lal_base_three.cpp +++ b/lib/gpu/lal_base_three.cpp @@ -471,8 +471,7 @@ void BaseThreeT::compile_kernels(UCL_Device &dev, const void *pair_str, mx_subgroup_sz = std::min(mx_subgroup_sz, k_three_center_noev.max_subgroup_size(_block_size)); mx_subgroup_sz = std::min(mx_subgroup_sz, k_three_end_noev.max_subgroup_size(_block_size)); #endif - if (_threads_per_atom > mx_subgroup_sz) - _threads_per_atom = mx_subgroup_sz; + if (_threads_per_atom > (int)mx_subgroup_sz) _threads_per_atom = mx_subgroup_sz; device->set_simd_size(mx_subgroup_sz); } #endif diff --git a/lib/gpu/lal_beck_ext.cpp b/lib/gpu/lal_beck_ext.cpp index ab65237e27..d4be986ff5 100644 --- a/lib/gpu/lal_beck_ext.cpp +++ b/lib/gpu/lal_beck_ext.cpp @@ -76,7 +76,7 @@ int beck_gpu_init(const int ntypes, double **cutsq, double **aa, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - BLMF.device->gpu_barrier(); + BLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_born_coul_long_cs_ext.cpp b/lib/gpu/lal_born_coul_long_cs_ext.cpp index fc6b89692f..3d6383acca 100644 --- a/lib/gpu/lal_born_coul_long_cs_ext.cpp +++ b/lib/gpu/lal_born_coul_long_cs_ext.cpp @@ -84,7 +84,7 @@ int bornclcs_gpu_init(const int ntypes, double **cutsq, double **host_rhoinv, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - BCLCSMF.device->gpu_barrier(); + BCLCSMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_born_coul_long_ext.cpp b/lib/gpu/lal_born_coul_long_ext.cpp index 9d17f2fa7d..6975f5237e 100644 --- a/lib/gpu/lal_born_coul_long_ext.cpp +++ b/lib/gpu/lal_born_coul_long_ext.cpp @@ -84,7 +84,7 @@ int borncl_gpu_init(const int ntypes, double **cutsq, double **host_rhoinv, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - BORNCLMF.device->gpu_barrier(); + BORNCLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_born_coul_wolf_cs_ext.cpp b/lib/gpu/lal_born_coul_wolf_cs_ext.cpp index ae162a7c52..be07504727 100644 --- a/lib/gpu/lal_born_coul_wolf_cs_ext.cpp +++ b/lib/gpu/lal_born_coul_wolf_cs_ext.cpp @@ -86,7 +86,7 @@ int borncwcs_gpu_init(const int ntypes, double **cutsq, double **host_rhoinv, host_cut_coulsq, host_special_coul, qqrd2e, alf, e_shift, f_shift); - BornCWCST.device->gpu_barrier(); + BornCWCST.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_born_coul_wolf_ext.cpp b/lib/gpu/lal_born_coul_wolf_ext.cpp index bc38db1b9c..a3e8fd44f2 100644 --- a/lib/gpu/lal_born_coul_wolf_ext.cpp +++ b/lib/gpu/lal_born_coul_wolf_ext.cpp @@ -86,7 +86,7 @@ int borncw_gpu_init(const int ntypes, double **cutsq, double **host_rhoinv, host_cut_coulsq, host_special_coul, qqrd2e, alf, e_shift, f_shift); - BORNCWMF.device->gpu_barrier(); + BORNCWMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_born_ext.cpp b/lib/gpu/lal_born_ext.cpp index 2321a1264d..ca2b79865a 100644 --- a/lib/gpu/lal_born_ext.cpp +++ b/lib/gpu/lal_born_ext.cpp @@ -80,7 +80,7 @@ int born_gpu_init(const int ntypes, double **cutsq, double **host_rhoinv, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - BORNMF.device->gpu_barrier(); + BORNMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -114,7 +114,7 @@ void born_gpu_reinit(const int ntypes, double **host_rhoinv, BORNMF.reinit(ntypes, host_rhoinv, host_born1, host_born2, host_born3, host_a, host_c, host_d, offset); - BORNMF.device->gpu_barrier(); + BORNMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_buck_coul_ext.cpp b/lib/gpu/lal_buck_coul_ext.cpp index 9cf8f9b00e..cb07daecc4 100644 --- a/lib/gpu/lal_buck_coul_ext.cpp +++ b/lib/gpu/lal_buck_coul_ext.cpp @@ -83,7 +83,7 @@ int buckc_gpu_init(const int ntypes, double **cutsq, double **host_rhoinv, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e); - BUCKCMF.device->gpu_barrier(); + BUCKCMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_buck_coul_long_ext.cpp b/lib/gpu/lal_buck_coul_long_ext.cpp index 393ccc3feb..3307b8f5bc 100644 --- a/lib/gpu/lal_buck_coul_long_ext.cpp +++ b/lib/gpu/lal_buck_coul_long_ext.cpp @@ -82,7 +82,7 @@ int buckcl_gpu_init(const int ntypes, double **cutsq, double **host_rhoinv, maxspecial, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - BUCKCLMF.device->gpu_barrier(); + BUCKCLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_buck_ext.cpp b/lib/gpu/lal_buck_ext.cpp index 738b33337d..70915cb227 100644 --- a/lib/gpu/lal_buck_ext.cpp +++ b/lib/gpu/lal_buck_ext.cpp @@ -77,7 +77,7 @@ int buck_gpu_init(const int ntypes, double **cutsq, double **host_rhoinv, host_a, host_c, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - BUCKMF.device->gpu_barrier(); + BUCKMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -110,7 +110,7 @@ void buck_gpu_reinit(const int ntypes, double **cutsq, double **host_rhoinv, BUCKMF.reinit(ntypes, cutsq, host_rhoinv, host_buck1, host_buck2, host_a, host_c, offset); - BUCKMF.device->gpu_barrier(); + BUCKMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_charmm_ext.cpp b/lib/gpu/lal_charmm_ext.cpp index bed2f21933..471599b1b1 100644 --- a/lib/gpu/lal_charmm_ext.cpp +++ b/lib/gpu/lal_charmm_ext.cpp @@ -88,7 +88,7 @@ int crm_gpu_init(const int ntypes, double cut_bothsq, double **host_lj1, qqrd2e, cut_lj_innersq, cut_coul_innersq, denom_lj, denom_coul, epsilon, sigma, mix_arithmetic); - CRMMF.device->gpu_barrier(); + CRMMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_charmm_long_ext.cpp b/lib/gpu/lal_charmm_long_ext.cpp index 13565f5682..dfe3d99383 100644 --- a/lib/gpu/lal_charmm_long_ext.cpp +++ b/lib/gpu/lal_charmm_long_ext.cpp @@ -86,7 +86,7 @@ int crml_gpu_init(const int ntypes, double cut_bothsq, double **host_lj1, qqrd2e, g_ewald, cut_lj_innersq, denom_lj, epsilon, sigma, mix_arithmetic); - CRMLMF.device->gpu_barrier(); + CRMLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_colloid_ext.cpp b/lib/gpu/lal_colloid_ext.cpp index dcfd1a6d34..cfd050e486 100644 --- a/lib/gpu/lal_colloid_ext.cpp +++ b/lib/gpu/lal_colloid_ext.cpp @@ -83,7 +83,7 @@ int colloid_gpu_init(const int ntypes, double **cutsq, double **host_lj1, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - COLLMF.device->gpu_barrier(); + COLLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_coul_debye_ext.cpp b/lib/gpu/lal_coul_debye_ext.cpp index 516dca5df8..fbe319d499 100644 --- a/lib/gpu/lal_coul_debye_ext.cpp +++ b/lib/gpu/lal_coul_debye_ext.cpp @@ -74,7 +74,7 @@ int cdebye_gpu_init(const int ntypes, double **host_scale, double **cutsq, init_ok=CDEMF.init(ntypes, host_scale, cutsq, host_special_coul, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen, qqrd2e, kappa); - CDEMF.device->gpu_barrier(); + CDEMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -103,7 +103,7 @@ void cdebye_gpu_reinit(const int ntypes, double **host_scale) { if (gpu_rank==i && world_me!=0) CDEMF.reinit(ntypes, host_scale); - CDEMF.device->gpu_barrier(); + CDEMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_coul_dsf_ext.cpp b/lib/gpu/lal_coul_dsf_ext.cpp index e21c70ae4b..9654d1e1a3 100644 --- a/lib/gpu/lal_coul_dsf_ext.cpp +++ b/lib/gpu/lal_coul_dsf_ext.cpp @@ -77,7 +77,7 @@ int cdsf_gpu_init(const int ntypes, const int inum, const int nall, gpu_split, screen, host_cut_coulsq, host_special_coul, qqrd2e, e_shift, f_shift, alpha); - CDMF.device->gpu_barrier(); + CDMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_coul_ext.cpp b/lib/gpu/lal_coul_ext.cpp index 370c186123..91d4433e9a 100644 --- a/lib/gpu/lal_coul_ext.cpp +++ b/lib/gpu/lal_coul_ext.cpp @@ -74,7 +74,7 @@ int coul_gpu_init(const int ntypes, double **host_scale, init_ok=COULMF.init(ntypes, host_scale, cutsq, special_coul, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen, qqrd2e); - COULMF.device->gpu_barrier(); + COULMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -103,7 +103,7 @@ void coul_gpu_reinit(const int ntypes, double **host_scale) { if (gpu_rank==i && world_me!=0) COULMF.reinit(ntypes, host_scale); - COULMF.device->gpu_barrier(); + COULMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_coul_long_cs_ext.cpp b/lib/gpu/lal_coul_long_cs_ext.cpp index df92619f2f..be4630516c 100644 --- a/lib/gpu/lal_coul_long_cs_ext.cpp +++ b/lib/gpu/lal_coul_long_cs_ext.cpp @@ -76,7 +76,7 @@ int clcs_gpu_init(const int ntypes, double **host_scale, cell_size, gpu_split, screen, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - CLCSMF.device->gpu_barrier(); + CLCSMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -105,7 +105,7 @@ void clcs_gpu_reinit(const int ntypes, double **host_scale) { if (gpu_rank==i && world_me!=0) CLCSMF.reinit(ntypes, host_scale); - CLCSMF.device->gpu_barrier(); + CLCSMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_coul_long_ext.cpp b/lib/gpu/lal_coul_long_ext.cpp index 1d9dcfdeca..034d23f507 100644 --- a/lib/gpu/lal_coul_long_ext.cpp +++ b/lib/gpu/lal_coul_long_ext.cpp @@ -76,7 +76,7 @@ int cl_gpu_init(const int ntypes, double **host_scale, cell_size, gpu_split, screen, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - CLMF.device->gpu_barrier(); + CLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -105,7 +105,7 @@ void cl_gpu_reinit(const int ntypes, double **host_scale) { if (gpu_rank==i && world_me!=0) CLMF.reinit(ntypes, host_scale); - CLMF.device->gpu_barrier(); + CLMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 580a3e81b6..0d9578b491 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -86,7 +86,7 @@ int DeviceT::init_device(MPI_Comm world, MPI_Comm replica, const int ngpu, #ifdef LAL_OCL_EXTRA_ARGS extra_args+=":" LAL_PRE_STRINGIFY(LAL_OCL_EXTRA_ARGS); #endif - for (int i=0; i + // Previous source of OCL memory leak when time_device=false + // - Logic added to release OCL events when timers are not invoked if (_procs_per_gpu>1) _time_device=false; -#endif + + if (!_time_device && _particle_split > 0) + gpu->configure_profiling(false); // Set up a per device communicator MPI_Comm_split(node_comm,my_gpu,0,&_comm_gpu); @@ -303,7 +301,7 @@ int DeviceT::init_device(MPI_Comm world, MPI_Comm replica, const int ngpu, #ifdef USE_OPENCL if (device_type_flags==nullptr) { std::string pname = gpu->platform_name(); - for (int i=0; i='a') pname[i]=toupper(pname[i]); if (pname.find("NVIDIA")!=std::string::npos) @@ -330,7 +328,7 @@ int DeviceT::init_device(MPI_Comm world, MPI_Comm replica, const int ngpu, for (int i=0; i<_procs_per_gpu; i++) { if (_gpu_rank==i) flag=compile_kernels(); - gpu_barrier(); + serialize_init(); } // check if double precision support is available @@ -611,6 +609,10 @@ void DeviceT::init_message(FILE *screen, const char *name, int last=last_gpu+1; if (last>gpu->num_devices()) last=gpu->num_devices(); + if (gpu->num_platforms()>1) { + std::string pname=gpu->platform_name(); + fprintf(screen,"Platform: %s\n",pname.c_str()); + } for (int i=first_gpu; isync(); if (_data_in_estimate>0) { delete [] host_data_in; @@ -789,6 +794,7 @@ void DeviceT::output_times(UCL_Timer &time_pair, Answer &ans, #ifdef USE_OPENCL // Workaround for timing issue on Intel OpenCL if (times[0] > 80e6) times[0]=0.0; + if (times[1] > 80e6) times[1]=0.0; if (times[3] > 80e6) times[3]=0.0; if (times[5] > 80e6) times[5]=0.0; #endif @@ -802,9 +808,8 @@ void DeviceT::output_times(UCL_Timer &time_pair, Answer &ans, fprintf(screen,"--------------------------------\n"); if (time_device() && (times[3] > 0.0)) { - if (times[0] > 0.0) - fprintf(screen,"Data Transfer: %.4f s.\n",times[0]/_replica_size); - fprintf(screen,"Neighbor copy: %.4f s.\n",times[1]/_replica_size); + if (times[0] > 0.0) fprintf(screen,"Data Transfer: %.4f s.\n",times[0]/_replica_size); + if (times[1] > 0.0) fprintf(screen,"Neighbor copy: %.4f s.\n",times[1]/_replica_size); if (nbor.gpu_nbor() > 0.0) fprintf(screen,"Neighbor build: %.4f s.\n",times[2]/_replica_size); else @@ -858,32 +863,34 @@ void DeviceT::output_kspace_times(UCL_Timer &time_in, double max_mb=mpi_max_bytes/(1024.0*1024.0); #ifdef USE_OPENCL // Workaround for timing issue on Intel OpenCL + if (times[0] > 80e6) times[0]=0.0; + if (times[1] > 80e6) times[1]=0.0; if (times[3] > 80e6) times[3]=0.0; + if (times[5] > 80e6) times[5]=0.0; #endif if (replica_me()==0) - if (screen && times[6]>0.0) { + if (screen && (times[6] > 0.0)) { fprintf(screen,"\n\n-------------------------------------"); fprintf(screen,"--------------------------------\n"); fprintf(screen," Device Time Info (average) for kspace: "); fprintf(screen,"\n-------------------------------------"); fprintf(screen,"--------------------------------\n"); - if (time_device() && times[3]>0) { - fprintf(screen,"Data Out: %.4f s.\n",times[0]/_replica_size); - fprintf(screen,"Data In: %.4f s.\n",times[1]/_replica_size); + if (time_device() && (times[3] > 0.0)) { + if (times[0] > 0.0) fprintf(screen,"Data Out: %.4f s.\n",times[0]/_replica_size); + if (times[1] > 0.0) fprintf(screen,"Data In: %.4f s.\n",times[1]/_replica_size); fprintf(screen,"Kernel (map): %.4f s.\n",times[2]/_replica_size); fprintf(screen,"Kernel (rho): %.4f s.\n",times[3]/_replica_size); fprintf(screen,"Force interp: %.4f s.\n",times[4]/_replica_size); - fprintf(screen,"Total rho: %.4f s.\n", - (times[0]+times[2]+times[3])/_replica_size); - fprintf(screen,"Total interp: %.4f s.\n", - (times[1]+times[4])/_replica_size); - fprintf(screen,"Force copy: %.4f s.\n",times[5]/_replica_size); + if (times[0] > 0.0) + fprintf(screen,"Total rho: %.4f s.\n", (times[0]+times[2]+times[3])/_replica_size); + if (times[1] > 0.0) + fprintf(screen,"Total interp: %.4f s.\n", (times[1]+times[4])/_replica_size); + if (times[5] > 0.0) fprintf(screen,"Force copy: %.4f s.\n",times[5]/_replica_size); fprintf(screen,"Total: %.4f s.\n", - (times[0]+times[1]+times[2]+times[3]+times[4]+times[5])/ - _replica_size); + (times[0]+times[1]+times[2]+times[3]+times[4]+times[5])/_replica_size); } fprintf(screen,"CPU Poisson: %.4f s.\n",times[6]/_replica_size); fprintf(screen,"CPU Data Cast: %.4f s.\n",times[8]/_replica_size); diff --git a/lib/gpu/lal_device.h b/lib/gpu/lal_device.h index 54fcf2f4e8..f5136d9fa0 100644 --- a/lib/gpu/lal_device.h +++ b/lib/gpu/lal_device.h @@ -217,6 +217,12 @@ class Device { inline int gpu_rank() const { return _gpu_rank; } /// MPI Barrier for gpu inline void gpu_barrier() { MPI_Barrier(_comm_gpu); } + /// Serialize GPU initialization and JIT for unsafe platforms + inline void serialize_init() { + #ifdef LAL_SERIALIZE_INIT + gpu_barrier(); + #endif + } /// Return the 'mode' for acceleration: GPU_FORCE, GPU_NEIGH or GPU_HYB_NEIGH inline int gpu_mode() const { return _gpu_mode; } /// Index of first device used by a node diff --git a/lib/gpu/lal_dipole_lj_ext.cpp b/lib/gpu/lal_dipole_lj_ext.cpp index 90c9935913..4252264280 100644 --- a/lib/gpu/lal_dipole_lj_ext.cpp +++ b/lib/gpu/lal_dipole_lj_ext.cpp @@ -80,7 +80,7 @@ int dpl_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e); - DPLMF.device->gpu_barrier(); + DPLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_dipole_lj_sf_ext.cpp b/lib/gpu/lal_dipole_lj_sf_ext.cpp index 0879702887..69469630b1 100644 --- a/lib/gpu/lal_dipole_lj_sf_ext.cpp +++ b/lib/gpu/lal_dipole_lj_sf_ext.cpp @@ -80,7 +80,7 @@ int dplsf_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e); - DPLSFMF.device->gpu_barrier(); + DPLSFMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_dipole_long_lj_ext.cpp b/lib/gpu/lal_dipole_long_lj_ext.cpp index fd61706ba9..9ba5f3ccf3 100644 --- a/lib/gpu/lal_dipole_long_lj_ext.cpp +++ b/lib/gpu/lal_dipole_long_lj_ext.cpp @@ -81,7 +81,7 @@ int dplj_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - DPLJMF.device->gpu_barrier(); + DPLJMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_dpd_ext.cpp b/lib/gpu/lal_dpd_ext.cpp index 7637ff03c0..2f7ef3e7e2 100644 --- a/lib/gpu/lal_dpd_ext.cpp +++ b/lib/gpu/lal_dpd_ext.cpp @@ -76,7 +76,7 @@ int dpd_gpu_init(const int ntypes, double **cutsq, double **host_a0, host_cut, special_lj, false, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - DPDMF.device->gpu_barrier(); + DPDMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_dpd_tstat_ext.cpp b/lib/gpu/lal_dpd_tstat_ext.cpp index 0e60e3fccc..2b63bf62e7 100644 --- a/lib/gpu/lal_dpd_tstat_ext.cpp +++ b/lib/gpu/lal_dpd_tstat_ext.cpp @@ -76,7 +76,7 @@ int dpd_tstat_gpu_init(const int ntypes, double **cutsq, double **host_a0, host_cut, special_lj, true, inum, nall, 300, maxspecial, cell_size, gpu_split, screen); - DPDTMF.device->gpu_barrier(); + DPDTMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_eam_alloy_ext.cpp b/lib/gpu/lal_eam_alloy_ext.cpp index 5a3dfb9d6d..488692bd2f 100644 --- a/lib/gpu/lal_eam_alloy_ext.cpp +++ b/lib/gpu/lal_eam_alloy_ext.cpp @@ -90,7 +90,7 @@ int eam_alloy_gpu_init(const int ntypes, double host_cutforcesq, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - EAMALMF.device->gpu_barrier(); + EAMALMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_eam_ext.cpp b/lib/gpu/lal_eam_ext.cpp index a884335bd9..f3e16a9589 100644 --- a/lib/gpu/lal_eam_ext.cpp +++ b/lib/gpu/lal_eam_ext.cpp @@ -90,7 +90,7 @@ int eam_gpu_init(const int ntypes, double host_cutforcesq, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - EAMMF.device->gpu_barrier(); + EAMMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_eam_fs_ext.cpp b/lib/gpu/lal_eam_fs_ext.cpp index 5aad871237..72bf439a4d 100644 --- a/lib/gpu/lal_eam_fs_ext.cpp +++ b/lib/gpu/lal_eam_fs_ext.cpp @@ -90,7 +90,7 @@ int eam_fs_gpu_init(const int ntypes, double host_cutforcesq, nz2r, nfrho, nr, nlocal, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - EAMFSMF.device->gpu_barrier(); + EAMFSMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_gauss_ext.cpp b/lib/gpu/lal_gauss_ext.cpp index afec2e86f2..2e00223ac9 100644 --- a/lib/gpu/lal_gauss_ext.cpp +++ b/lib/gpu/lal_gauss_ext.cpp @@ -76,7 +76,7 @@ int gauss_gpu_init(const int ntypes, double **cutsq, double **host_a, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - GLMF.device->gpu_barrier(); + GLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -106,7 +106,7 @@ void gauss_gpu_reinit(const int ntypes, double **cutsq, double **host_a, if (gpu_rank==i && world_me!=0) GLMF.reinit(ntypes, cutsq, host_a, host_b, offset); - GLMF.device->gpu_barrier(); + GLMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_gayberne_ext.cpp b/lib/gpu/lal_gayberne_ext.cpp index 56aad61632..864da8e7ad 100644 --- a/lib/gpu/lal_gayberne_ext.cpp +++ b/lib/gpu/lal_gayberne_ext.cpp @@ -83,7 +83,7 @@ int gb_gpu_init(const int ntypes, const double gamma, host_lj3, host_lj4, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - GBMF.device->gpu_barrier(); + GBMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj96_ext.cpp b/lib/gpu/lal_lj96_ext.cpp index be7ffc5a09..b8d191d31e 100644 --- a/lib/gpu/lal_lj96_ext.cpp +++ b/lib/gpu/lal_lj96_ext.cpp @@ -76,7 +76,7 @@ int lj96_gpu_init(const int ntypes, double **cutsq, double **host_lj1, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - LJ96MF.device->gpu_barrier(); + LJ96MF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_class2_long_ext.cpp b/lib/gpu/lal_lj_class2_long_ext.cpp index 311b027536..66eda209c1 100644 --- a/lib/gpu/lal_lj_class2_long_ext.cpp +++ b/lib/gpu/lal_lj_class2_long_ext.cpp @@ -81,7 +81,7 @@ int c2cl_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - C2CLMF.device->gpu_barrier(); + C2CLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_coul_debye_ext.cpp b/lib/gpu/lal_lj_coul_debye_ext.cpp index 4f81b01457..c6c9baef0f 100644 --- a/lib/gpu/lal_lj_coul_debye_ext.cpp +++ b/lib/gpu/lal_lj_coul_debye_ext.cpp @@ -81,7 +81,7 @@ int ljcd_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, kappa); - LJCDMF.device->gpu_barrier(); + LJCDMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_coul_ext.cpp b/lib/gpu/lal_lj_coul_ext.cpp index 5b7f97e630..4011f4bb8c 100644 --- a/lib/gpu/lal_lj_coul_ext.cpp +++ b/lib/gpu/lal_lj_coul_ext.cpp @@ -80,7 +80,7 @@ int ljc_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e); - LJCMF.device->gpu_barrier(); + LJCMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_coul_long_ext.cpp b/lib/gpu/lal_lj_coul_long_ext.cpp index 6a027bdc7e..578e38e4a0 100644 --- a/lib/gpu/lal_lj_coul_long_ext.cpp +++ b/lib/gpu/lal_lj_coul_long_ext.cpp @@ -81,7 +81,7 @@ int ljcl_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - LJCLMF.device->gpu_barrier(); + LJCLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -112,7 +112,7 @@ void ljcl_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, if (gpu_rank==i && world_me!=0) LJCLMF.reinit(ntypes, cutsq, host_lj1, host_lj2, host_lj3, host_lj4, offset, host_cut_ljsq); - LJCLMF.device->gpu_barrier(); + LJCLMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_lj_coul_msm_ext.cpp b/lib/gpu/lal_lj_coul_msm_ext.cpp index 2d9d77fe77..05b1991ff9 100644 --- a/lib/gpu/lal_lj_coul_msm_ext.cpp +++ b/lib/gpu/lal_lj_coul_msm_ext.cpp @@ -83,7 +83,7 @@ int ljcm_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, order, qqrd2e); - LJCMLMF.device->gpu_barrier(); + LJCMLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_cubic_ext.cpp b/lib/gpu/lal_lj_cubic_ext.cpp index 2f8ebac37b..d11199cee9 100644 --- a/lib/gpu/lal_lj_cubic_ext.cpp +++ b/lib/gpu/lal_lj_cubic_ext.cpp @@ -80,7 +80,7 @@ int ljcb_gpu_init(const int ntypes, double **cutsq, double **cut_inner_sq, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - LJCubicLMF.device->gpu_barrier(); + LJCubicLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_dsf_ext.cpp b/lib/gpu/lal_lj_dsf_ext.cpp index e70059261c..c1e5b2de38 100644 --- a/lib/gpu/lal_lj_dsf_ext.cpp +++ b/lib/gpu/lal_lj_dsf_ext.cpp @@ -84,7 +84,7 @@ int ljd_gpu_init(const int ntypes, double **cutsq, double **host_lj1, host_cut_coulsq, host_special_coul, qqrd2e, e_shift, f_shift, alpha); - LJDMF.device->gpu_barrier(); + LJDMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_expand_coul_long_ext.cpp b/lib/gpu/lal_lj_expand_coul_long_ext.cpp index e5506dd7aa..a6a04d7cc8 100644 --- a/lib/gpu/lal_lj_expand_coul_long_ext.cpp +++ b/lib/gpu/lal_lj_expand_coul_long_ext.cpp @@ -81,7 +81,7 @@ int ljecl_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - LJECLMF.device->gpu_barrier(); + LJECLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -112,7 +112,7 @@ void ljecl_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, if (gpu_rank==i && world_me!=0) LJECLMF.reinit(ntypes, cutsq, host_lj1, host_lj2, host_lj3, host_lj4, offset, shift, host_cut_ljsq); - LJECLMF.device->gpu_barrier(); + LJECLMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_lj_expand_ext.cpp b/lib/gpu/lal_lj_expand_ext.cpp index 02decf2712..7d2e0fd306 100644 --- a/lib/gpu/lal_lj_expand_ext.cpp +++ b/lib/gpu/lal_lj_expand_ext.cpp @@ -108,7 +108,7 @@ void lje_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, if (gpu_rank==i && world_me!=0) LJEMF.reinit(ntypes, cutsq, host_lj1, host_lj2, host_lj3, host_lj4, offset, shift); - LJEMF.device->gpu_barrier(); + LJEMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_lj_ext.cpp b/lib/gpu/lal_lj_ext.cpp index fa00fc4f64..9a1d03780d 100644 --- a/lib/gpu/lal_lj_ext.cpp +++ b/lib/gpu/lal_lj_ext.cpp @@ -76,7 +76,7 @@ int ljl_gpu_init(const int ntypes, double **cutsq, double **host_lj1, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - LJLMF.device->gpu_barrier(); + LJLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -105,7 +105,7 @@ void ljl_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, for (int i=0; igpu_barrier(); + LJLMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_lj_gromacs_ext.cpp b/lib/gpu/lal_lj_gromacs_ext.cpp index 19d1d12513..289b6a30a3 100644 --- a/lib/gpu/lal_lj_gromacs_ext.cpp +++ b/lib/gpu/lal_lj_gromacs_ext.cpp @@ -81,7 +81,7 @@ int ljgrm_gpu_init(const int ntypes, double **cutsq, double **host_lj1, gpu_split, screen, host_ljsw1, host_ljsw2, host_ljsw3, host_ljsw4, host_ljsw5, cut_inner, cut_inner_sq); - LJGRMMF.device->gpu_barrier(); + LJGRMMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_smooth_ext.cpp b/lib/gpu/lal_lj_smooth_ext.cpp index 48dad74071..5d392d163f 100644 --- a/lib/gpu/lal_lj_smooth_ext.cpp +++ b/lib/gpu/lal_lj_smooth_ext.cpp @@ -80,7 +80,7 @@ int ljsmt_gpu_init(const int ntypes, double **cutsq, double **host_lj1, cell_size, gpu_split, screen, host_ljsw0, host_ljsw1, host_ljsw2, host_ljsw3, host_ljsw4, cut_inner, cut_inner_sq); - LJSMTMF.device->gpu_barrier(); + LJSMTMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -110,7 +110,7 @@ void ljsmt_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, for (int i=0; igpu_barrier(); + LJSMTMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_lj_spica_ext.cpp b/lib/gpu/lal_lj_spica_ext.cpp index 1467c1806a..119e40ee33 100644 --- a/lib/gpu/lal_lj_spica_ext.cpp +++ b/lib/gpu/lal_lj_spica_ext.cpp @@ -77,7 +77,7 @@ int spica_gpu_init(const int ntypes, double **cutsq, int **cg_types, host_lj4, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - CMMMF.device->gpu_barrier(); + CMMMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_spica_long_ext.cpp b/lib/gpu/lal_lj_spica_long_ext.cpp index 293801391f..298fde2fd5 100644 --- a/lib/gpu/lal_lj_spica_long_ext.cpp +++ b/lib/gpu/lal_lj_spica_long_ext.cpp @@ -81,7 +81,7 @@ int spical_gpu_init(const int ntypes, double **cutsq, int **cg_type, maxspecial, cell_size, gpu_split, screen, host_cut_ljsq, host_cut_coulsq, host_special_coul, qqrd2e, g_ewald); - CMMLMF.device->gpu_barrier(); + CMMLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_lj_tip4p_long.cu b/lib/gpu/lal_lj_tip4p_long.cu index 07a7ae7913..063daf7256 100644 --- a/lib/gpu/lal_lj_tip4p_long.cu +++ b/lib/gpu/lal_lj_tip4p_long.cu @@ -257,7 +257,7 @@ __kernel void k_lj_tip4p_reneigh( } if (igpu_barrier(); + LJTIP4PLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_mie_ext.cpp b/lib/gpu/lal_mie_ext.cpp index 5cbb9c29d2..a7b549139a 100644 --- a/lib/gpu/lal_mie_ext.cpp +++ b/lib/gpu/lal_mie_ext.cpp @@ -80,7 +80,7 @@ int mie_gpu_init(const int ntypes, double **cutsq, double **host_mie1, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - MLMF.device->gpu_barrier(); + MLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_morse_ext.cpp b/lib/gpu/lal_morse_ext.cpp index f43676a1b5..41c1076f7d 100644 --- a/lib/gpu/lal_morse_ext.cpp +++ b/lib/gpu/lal_morse_ext.cpp @@ -77,7 +77,7 @@ int mor_gpu_init(const int ntypes, double **cutsq, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - MORMF.device->gpu_barrier(); + MORMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_neighbor.cpp b/lib/gpu/lal_neighbor.cpp index 373da141ad..a327fdd45b 100644 --- a/lib/gpu/lal_neighbor.cpp +++ b/lib/gpu/lal_neighbor.cpp @@ -632,7 +632,7 @@ void Neighbor::build_nbor_list(double **x, const int inum, const int host_inum, subgroup_count += cell_subgroup_counts[i]; cell_subgroup_counts[i] += cell_subgroup_counts[i-1]; } - if (subgroup_count > subgroup2cell.numel()) { + if (subgroup_count > (int)subgroup2cell.numel()) { subgroup2cell.clear(); success = success && (subgroup2cell.alloc(1.1*subgroup_count,*dev, UCL_READ_WRITE,UCL_READ_ONLY) == UCL_SUCCESS); @@ -702,7 +702,7 @@ void Neighbor::build_nbor_list(double **x, const int inum, const int host_inum, _old_ncellz = ncellz; const int bin_stencil_stride = cells_in_cutoff * 2 + 1; const int bin_stencil_size = bin_stencil_stride * bin_stencil_stride; - if (bin_stencil_size > _host_bin_stencil.numel()) + if (bin_stencil_size > (int)_host_bin_stencil.numel()) _host_bin_stencil.alloc(bin_stencil_size,*dev); for (int s = 0; sacc_timers(); + if (device->time_device()) + atom->acc_timers(); _precompute(ago,nlocal,nall,host_x,host_type,success,host_q,boxlo,delxinv, delyinv,delzinv); } diff --git a/lib/gpu/lal_pppm_ext.cpp b/lib/gpu/lal_pppm_ext.cpp index cf009b4479..bdb83378f7 100644 --- a/lib/gpu/lal_pppm_ext.cpp +++ b/lib/gpu/lal_pppm_ext.cpp @@ -81,7 +81,7 @@ grdtyp * pppm_gpu_init(memtyp &pppm, const int nlocal, const int nall, vd_brick,slab_volfactor,nx_pppm,ny_pppm,nz_pppm, split,success); - pppm.device->gpu_barrier(); + pppm.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_re_squared_ext.cpp b/lib/gpu/lal_re_squared_ext.cpp index e1eb8a45b0..17c508f1f1 100644 --- a/lib/gpu/lal_re_squared_ext.cpp +++ b/lib/gpu/lal_re_squared_ext.cpp @@ -80,7 +80,7 @@ int re_gpu_init(const int ntypes, double **shape, double **well, double **cutsq, host_lj4, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - REMF.device->gpu_barrier(); + REMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_soft_ext.cpp b/lib/gpu/lal_soft_ext.cpp index a32a5e5a00..879150ddd9 100644 --- a/lib/gpu/lal_soft_ext.cpp +++ b/lib/gpu/lal_soft_ext.cpp @@ -76,7 +76,7 @@ int soft_gpu_init(const int ntypes, double **cutsq, double **host_prefactor, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - SLMF.device->gpu_barrier(); + SLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -106,7 +106,7 @@ void soft_gpu_reinit(const int ntypes, double **cutsq, double **host_prefactor, if (gpu_rank==i && world_me!=0) SLMF.reinit(ntypes, cutsq, host_prefactor, host_cut); - SLMF.device->gpu_barrier(); + SLMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_sw_ext.cpp b/lib/gpu/lal_sw_ext.cpp index 5158f135a3..5aa3af8757 100644 --- a/lib/gpu/lal_sw_ext.cpp +++ b/lib/gpu/lal_sw_ext.cpp @@ -84,7 +84,7 @@ int sw_gpu_init(const int ntypes, const int inum, const int nall, sigma_gamma, c1, c2, c3, c4, c5, c6, lambda_epsilon, costheta, map, e2param); - SWMF.device->gpu_barrier(); + SWMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_table_ext.cpp b/lib/gpu/lal_table_ext.cpp index 6237c4d7cd..8fc118c770 100644 --- a/lib/gpu/lal_table_ext.cpp +++ b/lib/gpu/lal_table_ext.cpp @@ -76,7 +76,7 @@ int table_gpu_init(const int ntypes, double **cutsq, double ***table_coeffs, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen, tabstyle, ntables, tablength); - TBMF.device->gpu_barrier(); + TBMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_tersoff.cpp b/lib/gpu/lal_tersoff.cpp index ac5e5bc600..044d691f31 100644 --- a/lib/gpu/lal_tersoff.cpp +++ b/lib/gpu/lal_tersoff.cpp @@ -260,7 +260,7 @@ int TersoffT::loop(const int eflag, const int vflag, const int evatom, // re-allocate zetaij if necessary int nall = this->_nall; - if (nall*this->nbor->max_nbors() > _zetaij.cols()) { + if (nall*this->nbor->max_nbors() > (int)_zetaij.cols()) { int _nmax=static_cast(static_cast(nall)*1.10); _zetaij.clear(); _zetaij_eng.clear(); diff --git a/lib/gpu/lal_tersoff_ext.cpp b/lib/gpu/lal_tersoff_ext.cpp index ac700d014a..5092809344 100644 --- a/lib/gpu/lal_tersoff_ext.cpp +++ b/lib/gpu/lal_tersoff_ext.cpp @@ -91,7 +91,7 @@ int tersoff_gpu_init(const int ntypes, const int inum, const int nall, const int ts_c1, ts_c2, ts_c3, ts_c4, ts_c, ts_d, ts_h, ts_gamma, ts_beta, ts_powern, ts_cutsq); - TSMF.device->gpu_barrier(); + TSMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_tersoff_mod.cpp b/lib/gpu/lal_tersoff_mod.cpp index 7f050c8eee..4c5e60f737 100644 --- a/lib/gpu/lal_tersoff_mod.cpp +++ b/lib/gpu/lal_tersoff_mod.cpp @@ -252,7 +252,7 @@ int TersoffMT::loop(const int eflag, const int vflag, const int evatom, // re-allocate zetaij if necessary int nall = this->_nall; - if (nall*this->nbor->max_nbors() > _zetaij.cols()) { + if (nall*this->nbor->max_nbors() > (int)_zetaij.cols()) { int _nmax=static_cast(static_cast(nall)*1.10); _zetaij.clear(); success = success && (_zetaij.alloc(this->nbor->max_nbors()*_nmax, diff --git a/lib/gpu/lal_tersoff_mod_ext.cpp b/lib/gpu/lal_tersoff_mod_ext.cpp index cac284fb70..7310191a5d 100644 --- a/lib/gpu/lal_tersoff_mod_ext.cpp +++ b/lib/gpu/lal_tersoff_mod_ext.cpp @@ -91,7 +91,7 @@ int tersoff_mod_gpu_init(const int ntypes, const int inum, const int nall, ts_c3, ts_c4, ts_c5, ts_h, ts_beta, ts_powern, ts_powern_del, ts_ca1, ts_cutsq); - TSMMF.device->gpu_barrier(); + TSMMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_tersoff_zbl.cpp b/lib/gpu/lal_tersoff_zbl.cpp index b3d7df9a3e..1499416b66 100644 --- a/lib/gpu/lal_tersoff_zbl.cpp +++ b/lib/gpu/lal_tersoff_zbl.cpp @@ -276,7 +276,7 @@ int TersoffZT::loop(const int eflag, const int vflag, const int evatom, // re-allocate zetaij if necessary int nall = this->_nall; - if (nall*this->nbor->max_nbors() > _zetaij.cols()) { + if (nall*this->nbor->max_nbors() > (int)_zetaij.cols()) { int _nmax=static_cast(static_cast(nall)*1.10); _zetaij.clear(); success = success && (_zetaij.alloc(this->nbor->max_nbors()*_nmax, diff --git a/lib/gpu/lal_tersoff_zbl_ext.cpp b/lib/gpu/lal_tersoff_zbl_ext.cpp index 518b535627..ad3538b464 100644 --- a/lib/gpu/lal_tersoff_zbl_ext.cpp +++ b/lib/gpu/lal_tersoff_zbl_ext.cpp @@ -102,7 +102,7 @@ int tersoff_zbl_gpu_init(const int ntypes, const int inum, const int nall, ts_ZBLcut, ts_ZBLexpscale, global_e, global_a_0, global_epsilon_0, ts_cutsq); - TSZMF.device->gpu_barrier(); + TSZMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_ufm_ext.cpp b/lib/gpu/lal_ufm_ext.cpp index 432cbb2e63..3f6740f934 100644 --- a/lib/gpu/lal_ufm_ext.cpp +++ b/lib/gpu/lal_ufm_ext.cpp @@ -78,7 +78,7 @@ int ufml_gpu_init(const int ntypes, double **cutsq, double **host_uf1, offset, special_lj, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - UFMLMF.device->gpu_barrier(); + UFMLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } @@ -106,7 +106,7 @@ void ufml_gpu_reinit(const int ntypes, double **cutsq, double **host_uf1, for (int i=0; igpu_barrier(); + UFMLMF.device->serialize_init(); } } diff --git a/lib/gpu/lal_vashishta_ext.cpp b/lib/gpu/lal_vashishta_ext.cpp index ecbdefed19..2567688a74 100644 --- a/lib/gpu/lal_vashishta_ext.cpp +++ b/lib/gpu/lal_vashishta_ext.cpp @@ -89,7 +89,7 @@ int vashishta_gpu_init(const int ntypes, const int inum, const int nall, const i lam4inv, zizj, mbigd, dvrc, big6w, heta, bigh, bigw, c0, costheta, bigb, big2b, bigc); - VashishtaMF.device->gpu_barrier(); + VashishtaMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_yukawa_colloid_ext.cpp b/lib/gpu/lal_yukawa_colloid_ext.cpp index db86f91689..990a208c3c 100644 --- a/lib/gpu/lal_yukawa_colloid_ext.cpp +++ b/lib/gpu/lal_yukawa_colloid_ext.cpp @@ -76,7 +76,7 @@ int ykcolloid_gpu_init(const int ntypes, double **cutsq, double **host_a, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen, kappa); - YKCOLLMF.device->gpu_barrier(); + YKCOLLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_yukawa_ext.cpp b/lib/gpu/lal_yukawa_ext.cpp index cf2bf89e3d..062bf8d101 100644 --- a/lib/gpu/lal_yukawa_ext.cpp +++ b/lib/gpu/lal_yukawa_ext.cpp @@ -76,7 +76,7 @@ int yukawa_gpu_init(const int ntypes, double **cutsq, double kappa, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - YKMF.device->gpu_barrier(); + YKMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/gpu/lal_zbl_ext.cpp b/lib/gpu/lal_zbl_ext.cpp index ee7794af2d..e052380546 100644 --- a/lib/gpu/lal_zbl_ext.cpp +++ b/lib/gpu/lal_zbl_ext.cpp @@ -79,7 +79,7 @@ int zbl_gpu_init(const int ntypes, double **cutsq, double **host_sw1, cut_globalsq, cut_innersq, cut_inner, inum, nall, max_nbors, maxspecial, cell_size, gpu_split, screen); - ZBLMF.device->gpu_barrier(); + ZBLMF.device->serialize_init(); if (message) fprintf(screen,"Done.\n"); } diff --git a/lib/kokkos/BUILD.md b/lib/kokkos/BUILD.md index 114baf99f1..a8985ef1fd 100644 --- a/lib/kokkos/BUILD.md +++ b/lib/kokkos/BUILD.md @@ -27,7 +27,7 @@ When configuring your project just set: -DKokkos_ROOT=${kokkos_install_prefix} \ -DCMAKE_CXX_COMPILER=${compiler_used_to_build_kokkos} ```` -Note: You may need the following if using some versions of CMake (e.g. 3.12): +Note: You may need the following if your project requires a minimum CMake version older than 3.12: ````cmake cmake_policy(SET CMP0074 NEW) ```` @@ -171,6 +171,9 @@ Options can be enabled by specifying `-DKokkos_ENABLE_X`. * Kokkos_ENABLE_HPX_ASYNC_DISPATCH * Whether HPX supports asynchronous dispatch * BOOL Default: OFF +* Kokkos_ENABLE_IMPL_CUDA_MALLOC_ASYNC + * Whether to enable CudaMallocAsync (requires CUDA Toolkit 11.2). This is an experimental performance feature and currently has issue when using with UCX. See https://github.com/kokkos/kokkos/issues/4228 for more details. + * BOOL Default: OFF * Kokkos_ENABLE_LARGE_MEM_TESTS * Whether to perform extra large memory tests * BOOL_Default: OFF @@ -235,6 +238,9 @@ The following options control `find_package` paths for CMake-based TPLs: ## Architecture Keywords Architecture-specific optimizations can be enabled by specifying `-DKokkos_ARCH_X`. +* Kokkos_ARCH_NATIVE + * Whether to optimize for the the local CPU architecture + * BOOL Default: OFF * Kokkos_ARCH_AMDAVX * Whether to optimize for the AMDAVX architecture * BOOL Default: OFF @@ -310,12 +316,24 @@ Architecture-specific optimizations can be enabled by specifying `-DKokkos_ARCH_ * Kokkos_ARCH_POWER9 * Whether to optimize for the POWER9 architecture * BOOL Default: OFF +* Kokkos_ARCH_ICL + * Whether to optimize for the ICL architecture + * BOOL Default: OFF +* Kokkos_ARCH_ICX + * Whether to optimize for the ICX architecture + * BOOL Default: OFF +* Kokkos_ARCH_SKL + * Whether to optimize for the SKL architecture + * BOOL Default: OFF * Kokkos_ARCH_SKX * Whether to optimize for the SKX architecture * BOOL Default: OFF * Kokkos_ARCH_SNB * Whether to optimize for the SNB architecture * BOOL Default: OFF +* Kokkos_ARCH_SPR + * Whether to optimize for the SPR architecture + * BOOL Default: OFF * Kokkos_ARCH_TURING75 * Whether to optimize for the TURING75 architecture * BOOL Default: OFF diff --git a/lib/kokkos/CHANGELOG.md b/lib/kokkos/CHANGELOG.md index a908507704..e81f294451 100644 --- a/lib/kokkos/CHANGELOG.md +++ b/lib/kokkos/CHANGELOG.md @@ -1,5 +1,157 @@ # Change Log +## [3.7.00](https://github.com/kokkos/kokkos/tree/3.7.00) (2022-08-22) +[Full Changelog](https://github.com/kokkos/kokkos/compare/3.6.01...3.7.00) + +### Features: +- Use non-volatile `join()` member functions and `operator+=` in `parallel_reduce/scan` [\#4931](https://github.com/kokkos/kokkos/pull/4931) [\#4954](https://github.com/kokkos/kokkos/pull/4954) [\#4951](https://github.com/kokkos/kokkos/pull/4951) +- Add `SIMD` sub package (requires C++17) [\#5016](https://github.com/kokkos/kokkos/pull/5016) +- Add `is_finalized()` [\#5247](https://github.com/kokkos/kokkos/pull/5247) +- Promote mathematical functions from `namespace Kokkos::Experimental` to `namespace Kokkos` [\#4791](https://github.com/kokkos/kokkos/pull/4791) +- Promote `min`, `max`, `clamp`, `minmax` functions from `namespace Kokkos::Experimental` to `namespace Kokkos` [\#5170](https://github.com/kokkos/kokkos/pull/5170) +- Add `round`, `logb`, `nextafter`, `copysign`, and `signbit` math functions [\#4768](https://github.com/kokkos/kokkos/pull/4768) +- Add `HIPManagedSpace`, similar to `CudaUVMSpace` [\#5112](https://github.com/kokkos/kokkos/pull/5112) +- Accept view construction allocation properties in `create_mirror[_view,_view_and_copy]` and `resize/realloc` [\#5125](https://github.com/kokkos/kokkos/pull/5125) [\#5095](https://github.com/kokkos/kokkos/pull/5095) [\#5035](https://github.com/kokkos/kokkos/pull/5035) [\#4805](https://github.com/kokkos/kokkos/pull/4805) [\#4844](https://github.com/kokkos/kokkos/pull/4844) +- Allow `MemorySpace::allocate()` to be called with execution space [\#4826](https://github.com/kokkos/kokkos/pull/4826) +- Experimental: Compile time view subscriber [\#4197](https://github.com/kokkos/kokkos/pull/4197) + +### Backends and Archs Enhancements: +- Add support for Sapphire Rapids Intel architecture [\#5015](https://github.com/kokkos/kokkos/pull/5015) +- Add support for ICX, SKL and ICL Intel architectures [\#5013](https://github.com/kokkos/kokkos/pull/5013) [\#4929](https://github.com/kokkos/kokkos/pull/4929) +- Add arch flags for Intel GPU Ponte Vecchio [\#4932](https://github.com/kokkos/kokkos/pull/4932) +- SYCL: require GPU if GPU architecture was set at configuration time (i.e. do not allow fallback to CPU device) [\#5264](https://github.com/kokkos/kokkos/pull/5264) [\#5222](https://github.com/kokkos/kokkos/pull/5222) +- SYCL: Add `SYCL::sycl_queue()` for interoperability [\#5241](https://github.com/kokkos/kokkos/pull/5241) +- SYCL: Loosen restriction for using built-in `sycl::group_broadcast` [\#4552](https://github.com/kokkos/kokkos/pull/4552) +- SYCL: preserve address space [\#4396](https://github.com/kokkos/kokkos/pull/4396) +- OpenMPTarget: Adding a workaound for team scan [\#5219](https://github.com/kokkos/kokkos/pull/5219) +- OpenMPTarget: Adding logic to skip the kernel launch if `league_size=0` [\#5067](https://github.com/kokkos/kokkos/pull/5067) +- OpenMPTarget: Make sure `Kokkos::abort()` causes abnormal program termination when called on the host-side [\#4808](https://github.com/kokkos/kokkos/pull/4808) +- HIP: Make HIPHostPinnedSpace coarse-grained [\#5152](https://github.com/kokkos/kokkos/pull/5152) +- Refactor OpenMP `parallel_for` implementation to use more native OpenMP constructs [\#4664](https://github.com/kokkos/kokkos/pull/4664) +- Add option to optimize for local CPU architecture `Kokkos_ARCH_NATIVE` [\#4930](https://github.com/kokkos/kokkos/pull/4930) + + +### Implemented enhancements +- Add command line argument/environment variable to print the configuration [\#5233](https://github.com/kokkos/kokkos/pull/5233) +- Improve error message in view memory access violations [\#4950](https://github.com/kokkos/kokkos/pull/4950) +- Remove unnecessary fences in View initialization [\#4823](https://github.com/kokkos/kokkos/pull/4823) +- Make `View::shmem_size()` device-callable [\#4936](https://github.com/kokkos/kokkos/pull/4936) +- Update numerics support for `__float128` [\#5081](https://github.com/kokkos/kokkos/pull/5081) +- Add `log10` overload for `Kokkos::complex` [\#5009](https://github.com/kokkos/kokkos/pull/5009) +- Add `[[nodiscard]]` to `ScopeGuard` [\#5224](https://github.com/kokkos/kokkos/pull/5224) +- Add structured binding support for `Kokkos::Array` [\#4962](https://github.com/kokkos/kokkos/pull/4962) +- Enable accessing `Kokkos::Array` elements in constant expressions [\#4916](https://github.com/kokkos/kokkos/pull/4916) +- Mark `as_view_of_rank_n` as KOKKOS_FUNCTION [\#5248](https://github.com/kokkos/kokkos/pull/5248) +- Cleanup/rework fence overloads [\#5148](https://github.com/kokkos/kokkos/pull/5148) +- Assert that `Layout` construction from extents is valid in functions taking integer extents [\#5209](https://github.com/kokkos/kokkos/pull/5209) +- Add `fill_random` overload that takes an execution space as first argument [\#5181](https://github.com/kokkos/kokkos/pull/5181) +- Avoid some unnecessary fences in `parallel_reduce/scan` [\#5154](https://github.com/kokkos/kokkos/pull/5154) +- Include `KOKKOS_ENABLE_LIBDL` in options when printing configuration [\#5086](https://github.com/kokkos/kokkos/pull/5086) +- DynRankView: make `layout()` return the same as a corresponding static View [\#5026](https://github.com/kokkos/kokkos/pull/5026) +- Use `_mm_malloc` for icpx [\#5012](https://github.com/kokkos/kokkos/pull/5012) +- Avoid forcing matching execution spaces in `BinSort` constructor and `sort()` [\#4919](https://github.com/kokkos/kokkos/pull/4919) +- Check number of bins in `BinSort` [\#4890](https://github.com/kokkos/kokkos/pull/4890) +- Improve performance in parallel STL-like algorithms [\#4887](https://github.com/kokkos/kokkos/pull/4887) [\#4886](https://github.com/kokkos/kokkos/pull/4886) +- Disable `memset` on A64FX and launch `parallel_for` instead (performance) [\#4884](https://github.com/kokkos/kokkos/pull/4884) +- Allow non-power-of-two team sizes for team reductions and scans [\#4809](https://github.com/kokkos/kokkos/pull/4809) + +#### Harmonization of Kokkos execution environment initialization: +- Warn when unable to detect local MPI rank and user explicitly asked for it [\#5263](https://github.com/kokkos/kokkos/pull/5263) +- Refactor parsing of command line arguments and environment variables [\#5221](https://github.com/kokkos/kokkos/pull/5221) +- Refactor device selection at initialization [\#5211](https://github.com/kokkos/kokkos/pull/5211) +- Rename tools settings for consistency [\#5201](https://github.com/kokkos/kokkos/pull/5201) +- Print help only once [\#5128](https://github.com/kokkos/kokkos/pull/5128) +- Update precedence rule in initialization [\#5130](https://github.com/kokkos/kokkos/pull/5130) +- Warn instead of just ignoring user settings when kokkos-tools is disabled [\#5088](https://github.com/kokkos/kokkos/pull/5088) +- Drop numa args in threads backend initialization [\#5127](https://github.com/kokkos/kokkos/pull/5127) +- Warn users when a flag prefixed with -[-]kokkos is not recognized and do not remove it [\#5256](https://github.com/kokkos/kokkos/pull/5256) +- Give back to Core what belongs to Core (aka moving tune_internals option from Tools back to Core) [\#5202](https://github.com/kokkos/kokkos/pull/5202) + +#### Build system updates: +- `nvcc_wrapper`: filter out -pedantic-errors from nvcc options [\#5235](https://github.com/kokkos/kokkos/pull/5235) +- `nvcc_wrapper`: add known nvcc option --source-in-ptx [\#5052](https://github.com/kokkos/kokkos/pull/5052) +- Link libdl as interface library [\#5179](https://github.com/kokkos/kokkos/pull/5179) +- Only show GPU architectures with enabled corresponding backend [\#5119](https://github.com/kokkos/kokkos/pull/5119) +- Enable optional external desul build [\#5021](https://github.com/kokkos/kokkos/pull/5021) [\#5132](https://github.com/kokkos/kokkos/pull/5132) +- Export `Kokkos_CXX_STANDARD` variable with CMake [\#5068](https://github.com/kokkos/kokkos/pull/5068) +- Suppress warnings with nvc++ [\#5031](https://github.com/kokkos/kokkos/pull/5031) +- Disallow multiple host architectures in CMake [\#4996](https://github.com/kokkos/kokkos/pull/4996) +- Do not include compiler warning flags in the compile option of the cmake target [\#4989](https://github.com/kokkos/kokkos/pull/4989) +- AOT flags for OpenMPTarget targeting Intel GPUs [\#4915](https://github.com/kokkos/kokkos/pull/4915) +- Repurpose `Kokkos_ARCH_INTEL_GEN` for SYCL to mean JIT to be conforming with OMPT [\#4894](https://github.com/kokkos/kokkos/pull/4894) +- Replace amdgpu-target with offload-arch [\#4874](https://github.com/kokkos/kokkos/pull/4874) +- Do not enable `kokkos_launch_compiler` when `CMAKE_CXX_COMPILER_LAUNCHER` is set [\#4870](https://github.com/kokkos/kokkos/pull/4870) +- Move CMake version check up [\#4797](https://github.com/kokkos/kokkos/pull/4797) + +### Incompatibilities: +- Remove `KOKKOS_THREAD_LOCAL` [\#5064](https://github.com/kokkos/kokkos/pull/5064) +- Remove `KOKKOS_ENABLE_POSIX_MEMALIGN` [\#5011](https://github.com/kokkos/kokkos/pull/5011) +- Remove unused `KOKKOS_ENABLE_TM` [\#4995](https://github.com/kokkos/kokkos/pull/4995) +- Remove unused cmakedefine `KOKKOS_ENABLE_COMPILER_WARNINGS` [\#4883](https://github.com/kokkos/kokkos/pull/4883) +- Remove unused `KOKKOS_ENABLE_DUALVIEW_MODIFY_CHECK` [\#4882](https://github.com/kokkos/kokkos/pull/4882) +- Drop Instruction Set Architecture (ISA) macros [\#4981](https://github.com/kokkos/kokkos/pull/4981) +- Warn in `ScopeGuard` about illegal usage [\#5250](https://github.com/kokkos/kokkos/pull/5250) + +### Deprecations: +- Guard against non-public header inclusion [\#5178](https://github.com/kokkos/kokkos/pull/5178) +- Raise deprecation warnings if non empty WorkTag class is used [\#5230](https://github.com/kokkos/kokkos/pull/5230) +- Deprecate `parallel_*` overloads taking the label as trailing argument [\#5141](https://github.com/kokkos/kokkos/pull/5141) +- Deprecate nested types in functional [\#5185](https://github.com/kokkos/kokkos/pull/5185) +- Deprecate `InitArguments` struct and replace it with `InitializationSettings` [\#5135](https://github.com/kokkos/kokkos/pull/5135) +- Deprecate `finalize_all()` [\#5134](https://github.com/kokkos/kokkos/pull/5134) +- Deprecate command line arguments (other than `--help`) that are not prefixed with `kokkos-*` [\#5120](https://github.com/kokkos/kokkos/pull/5120) +- Deprecate `--[kokkos-]numa` cmdline arg and `KOKKOS_NUMA` env var [\#5117](https://github.com/kokkos/kokkos/pull/5117) +- Deprecate `--[kokkos-]threads` command line argument in favor of `--[kokkos-]num-threads` [\#5111](https://github.com/kokkos/kokkos/pull/5111) +- Deprecate `Kokkos::common_view_alloc_prop` [\#5059](https://github.com/kokkos/kokkos/pull/5059) +- Deprecate `Kokkos::is_reducer_type` [\#4957](https://github.com/kokkos/kokkos/pull/4957) +- Deprecate `OffsetView` constructors taking `index_list_type` [\#4810](https://github.com/kokkos/kokkos/pull/4810) +- Deprecate overloads of `Kokkos::sort` taking a parameter `bool always_use_kokkos_sort` [\#5382](https://github.com/kokkos/kokkos/issues/5382) +- Warn about `parallel_reduce` cases that call `join()` with volatile-qualified arguments [\#5215](https://github.com/kokkos/kokkos/pull/5215) + +### Bug Fixes: +- CUDA Reductions: Fix data races reported by Nvidia `compute-sanitizer` [\#4855](https://github.com/kokkos/kokkos/pull/4855) +- Work around Intel compiler bug [\#5301](https://github.com/kokkos/kokkos/pull/5301) +- Avoid allocating memory for UniqueToken [\#5300](https://github.com/kokkos/kokkos/pull/5300) +- DynamicView: Properly resize mirror instances after construction [\#5276](https://github.com/kokkos/kokkos/pull/5276) +- Remove Kokkos::Rank limit of 6 ranks [\#5271](https://github.com/kokkos/kokkos/pull/5271) +- Do not forget to set last element to nullptr when removing a flag in `Kokkos::initialize` [\#5272](https://github.com/kokkos/kokkos/pull/5272) +- Fix CUDA+MSVC build issue [\#5261](https://github.com/kokkos/kokkos/pull/5261) +- Fix `DynamicView::resize_serial` [\#5220](https://github.com/kokkos/kokkos/pull/5220) +- Fix cmake default compiler flags for unknown compiler [\#5217](https://github.com/kokkos/kokkos/pull/5217) +- Fix `move_backward` [\#5191](https://github.com/kokkos/kokkos/pull/5191) +- Fixing issue 5196 - missing symbol with intel compiler [\#5207](https://github.com/kokkos/kokkos/pull/5207) +- Preserve `KOKKOS_INVALID_INDEX` in ViewDimension and ArrayLayout construction [\#5188](https://github.com/kokkos/kokkos/pull/5188) +- Finalize `deep_copy_space` early avoiding printing to `std::cerr` for Cuda [\#5151](https://github.com/kokkos/kokkos/pull/5151) +- Use correct policy in Threads MDRange `parallel_reduce` [\#5123](https://github.com/kokkos/kokkos/pull/5123) +- Fix building with NVCC as the CXX compiler while the CUDA backend is not enabled [\#5115](https://github.com/kokkos/kokkos/pull/5115) +- OpenMPTarget Index range fix for MDRange. [\#5089](https://github.com/kokkos/kokkos/pull/5089) +- Fix bug with CUDA's team reduction for empty ranges [\#5079](https://github.com/kokkos/kokkos/pull/5079) +- Fix using `ZeroMemset` for Serial [\#5077](https://github.com/kokkos/kokkos/pull/5077) +- Fix `Kokkos::Vector::push_back` for default execution space [\#5047](https://github.com/kokkos/kokkos/pull/5047) +- ScatterView: Fix ScatterMin/ScatterMax to use proper atomics [\#5045](https://github.com/kokkos/kokkos/pull/5045) +- Fix calling `ZeroMemset` in `deep_copy` [\#5040](https://github.com/kokkos/kokkos/pull/5040) +- Make View self-assignment not produce double-free [\#5024](https://github.com/kokkos/kokkos/pull/5024) +- Guard against unrecognized pragma with intel compilers [\#5019](https://github.com/kokkos/kokkos/pull/5019) +- Fix racing condition in `HIPParallelLaunch` [\#5008](https://github.com/kokkos/kokkos/pull/5008) +- KokkosP: Fix `device_id` in profiling [\#4997](https://github.com/kokkos/kokkos/pull/4997) +- Fix for `Kokkos::vector::insert` into empty vector with begin and end iterators [\#4988](https://github.com/kokkos/kokkos/pull/4988) +- Fix Core header files installation [\#4984](https://github.com/kokkos/kokkos/pull/4984) +- Fix bounds errors with `Kokkos::sort` [\#4980](https://github.com/kokkos/kokkos/pull/4980) +- Fixup let `RangePolicy::set_chunk_size` return a reference to self [\#4918](https://github.com/kokkos/kokkos/pull/4918) +- Fix allocating large Views [\#4907](https://github.com/kokkos/kokkos/pull/4907) +- Fix combined reductions with `Kokkos::View` [\#4896](https://github.com/kokkos/kokkos/pull/4896) +- Fixed `_CUDA_ARCH__` to `__CUDA_ARCH__` for CUDA LDG [\#4893](https://github.com/kokkos/kokkos/pull/4893) +- Fixup `View::access()` truncate parameter pack [\#4876](https://github.com/kokkos/kokkos/pull/4876) +- Fix `abort` with HIP backend for ROCm 5.0.2 and beyond [\#4873](https://github.com/kokkos/kokkos/pull/4873) +- Fix HIP version when printing the configuration [\#4872](https://github.com/kokkos/kokkos/pull/4872) +- Fix scratch lock array when using scratch level 1 [\#4871](https://github.com/kokkos/kokkos/pull/4871) +- Fix Makefile.kokkos to work with fujitsu compiler [\#4867](https://github.com/kokkos/kokkos/pull/4867) +- cmake: Correct link THREADS link option [\#4854](https://github.com/kokkos/kokkos/pull/4854) +- UniqueToken `impl_acquire` function should be device only [\#4819](https://github.com/kokkos/kokkos/pull/4819) +- Fix example calls to non existing static `print_configuration` [\#4806](https://github.com/kokkos/kokkos/pull/4806) +- Fix requests for large team scratch sizes [\#4728](https://github.com/kokkos/kokkos/pull/4728) + + ## [3.6.01](https://github.com/kokkos/kokkos/tree/3.6.01) (2022-05-23) [Full Changelog](https://github.com/kokkos/kokkos/compare/3.6.00...3.6.01) diff --git a/lib/kokkos/CMakeLists.txt b/lib/kokkos/CMakeLists.txt index b0a54118a0..a05bfcdb94 100644 --- a/lib/kokkos/CMakeLists.txt +++ b/lib/kokkos/CMakeLists.txt @@ -1,3 +1,4 @@ +cmake_minimum_required(VERSION 3.16 FATAL_ERROR) # Disable in-source builds to prevent source tree corruption. if( "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}" ) @@ -28,11 +29,6 @@ SET(KOKKOS_SRC_PATH ${Kokkos_SOURCE_DIR}) SET(KOKKOS_PATH ${Kokkos_SOURCE_DIR}) SET(KOKKOS_TOP_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}) -# Needed to simplify syntax of if statements -CMAKE_POLICY(SET CMP0054 NEW) -# Needed to make IN_LIST a valid operator -CMAKE_POLICY(SET CMP0057 NEW) - # Is this a build as part of Trilinos? IF(COMMAND TRIBITS_PACKAGE_DECL) SET(KOKKOS_HAS_TRILINOS ON) @@ -72,7 +68,6 @@ ENDFUNCTION() LIST(APPEND CMAKE_MODULE_PATH cmake/Modules) IF(NOT KOKKOS_HAS_TRILINOS) - cmake_minimum_required(VERSION 3.16 FATAL_ERROR) set(CMAKE_DISABLE_SOURCE_CHANGES ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) @@ -80,7 +75,7 @@ IF(NOT KOKKOS_HAS_TRILINOS) # downstream dependencies need to match this! SET(KOKKOS_COMPILE_LANGUAGE CXX) # use lower case here since we didn't parse options yet - IF (Kokkos_ENABLE_COMPILE_AS_CMAKE_LANGUAGE) + IF (Kokkos_ENABLE_COMPILE_AS_CMAKE_LANGUAGE AND Kokkos_ENABLE_CUDA) # Without this as a language for the package we would get a C++ compiler enabled. # but we still need a C++ compiler even if we build all our cpp files as CUDA only @@ -90,9 +85,7 @@ IF(NOT KOKKOS_HAS_TRILINOS) # days. SET(KOKKOS_INTERNAL_EXTRA_COMPILE_LANGUAGE CXX) - IF (Kokkos_ENABLE_CUDA) - SET(KOKKOS_COMPILE_LANGUAGE CUDA) - ENDIF() + SET(KOKKOS_COMPILE_LANGUAGE CUDA) ENDIF() IF (Spack_WORKAROUND) @@ -135,14 +128,11 @@ ENDIF() set(Kokkos_VERSION_MAJOR 3) -set(Kokkos_VERSION_MINOR 6) -set(Kokkos_VERSION_PATCH 01) +set(Kokkos_VERSION_MINOR 7) +set(Kokkos_VERSION_PATCH 00) set(Kokkos_VERSION "${Kokkos_VERSION_MAJOR}.${Kokkos_VERSION_MINOR}.${Kokkos_VERSION_PATCH}") math(EXPR KOKKOS_VERSION "${Kokkos_VERSION_MAJOR} * 10000 + ${Kokkos_VERSION_MINOR} * 100 + ${Kokkos_VERSION_PATCH}") -MESSAGE(STATUS "Setting policy CMP0074 to use _ROOT variables") -CMAKE_POLICY(SET CMP0074 NEW) - # Load either the real TriBITS or a TriBITS wrapper # for certain utility functions that are universal (like GLOBAL_SET) INCLUDE(${KOKKOS_SRC_PATH}/cmake/fake_tribits.cmake) @@ -204,11 +194,16 @@ KOKKOS_SETUP_BUILD_ENVIRONMENT() OPTION(BUILD_SHARED_LIBS "Build shared libraries" OFF) SET(KOKKOS_EXT_LIBRARIES Kokkos::kokkos Kokkos::kokkoscore Kokkos::kokkoscontainers Kokkos::kokkosalgorithms) -SET(KOKKOS_INT_LIBRARIES kokkos kokkoscore kokkoscontainers kokkosalgorithms) +SET(KOKKOS_SUB_LIBRARIES kokkoscore kokkoscontainers kokkosalgorithms) +IF (KOKKOS_CXX_STANDARD GREATER_EQUAL 17) + LIST(APPEND KOKKOS_EXT_LIBRARIES Kokkos::kokkossimd) + LIST(APPEND KOKKOS_SUB_LIBRARIES kokkossimd) +ENDIF() +SET(KOKKOS_INT_LIBRARIES kokkos ${KOKKOS_SUB_LIBRARIES}) SET_PROPERTY(GLOBAL PROPERTY KOKKOS_INT_LIBRARIES ${KOKKOS_INT_LIBRARIES}) IF (KOKKOS_HAS_TRILINOS) - SET(TRILINOS_INCDIR ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}) + SET(TRILINOS_INCDIR ${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}) SET(KOKKOS_HEADER_DIR ${TRILINOS_INCDIR}) SET(KOKKOS_IS_SUBDIRECTORY TRUE) ELSEIF(HAS_PARENT) @@ -296,7 +291,7 @@ IF (NOT KOKKOS_HAS_TRILINOS AND NOT Kokkos_INSTALL_TESTING) #Make sure in-tree projects can reference this as Kokkos:: #to match the installed target names ADD_LIBRARY(Kokkos::kokkos ALIAS kokkos) - TARGET_LINK_LIBRARIES(kokkos INTERFACE kokkoscore kokkoscontainers kokkosalgorithms) + TARGET_LINK_LIBRARIES(kokkos INTERFACE ${KOKKOS_SUB_LIBRARIES}) KOKKOS_INTERNAL_ADD_LIBRARY_INSTALL(kokkos) ENDIF() INCLUDE(${KOKKOS_SRC_PATH}/cmake/kokkos_install.cmake) diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos index 755831452b..7aa04aad7d 100644 --- a/lib/kokkos/Makefile.kokkos +++ b/lib/kokkos/Makefile.kokkos @@ -11,21 +11,21 @@ CXXFLAGS += $(SHFLAGS) endif KOKKOS_VERSION_MAJOR = 3 -KOKKOS_VERSION_MINOR = 6 -KOKKOS_VERSION_PATCH = 01 +KOKKOS_VERSION_MINOR = 7 +KOKKOS_VERSION_PATCH = 00 KOKKOS_VERSION = $(shell echo $(KOKKOS_VERSION_MAJOR)*10000+$(KOKKOS_VERSION_MINOR)*100+$(KOKKOS_VERSION_PATCH) | bc) # Options: Cuda,HIP,SYCL,OpenMPTarget,OpenMP,Threads,Serial KOKKOS_DEVICES ?= "OpenMP" #KOKKOS_DEVICES ?= "Threads" # Options: -# Intel: KNC,KNL,SNB,HSW,BDW,SKX +# Intel: KNC,KNL,SNB,HSW,BDW,SKL,SKX,ICL,ICX,SPR # NVIDIA: Kepler,Kepler30,Kepler32,Kepler35,Kepler37,Maxwell,Maxwell50,Maxwell52,Maxwell53,Pascal60,Pascal61,Volta70,Volta72,Turing75,Ampere80,Ampere86 # ARM: ARMv80,ARMv81,ARMv8-ThunderX,ARMv8-TX2,A64FX # IBM: BGQ,Power7,Power8,Power9 # AMD-GPUS: Vega900,Vega906,Vega908,Vega90A # AMD-CPUS: AMDAVX,Zen,Zen2,Zen3 -# Intel-GPUs: Gen9,Gen11,Gen12LP,DG1,XeHP +# Intel-GPUs: Gen9,Gen11,Gen12LP,DG1,XeHP,PVC KOKKOS_ARCH ?= "" # Options: yes,no KOKKOS_DEBUG ?= "no" @@ -193,6 +193,8 @@ KOKKOS_INTERNAL_COMPILER_INTEL_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VE KOKKOS_INTERNAL_COMPILER_APPLE_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),Apple clang) KOKKOS_INTERNAL_COMPILER_HCC := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),HCC) KOKKOS_INTERNAL_COMPILER_GCC := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),GCC) +# TODO fujitsu can emulate gcc or clang. Only clang mode works at the moment. +KOKKOS_INTERNAL_COMPILER_FUJITSU := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),FUJITSU) # Check Host Compiler if using NVCC through nvcc_wrapper ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) @@ -221,8 +223,23 @@ endif ifeq ($(KOKKOS_INTERNAL_COMPILER_HCC), 1) KOKKOS_INTENAL_COMPILER_CLANG = 0 endif +# Fujitsu passes also as clang and gcc respectively +ifeq ($(KOKKOS_INTERNAL_COMPILER_FUJITSU), 1) + ifeq ($(KOKKOS_INTERNAL_COMPILER_GCC), 1) + # TODO handle gcc flags and workaround for bug? + # fujitsu (gcc mode) is bugged, see https://github.com/kokkos/kokkos/issues/4730 + $(warning Warning: ${CXX} in Trad Mode '-Nnoclang' (default) is not recommended. Use 'CXX = ${CXX} -Nclang' instead.) + # HACK since fujitsu only accepts some gcc flags, disable gcc here? + # KOKKOS_INTERNAL_COMPILER_GCC = 0 + endif + # TODO handle clang flags + # warnings: works fine as is + # openmp: handled + #KOKKOS_INTERNAL_COMPILER_CLANG = 0 +endif ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + # TODO empty variable if fujitsu (clang mode) passes as clang KOKKOS_INTERNAL_COMPILER_CLANG_VERSION := $(shell $(CXX) --version | grep version | cut -d ' ' -f3 | tr -d '.') ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) @@ -272,7 +289,12 @@ else ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY_CLANG), 1) KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp else - KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp=libomp + ifeq ($(KOKKOS_INTERNAL_COMPILER_FUJITSU), 1) + # fujitsu (clang mode) fails with `=libomp` + KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp + else + KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp=libomp + endif endif else ifeq ($(KOKKOS_INTERNAL_COMPILER_APPLE_CLANG), 1) @@ -300,11 +322,15 @@ ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 1) else ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) #KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -DKOKKOS_BUG_WORKAROUND_IBM_CLANG_OMP45_VIEW_INIT -fopenmp-implicit-declare-target -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp -fopenmp=libomp - KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -DKOKKOS_WORKAROUND_OPENMPTARGET_CLANG -fopenmp -fopenmp=libomp + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -DKOKKOS_WORKAROUND_OPENMPTARGET_CLANG -fopenmp -fopenmp=libomp -Wno-openmp-mapping KOKKOS_INTERNAL_OPENMPTARGET_LIB := -lomptarget else - #Assume GCC - KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -fopenmp -foffload=nvptx-none + ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL_CLANG), 1) + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -fiopenmp -Wno-openmp-mapping + else + #Assume GCC + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -fopenmp -foffload=nvptx-none + endif endif endif @@ -344,8 +370,12 @@ KOKKOS_INTERNAL_USE_ARCH_WSM := $(call kokkos_has_string,$(KOKKOS_ARCH),WSM) KOKKOS_INTERNAL_USE_ARCH_SNB := $(call kokkos_has_string,$(KOKKOS_ARCH),SNB) KOKKOS_INTERNAL_USE_ARCH_HSW := $(call kokkos_has_string,$(KOKKOS_ARCH),HSW) KOKKOS_INTERNAL_USE_ARCH_BDW := $(call kokkos_has_string,$(KOKKOS_ARCH),BDW) +KOKKOS_INTERNAL_USE_ARCH_SKL := $(call kokkos_has_string,$(KOKKOS_ARCH),SKL) KOKKOS_INTERNAL_USE_ARCH_SKX := $(call kokkos_has_string,$(KOKKOS_ARCH),SKX) KOKKOS_INTERNAL_USE_ARCH_KNL := $(call kokkos_has_string,$(KOKKOS_ARCH),KNL) +KOKKOS_INTERNAL_USE_ARCH_ICL := $(call kokkos_has_string,$(KOKKOS_ARCH),ICL) +KOKKOS_INTERNAL_USE_ARCH_ICX := $(call kokkos_has_string,$(KOKKOS_ARCH),ICX) +KOKKOS_INTERNAL_USE_ARCH_SPR := $(call kokkos_has_string,$(KOKKOS_ARCH),SPR) KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen) KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN9 := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen9) @@ -353,6 +383,7 @@ KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN11 := $(call kokkos_has_string,$(KOKKOS_ARCH), KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN12LP := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen12LP) KOKKOS_INTERNAL_USE_ARCH_INTEL_DG1 := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelDG1) KOKKOS_INTERNAL_USE_ARCH_INTEL_XEHP := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelXeHP) +KOKKOS_INTERNAL_USE_ARCH_INTEL_PVC := $(call kokkos_has_string,$(KOKKOS_ARCH),PVC) # NVIDIA based. NVCC_WRAPPER := $(KOKKOS_PATH)/bin/nvcc_wrapper @@ -436,19 +467,9 @@ KOKKOS_INTERNAL_USE_ARCH_SSE42 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_W KOKKOS_INTERNAL_USE_ARCH_AVX := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_SNB) + $(KOKKOS_INTERNAL_USE_ARCH_AMDAVX)) KOKKOS_INTERNAL_USE_ARCH_AVX2 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_HSW) + $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN2) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN3)) KOKKOS_INTERNAL_USE_ARCH_AVX512MIC := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KNL)) -KOKKOS_INTERNAL_USE_ARCH_AVX512XEON := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_SKX)) - -# Decide what ISA level we are able to support. -KOKKOS_INTERNAL_USE_ISA_X86_64 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_WSM) + $(KOKKOS_INTERNAL_USE_ARCH_SNB) + $(KOKKOS_INTERNAL_USE_ARCH_HSW) + $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_KNL) + $(KOKKOS_INTERNAL_USE_ARCH_SKX) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN2) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN3)) -KOKKOS_INTERNAL_USE_ISA_KNC := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KNC)) -KOKKOS_INTERNAL_USE_ISA_POWERPCLE := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_POWER8) + $(KOKKOS_INTERNAL_USE_ARCH_POWER9)) -KOKKOS_INTERNAL_USE_ISA_POWERPCBE := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_POWER7)) - -# Decide whether we can support transactional memory -KOKKOS_INTERNAL_USE_TM := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_SKX)) # Incompatible flags? -KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_SSE42)+$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1") | bc) +KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_SSE42)+$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_SKL)+$(KOKKOS_INTERNAL_USE_ARCH_SKX)+$(KOKKOS_INTERNAL_USE_ARCH_ICL)+$(KOKKOS_INTERNAL_USE_ARCH_ICX)+$(KOKKOS_INTERNAL_USE_ARCH_SPR)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1") | bc) KOKKOS_INTERNAL_USE_ARCH_MULTIGPU := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_NVIDIA)>1") | bc) ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MULTIHOST), 1) @@ -551,36 +572,6 @@ ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_SERIAL") endif -ifeq ($(KOKKOS_INTERNAL_USE_TM), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_TM") - tmp := $(call kokkos_append_header,"$H""endif") -endif - -ifeq ($(KOKKOS_INTERNAL_USE_ISA_X86_64), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_USE_ISA_X86_64") - tmp := $(call kokkos_append_header,"$H""endif") -endif - -ifeq ($(KOKKOS_INTERNAL_USE_ISA_KNC), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_USE_ISA_KNC") - tmp := $(call kokkos_append_header,"$H""endif") -endif - -ifeq ($(KOKKOS_INTERNAL_USE_ISA_POWERPCLE), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_USE_ISA_POWERPCLE") - tmp := $(call kokkos_append_header,"$H""endif") -endif - -ifeq ($(KOKKOS_INTERNAL_USE_ISA_POWERPCBE), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_USE_ISA_POWERPCBE") - tmp := $(call kokkos_append_header,"$H""endif") -endif - #only add the c++ standard flags if this is not CMake tmp := $(call kokkos_append_header,"/* General Settings */") ifneq ($(KOKKOS_INTERNAL_DISABLE_DEPRECATED_CODE), 1) @@ -1041,7 +1032,28 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC), 1) endif endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON), 1) +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_SKL), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") + + ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) + KOKKOS_CXXFLAGS += -xSKYLAKE + KOKKOS_LDFLAGS += -xSKYLAKE + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) + + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) + + else + # Nothing here yet. + KOKKOS_CXXFLAGS += -march=skylake + KOKKOS_LDFLAGS += -march=skylake + endif + endif + endif +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_SKX), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) @@ -1055,13 +1067,31 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON), 1) else # Nothing here yet. - KOKKOS_CXXFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 -mrtm - KOKKOS_LDFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 -mrtm + KOKKOS_CXXFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 + KOKKOS_LDFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 endif endif endif endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ICL), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") + KOKKOS_CXXFLAGS += -march=icelake-client -mtune=icelake-client + KOKKOS_LDFLAGS += -march=icelake-client -mtune=icelake-client +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ICX), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") + KOKKOS_CXXFLAGS += -march=icelake-server -mtune=icelake-server + KOKKOS_LDFLAGS += -march=icelake-server -mtune=icelake-server +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_SPR), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") + KOKKOS_CXXFLAGS += -march=sapphirerapids -mtune=sapphirerapids + KOKKOS_LDFLAGS += -march=sapphirerapids -mtune=sapphirerapids +endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KNC), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_KNC") KOKKOS_CXXFLAGS += -mmic @@ -1091,7 +1121,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - KOKKOS_INTERNAL_CUDA_ARCH_FLAG=-fopenmp-targets=nvptx64-nvidia-cuda -Xopenmp-target -march + KOKKOS_INTERNAL_CUDA_ARCH_FLAG=-fopenmp-targets=nvptx64 -Xopenmp-target -march endif KOKKOS_INTERNAL_USE_CUDA_ARCH = 1 endif @@ -1192,29 +1222,29 @@ ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA900), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA900") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") - KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx900 + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx900 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA906), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA906") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") - KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx906 + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx906 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA908), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA908") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") - KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx908 + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx908 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA90A), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA90A") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") - KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx90a + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx90a endif KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/HIP/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/HIP/*.hpp) ifeq ($(KOKKOS_INTERNAL_DISABLE_DESUL_ATOMICS), 0) - KOKKOS_SRC += $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_HIP.cpp + KOKKOS_SRC += $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_HIP.cpp endif KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_HIP_ARCH_FLAG) @@ -1230,51 +1260,67 @@ ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) endif endif -# Figure out the architecture flag for SYCL. +# Figure out Intel architecture flags. ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) - # Lets start with adding architecture defines - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen9-" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN9), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN9") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen9" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN11), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN11") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen11" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN12LP), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN12LP") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen12lp" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_DG1), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_DG1") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device dg1" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_XEHP), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_XEHP") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device xehp" - endif + KOKKOS_INTERNAL_LC_BACKEND := sycl +endif +ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) + KOKKOS_INTERNAL_LC_BACKEND := openmp +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64 +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN9), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN9") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device gen9" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN11), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN11") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device gen11" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN12LP), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN12LP") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device gen12lp" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_DG1), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_DG1") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device dg1" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_XEHP), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_XEHP") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device xehp" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_PVC), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_PVC") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device 12.4.0" +endif +ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/SYCL/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/SYCL/*.hpp) - KOKKOS_CXXFLAGS+=-fsycl -fno-sycl-id-queries-fit-in-int -fsycl-unnamed-lambda - KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_SYCL_ARCH_FLAG) + KOKKOS_CXXFLAGS+=-fsycl -fno-sycl-id-queries-fit-in-int -fsycl-unnamed-lambda -fsycl-dead-args-optimization + KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_INTEL_ARCH_FLAG) KOKKOS_LDFLAGS+=-fsycl - KOKKOS_LDFLAGS+=$(KOKKOS_INTERNAL_SYCL_ARCH_FLAG) + KOKKOS_LDFLAGS+=$(KOKKOS_INTERNAL_INTEL_ARCH_FLAG) +endif + +ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) + KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_INTEL_ARCH_FLAG) -D__STRICT_ANSI__ + KOKKOS_LDFLAGS+=$(KOKKOS_INTERNAL_INTEL_ARCH_FLAG) endif ifeq ($(KOKKOS_INTERNAL_DISABLE_DESUL_ATOMICS), 0) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_IMPL_DESUL_ATOMICS") + KOKKOS_CPPFLAGS+=-I$(KOKKOS_PATH)/tpls/desul/include else ifeq ($(KOKKOS_INTERNAL_ENABLE_DESUL_ATOMICS), 1) $(error Contradictory Desul atomics options: KOKKOS_OPTIONS=$(KOKKOS_OPTIONS) ) @@ -1359,7 +1405,7 @@ KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/containers/src/impl/*.cpp) ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.cpp) ifeq ($(KOKKOS_INTERNAL_DISABLE_DESUL_ATOMICS), 0) - KOKKOS_SRC += $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp + KOKKOS_SRC += $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_CUDA.cpp endif KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.hpp) ifneq ($(CUDA_PATH),) @@ -1417,6 +1463,11 @@ ifeq ($(KOKKOS_INTERNAL_USE_THREADS), 1) KOKKOS_TPL_LIBRARY_NAMES += pthread endif +ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) + KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Serial/*.cpp) + KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Serial/*.hpp) +endif + ifeq ($(KOKKOS_INTERNAL_USE_HPX), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/HPX/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/HPX/*.hpp) @@ -1449,15 +1500,6 @@ ifneq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_HBWSpace.cpp,$(KOKKOS_SRC)) endif -# Don't include Kokkos_Serial.cpp or Kokkos_Serial_Task.cpp if not using Serial -# device to avoid a link warning. -ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) -endif -ifneq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) - KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial.cpp,$(KOKKOS_SRC)) - KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial_Task.cpp,$(KOKKOS_SRC)) -endif - # With Cygwin functions such as fdopen and fileno are not defined # when strict ansi is enabled. strict ansi gets enabled with -std=c++14 # though. So we hard undefine it here. Not sure if that has any bad side effects diff --git a/lib/kokkos/Makefile.targets b/lib/kokkos/Makefile.targets index a9cb12e1b4..876726e947 100644 --- a/lib/kokkos/Makefile.targets +++ b/lib/kokkos/Makefile.targets @@ -16,10 +16,6 @@ Kokkos_HostSpace.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Ho $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_HostSpace.cpp Kokkos_hwloc.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_hwloc.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_hwloc.cpp -Kokkos_Serial.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial.cpp -Kokkos_Serial_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial_Task.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial_Task.cpp Kokkos_TaskQueue.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_TaskQueue.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_TaskQueue.cpp Kokkos_HostThreadTeam.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_HostThreadTeam.cpp @@ -41,6 +37,13 @@ Kokkos_HostSpace_deepcopy.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/ Kokkos_NumericTraits.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_NumericTraits.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_NumericTraits.cpp +ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) +Kokkos_Serial.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial.cpp +Kokkos_Serial_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial_Task.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial_Task.cpp +endif + ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) Kokkos_Cuda_Instance.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Instance.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Instance.cpp @@ -50,8 +53,8 @@ Kokkos_Cuda_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cu $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Task.cpp Kokkos_Cuda_Locks.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Locks.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Locks.cpp -Lock_Array_CUDA.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp +Lock_Array_CUDA.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_CUDA.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_CUDA.cpp endif ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) @@ -70,20 +73,18 @@ Kokkos_HIP_Instance.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/HIP/Kokkos_ $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/HIP/Kokkos_HIP_Instance.cpp Kokkos_HIP_Locks.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/HIP/Kokkos_HIP_Locks.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/HIP/Kokkos_HIP_Locks.cpp -Lock_Array_HIP.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_HIP.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_HIP.cpp +Lock_Array_HIP.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_HIP.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_HIP.cpp endif ifeq ($(KOKKOS_INTERNAL_USE_THREADS), 1) -Kokkos_ThreadsExec_base.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Threads/Kokkos_ThreadsExec_base.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Threads/Kokkos_ThreadsExec_base.cpp Kokkos_ThreadsExec.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Threads/Kokkos_ThreadsExec.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Threads/Kokkos_ThreadsExec.cpp endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) -Kokkos_OpenMP_Exec.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp +Kokkos_OpenMP_Instance.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Instance.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Instance.cpp Kokkos_OpenMP_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Task.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Task.cpp endif diff --git a/lib/kokkos/README.md b/lib/kokkos/README.md index f6c500cc1a..033346e956 100644 --- a/lib/kokkos/README.md +++ b/lib/kokkos/README.md @@ -10,270 +10,48 @@ hierarchies and multiple types of execution resources. It currently can use CUDA, HIP, SYCL, HPX, OpenMP and C++ threads as backend programming models with several other backends in development. -Kokkos Core is part of the Kokkos C++ Performance Portability Programming EcoSystem, -which also provides math kernels (https://github.com/kokkos/kokkos-kernels), as well as -profiling and debugging tools (https://github.com/kokkos/kokkos-tools). +**Kokkos Core is part of the Kokkos C++ Performance Portability Programming EcoSystem.** + +For the complete documentation, click below: + +# [kokkos.github.io/kokkos-core-wiki](https://kokkos.github.io/kokkos-core-wiki) # Learning about Kokkos -The best way to start learning about Kokkos is going through the Kokkos Lectures. -They are online available at https://kokkos.link/the-lectures and contain a mix -of lecture videos and hands-on exercises covering all the important Kokkos Ecosystem -capabilities. +To start learning about Kokkos: -A programming guide and API reference can be found on the Wiki -(https://github.com/kokkos/kokkos/wiki). +- [Kokkos Lectures](https://kokkos.github.io/kokkos-core-wiki/videolectures.html): they contain a mix of lecture videos and hands-on exercises covering all the important Kokkos Ecosystem capabilities. + +- [Programming guide](https://kokkos.github.io/kokkos-core-wiki/programmingguide.html): contains in "narrative" form a technical description of the programming model, machine model, and the main building blocks like the Views and parallel dispatch. + +- [API reference](https://kokkos.github.io/kokkos-core-wiki/): organized by category, i.e., [core](https://kokkos.github.io/kokkos-core-wiki/API/core-index.html), [algorithms](https://kokkos.github.io/kokkos-core-wiki/API/algorithms-index.html) and [containers](https://kokkos.github.io/kokkos-core-wiki/API/containers-index.html) or, if you prefer, in [alphabetical order](https://kokkos.github.io/kokkos-core-wiki/API/alphabetical.html). + +- [Use cases and Examples](https://kokkos.github.io/kokkos-core-wiki/usecases.html): a series of examples ranging from how to use Kokkos with MPI to Fortran interoperability. For questions find us on Slack: https://kokkosteam.slack.com or open a github issue. -For non-public questions send an email to -crtrott(at)sandia.gov +For non-public questions send an email to: *crtrott(at)sandia.gov* # Contributing to Kokkos -We are open and try to encourage contributions from external developers. -To do so please first open an issue describing the contribution and then issue -a pull request against the develop branch. For larger features it may be good -to get guidance from the core development team first through the github issue. +Please see [this page](https://kokkos.github.io/kokkos-core-wiki/contributing.html) for details on how to contribute. -Note that Kokkos Core is licensed under standard 3-clause BSD terms of use. -Which means contributing to Kokkos allows anyone else to use your contributions -not just for public purposes but also for closed source commercial projects. -For specifics see the LICENSE file contained in the repository or distribution. +# Requirements, Building and Installing -# Requirements - -### Minimum Compiler Versions - -Generally Kokkos should work with all compiler versions newer than the minimum. -However as in all sufficiently complex enough code, we have to work around compiler -bugs with almost all compilers. So compiler versions we don't test may have issues -we are unaware of. - -* GCC: 5.3.0 -* Clang: 4.0.0 -* Intel: 17.0.1 -* NVCC: 9.2.88 -* NVC++: 21.5 -* ROCm: 4.3 -* MSVC: 19.29 -* IBM XL: 16.1.1 -* Fujitsu: 4.5.0 -* ARM/Clang 20.1 - -### Primary Tested Compilers - -* GCC: 5.3.0, 6.1.0, 7.3.0, 8.3, 9.2, 10.0 -* NVCC: 9.2.88, 10.1, 11.0 -* Clang: 8.0.0, 9.0.0, 10.0.0, 12.0.0 -* Intel 17.4, 18.1, 19.5 -* MSVC: 19.29 -* ARM/Clang: 20.1 -* IBM XL: 16.1.1 -* ROCm: 4.3.0 - -### Build system: - -* CMake >= 3.16: required -* CMake >= 3.18: Fortran linkage. This does not affect most mixed Fortran/Kokkos builds. See [build issues](BUILD.md#KnownIssues). -* CMake >= 3.21.1 for NVC++ - -Primary tested compiler are passing in release mode -with warnings as errors. They also are tested with a comprehensive set of -backend combinations (i.e. OpenMP, Threads, Serial, OpenMP+Serial, ...). -We are using the following set of flags: -* GCC: - ```` - -Wall -Wunused-parameter -Wshadow -pedantic - -Werror -Wsign-compare -Wtype-limits - -Wignored-qualifiers -Wempty-body - -Wclobbered -Wuninitialized - ```` -* Intel: - ```` - -Wall -Wunused-parameter -Wshadow -pedantic - -Werror -Wsign-compare -Wtype-limits - -Wuninitialized - ```` -* Clang: - ```` - -Wall -Wunused-parameter -Wshadow -pedantic - -Werror -Wsign-compare -Wtype-limits - -Wuninitialized - ```` - -* NVCC: - ```` - -Wall -Wunused-parameter -Wshadow -pedantic - -Werror -Wsign-compare -Wtype-limits - -Wuninitialized - ```` - -Other compilers are tested occasionally, in particular when pushing from develop to -master branch. These are tested less rigorously without `-Werror` and only for a select set of backends. - -# Building and Installing Kokkos -Kokkos provide a CMake build system and a raw Makefile build system. -The CMake build system is strongly encouraged and will be the most rigorously supported in future releases. -Full details are given in the [build instructions](BUILD.md). Basic setups are shown here: - -## CMake - -The best way to install Kokkos is using the CMake build system. Assuming Kokkos lives in `$srcdir`: -````bash -cmake $srcdir \ - -DCMAKE_CXX_COMPILER=$path_to_compiler \ - -DCMAKE_INSTALL_PREFIX=$path_to_install \ - -DKokkos_ENABLE_OPENMP=On \ - -DKokkos_ARCH_HSW=On \ - -DKokkos_HWLOC_DIR=$path_to_hwloc -```` -then simply type `make install`. The Kokkos CMake package will then be installed in `$path_to_install` to be used by downstream packages. - -To validate the Kokkos build, configure with -```` - -DKokkos_ENABLE_TESTS=On -```` -and run `make test` after completing the build. - -For your CMake project using Kokkos, code such as the following: - -````cmake -find_package(Kokkos) -... -target_link_libraries(myTarget Kokkos::kokkos) -```` -should be added to your CMakeLists.txt. Your configure should additionally include -```` --DKokkos_DIR=$path_to_install/cmake/lib/Kokkos -```` -or -```` --DKokkos_ROOT=$path_to_install -```` -for the install location given above. - -## Spack -An alternative to manually building with the CMake is to use the Spack package manager. -To get started, download the Spack [repo](https://github.com/spack/spack). -```` -A basic installation would be done as: -````bash -> spack install kokkos -```` -Spack allows options and and compilers to be tuned in the install command. -````bash -> spack install kokkos@3.0 %gcc@7.3.0 +openmp -```` -This example illustrates the three most common parameters to Spack: -* Variants: specified with, e.g. `+openmp`, this activates (or deactivates with, e.g. `~openmp`) certain options. -* Version: immediately following `kokkos` the `@version` can specify a particular Kokkos to build -* Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the `%`option. - -For a complete list of Kokkos options, run: -````bash -> spack info kokkos -```` -Spack currently installs packages to a location determined by a unique hash. This hash name is not really "human readable". -Generally, Spack usage should never really require you to reference the computer-generated unique install folder. -More details are given in the [build instructions](BUILD.md). If you must know, you can locate Spack Kokkos installations with: -````bash -> spack find -p kokkos ... -```` -where `...` is the unique spec identifying the particular Kokkos configuration and version. -Some more details can found in the Kokkos spack [documentation](Spack.md) or the Spack [website](https://spack.readthedocs.io/en/latest). - -## Raw Makefile - -Raw Makefiles are only supported via inline builds. See below. - -## Inline Builds vs. Installed Package -For individual projects, it may be preferable to build Kokkos inline rather than link to an installed package. -The main reason is that you may otherwise need many different -configurations of Kokkos installed depending on the required compile time -features an application needs. For example there is only one default -execution space, which means you need different installations to have OpenMP -or C++ threads as the default space. Also for the CUDA backend there are certain -choices, such as allowing relocatable device code, which must be made at -installation time. Building Kokkos inline uses largely the same process -as compiling an application against an installed Kokkos library. - -For CMake, this means copying over the Kokkos source code into your project and adding `add_subdirectory(kokkos)` to your CMakeLists.txt. - -For raw Makefiles, see the example benchmarks/bytes_and_flops/Makefile which can be used with an installed library and or an inline build. - -# Kokkos and CUDA UVM - -Kokkos does support UVM as a specific memory space called CudaUVMSpace. -Allocations made with that space are accessible from host and device. -You can tell Kokkos to use that as the default space for Cuda allocations. -In either case UVM comes with a number of restrictions: -* You can't access allocations on the host while a kernel is potentially -running. This will lead to segfaults. To avoid that you either need to -call Kokkos::Cuda::fence() (or just Kokkos::fence()), after kernels, or -you can set the environment variable CUDA_LAUNCH_BLOCKING=1. -* In multi socket multi GPU machines without NVLINK, UVM defaults -to using zero copy allocations for technical reasons related to using multiple -GPUs from the same process. If an executable doesn't do that (e.g. each -MPI rank of an application uses a single GPU [can be the same GPU for -multiple MPI ranks]) you can set CUDA_MANAGED_FORCE_DEVICE_ALLOC=1. -This will enforce proper UVM allocations, but can lead to errors if -more than a single GPU is used by a single process. +All requirements including minimum and primary tested compiler versions can be found [here](https://kokkos.github.io/kokkos-core-wiki/requirements.html). +Building and installation instructions are described [here](https://kokkos.github.io/kokkos-core-wiki/building.html). # Citing Kokkos -If you publish work which mentions Kokkos, please cite the following paper: +Please see the [following page](https://kokkos.github.io/kokkos-core-wiki/citation.html). -````BibTex -@ARTICLE{9485033, - author={Trott, Christian R. and Lebrun-Grandié, Damien and Arndt, Daniel and Ciesko, Jan and Dang, Vinh and Ellingwood, Nathan and Gayatri, Rahulkumar and Harvey, Evan and Hollman, Daisy S. and Ibanez, Dan and Liber, Nevin and Madsen, Jonathan and Miles, Jeff and Poliakoff, David and Powell, Amy and Rajamanickam, Sivasankaran and Simberg, Mikael and Sunderland, Dan and Turcksin, Bruno and Wilke, Jeremiah}, - journal={IEEE Transactions on Parallel and Distributed Systems}, - title={Kokkos 3: Programming Model Extensions for the Exascale Era}, - year={2022}, - volume={33}, - number={4}, - pages={805-817}, - doi={10.1109/TPDS.2021.3097283}} -```` - -If you use more than one Kokkos EcoSystem package, please also cite: - -````BibTex -@ARTICLE{9502936, - author={Trott, Christian and Berger-Vergiat, Luc and Poliakoff, David and Rajamanickam, Sivasankaran and Lebrun-Grandie, Damien and Madsen, Jonathan and Al Awar, Nader and Gligoric, Milos and Shipman, Galen and Womeldorff, Geoff}, - journal={Computing in Science Engineering}, - title={The Kokkos EcoSystem: Comprehensive Performance Portability for High Performance Computing}, - year={2021}, - volume={23}, - number={5}, - pages={10-18}, - doi={10.1109/MCSE.2021.3098509}} -```` - - -And if you feel generous: feel free to cite the original Kokkos paper which describes most of the basic Kokkos concepts: - -````BibTeX -@article{CarterEdwards20143202, - title = "Kokkos: Enabling manycore performance portability through polymorphic memory access patterns ", - journal = "Journal of Parallel and Distributed Computing ", - volume = "74", - number = "12", - pages = "3202 - 3216", - year = "2014", - note = "Domain-Specific Languages and High-Level Frameworks for High-Performance Computing ", - issn = "0743-7315", - doi = "https://doi.org/10.1016/j.jpdc.2014.07.003", - url = "http://www.sciencedirect.com/science/article/pii/S0743731514001257", - author = "H. Carter Edwards and Christian R. Trott and Daniel Sunderland" -} -```` - -##### [LICENSE](https://github.com/kokkos/kokkos/blob/master/LICENSE) +# License [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software. +The full license statement used in all headers is available [here](https://kokkos.github.io/kokkos-core-wiki/license.html) or +[here](https://github.com/kokkos/kokkos/blob/master/LICENSE). diff --git a/lib/kokkos/algorithms/src/CMakeLists.txt b/lib/kokkos/algorithms/src/CMakeLists.txt index 4b60d887f7..597626b111 100644 --- a/lib/kokkos/algorithms/src/CMakeLists.txt +++ b/lib/kokkos/algorithms/src/CMakeLists.txt @@ -11,6 +11,7 @@ FILE(GLOB ALGO_HEADERS *.hpp) FILE(GLOB ALGO_SOURCES *.cpp) LIST(APPEND ALGO_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}_config.h) APPEND_GLOB(ALGO_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/std_algorithms/*.hpp) +APPEND_GLOB(ALGO_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/std_algorithms/impl/*.hpp) INSTALL ( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" diff --git a/lib/kokkos/algorithms/src/Kokkos_Random.hpp b/lib/kokkos/algorithms/src/Kokkos_Random.hpp index 59c11afd9a..1d85ffdfb9 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Random.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Random.hpp @@ -44,6 +44,10 @@ #ifndef KOKKOS_RANDOM_HPP #define KOKKOS_RANDOM_HPP +#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_RANDOM +#endif #include #include @@ -648,63 +652,44 @@ struct Random_UniqueIndex { } }; -#ifdef KOKKOS_ENABLE_CUDA -template -struct Random_UniqueIndex> { - using locks_view_type = - View>; - KOKKOS_FUNCTION - static int get_state_idx(const locks_view_type& locks_) { -#ifdef __CUDA_ARCH__ - const int i_offset = - (threadIdx.x * blockDim.y + threadIdx.y) * blockDim.z + threadIdx.z; - int i = (((blockIdx.x * gridDim.y + blockIdx.y) * gridDim.z + blockIdx.z) * - blockDim.x * blockDim.y * blockDim.z + - i_offset) % - locks_.extent(0); - while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { - i += blockDim.x * blockDim.y * blockDim.z; - if (i >= static_cast(locks_.extent(0))) { - i = i_offset; - } - } - return i; -#else - (void)locks_; - return 0; -#endif - } -}; +#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) + +#if defined(KOKKOS_ENABLE_CUDA) +#define KOKKOS_IMPL_EXECUTION_SPACE_CUDA_OR_HIP Kokkos::Cuda +#elif defined(KOKKOS_ENABLE_HIP) +#define KOKKOS_IMPL_EXECUTION_SPACE_CUDA_OR_HIP Kokkos::Experimental::HIP #endif -#ifdef KOKKOS_ENABLE_HIP template struct Random_UniqueIndex< - Kokkos::Device> { + Kokkos::Device> { using locks_view_type = - View>; + View>; KOKKOS_FUNCTION static int get_state_idx(const locks_view_type& locks_) { -#ifdef __HIP_DEVICE_COMPILE__ - const int i_offset = - (threadIdx.x * blockDim.y + threadIdx.y) * blockDim.z + threadIdx.z; - int i = (((blockIdx.x * gridDim.y + blockIdx.y) * gridDim.z + blockIdx.z) * + KOKKOS_IF_ON_DEVICE(( + const int i_offset = + (threadIdx.x * blockDim.y + threadIdx.y) * blockDim.z + threadIdx.z; + int i = + (((blockIdx.x * gridDim.y + blockIdx.y) * gridDim.z + blockIdx.z) * blockDim.x * blockDim.y * blockDim.z + i_offset) % locks_.extent(0); - while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { - i += blockDim.x * blockDim.y * blockDim.z; - if (i >= static_cast(locks_.extent(0))) { - i = i_offset; - } - } - return i; -#else - (void)locks_; - return 0; -#endif + while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { + i += blockDim.x * blockDim.y * blockDim.z; + if (i >= static_cast(locks_.extent(0))) { + i = i_offset; + } + } + + return i;)) + KOKKOS_IF_ON_HOST(((void)locks_; return 0;)) } }; + +#undef KOKKOS_IMPL_EXECUTION_SPACE_CUDA_OR_HIP + #endif #ifdef KOKKOS_ENABLE_SYCL @@ -1279,7 +1264,6 @@ struct fill_random_functor_begin_end; template struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1303,7 +1287,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1331,7 +1314,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1361,7 +1343,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1392,7 +1373,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1424,7 +1404,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1458,7 +1437,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1494,7 +1472,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1532,7 +1509,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1569,34 +1545,57 @@ struct fill_random_functor_begin_end -void fill_random(ViewType a, RandomPool g, +template +void fill_random(const ExecutionSpace& exec, ViewType a, RandomPool g, typename ViewType::const_value_type begin, typename ViewType::const_value_type end) { int64_t LDA = a.extent(0); if (LDA > 0) - parallel_for("Kokkos::fill_random", (LDA + 127) / 128, - Impl::fill_random_functor_begin_end( - a, g, begin, end)); + parallel_for( + "Kokkos::fill_random", + Kokkos::RangePolicy(exec, 0, (LDA + 127) / 128), + Impl::fill_random_functor_begin_end( + a, g, begin, end)); } } // namespace Impl +template +void fill_random(const ExecutionSpace& exec, ViewType a, RandomPool g, + typename ViewType::const_value_type begin, + typename ViewType::const_value_type end) { + Impl::apply_to_view_of_static_rank( + [&](auto dst) { Kokkos::Impl::fill_random(exec, dst, g, begin, end); }, + a); +} + +template +void fill_random(const ExecutionSpace& exec, ViewType a, RandomPool g, + typename ViewType::const_value_type range) { + fill_random(exec, a, g, 0, range); +} + template void fill_random(ViewType a, RandomPool g, typename ViewType::const_value_type begin, typename ViewType::const_value_type end) { - Impl::apply_to_view_of_static_rank( - [&](auto dst) { Kokkos::Impl::fill_random(dst, g, begin, end); }, a); + fill_random(typename ViewType::execution_space{}, a, g, begin, end); } template void fill_random(ViewType a, RandomPool g, typename ViewType::const_value_type range) { - fill_random(a, g, 0, range); + fill_random(typename ViewType::execution_space{}, a, g, 0, range); } } // namespace Kokkos +#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_RANDOM +#undef KOKKOS_IMPL_PUBLIC_INCLUDE +#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_RANDOM +#endif #endif diff --git a/lib/kokkos/algorithms/src/Kokkos_Sort.hpp b/lib/kokkos/algorithms/src/Kokkos_Sort.hpp index ce97de9b7d..ad0c2d47b6 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Sort.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Sort.hpp @@ -44,6 +44,10 @@ #ifndef KOKKOS_SORT_HPP_ #define KOKKOS_SORT_HPP_ +#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_SORT +#endif #include @@ -120,13 +124,13 @@ class BinSort { // If a Kokkos::View then can generate constant random access // otherwise can only use the constant type. - using src_view_type = typename std::conditional< + using src_view_type = std::conditional_t< Kokkos::is_view::value, Kokkos::View >, - typename SrcViewType::const_type>::type; + typename SrcViewType::const_type>; using perm_view_type = typename PermuteViewType::const_type; @@ -151,8 +155,11 @@ class BinSort { } }; - using execution_space = typename Space::execution_space; - using bin_op_type = BinSortOp; + // Naming this alias "execution_space" would be problematic since it would be + // considered as execution space for the various functors which might use + // another execution space through sort() or create_permute_vector(). + using exec_space = typename Space::execution_space; + using bin_op_type = BinSortOp; struct bin_count_tag {}; struct bin_offset_tag {}; @@ -171,13 +178,13 @@ class BinSort { // If a Kokkos::View then can generate constant random access // otherwise can only use the constant type. - using const_rnd_key_view_type = typename std::conditional< + using const_rnd_key_view_type = std::conditional_t< Kokkos::is_view::value, Kokkos::View >, - const_key_view_type>::type; + const_key_view_type>; using non_const_key_scalar = typename KeyViewType::non_const_value_type; using const_key_scalar = typename KeyViewType::const_value_type; @@ -220,6 +227,14 @@ class BinSort { range_begin(range_begin_), range_end(range_end_), sort_within_bins(sort_within_bins_) { + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + if (bin_op.max_bins() <= 0) + Kokkos::abort( + "The number of bins in the BinSortOp object must be greater than 0!"); bin_count_atomic = Kokkos::View( "Kokkos::SortImpl::BinSortFunctor::bin_count", bin_op.max_bins()); bin_count_const = bin_count_atomic; @@ -235,7 +250,7 @@ class BinSort { BinSort(const_key_view_type keys_, int range_begin_, int range_end_, BinSortOp bin_op_, bool sort_within_bins_ = false) - : BinSort(execution_space{}, keys_, range_begin_, range_end_, bin_op_, + : BinSort(exec_space{}, keys_, range_begin_, range_end_, bin_op_, sort_within_bins_) {} template @@ -245,13 +260,19 @@ class BinSort { BinSort(const_key_view_type keys_, BinSortOp bin_op_, bool sort_within_bins_ = false) - : BinSort(execution_space{}, keys_, bin_op_, sort_within_bins_) {} + : BinSort(exec_space{}, keys_, bin_op_, sort_within_bins_) {} //---------------------------------------- // Create the permutation vector, the bin_offset array and the bin_count // array. Can be called again if keys changed - template - void create_permute_vector(const ExecutionSpace& exec = execution_space{}) { + template + void create_permute_vector(const ExecutionSpace& exec = exec_space{}) { + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + const size_t len = range_end - range_begin; Kokkos::parallel_for( "Kokkos::Sort::BinCount", @@ -281,6 +302,17 @@ class BinSort { template void sort(const ExecutionSpace& exec, ValuesViewType const& values, int values_range_begin, int values_range_end) const { + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + static_assert( + Kokkos::SpaceAccessibility< + ExecutionSpace, typename ValuesViewType::memory_space>::accessible, + "The provided execution space must be able to access the memory space " + "of the View argument!"); + using scratch_view_type = Kokkos::View void sort(ValuesViewType const& values, int values_range_begin, int values_range_end) const { - execution_space exec; + exec_space exec; sort(exec, values, values_range_begin, values_range_end); exec.fence("Kokkos::Sort: fence after sorting"); } @@ -428,7 +460,7 @@ struct BinOp1D { BinOp1D() = default; - // Construct BinOp with number of bins, minimum value and maxuimum value + // Construct BinOp with number of bins, minimum value and maximum value BinOp1D(int max_bins__, typename KeyViewType::const_value_type min, typename KeyViewType::const_value_type max) : max_bins_(max_bins__ + 1), @@ -554,11 +586,7 @@ struct min_max_functor { template std::enable_if_t::value> sort( - const ExecutionSpace& exec, ViewType const& view, - bool const always_use_kokkos_sort = false) { - if (!always_use_kokkos_sort) { - if (Impl::try_std_sort(view, exec)) return; - } + const ExecutionSpace& exec, ViewType const& view) { using CompType = BinOp1D; Kokkos::MinMaxScalar result; @@ -596,12 +624,38 @@ std::enable_if_t::value> sort( bin_sort.sort(exec, view); } +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 +template +KOKKOS_DEPRECATED_WITH_COMMENT( + "Use the overload not taking bool always_use_kokkos_sort") +std::enable_if_t::value> sort( + const ExecutionSpace& exec, ViewType const& view, + bool const always_use_kokkos_sort) { + if (!always_use_kokkos_sort && Impl::try_std_sort(view, exec)) { + return; + } else { + sort(exec, view); + } +} +#endif + template -void sort(ViewType const& view, bool const always_use_kokkos_sort = false) { +void sort(ViewType const& view) { + typename ViewType::execution_space exec; + sort(exec, view); + exec.fence("Kokkos::Sort: fence after sorting"); +} + +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 +template +KOKKOS_DEPRECATED_WITH_COMMENT( + "Use the overload not taking bool always_use_kokkos_sort") +void sort(ViewType const& view, bool const always_use_kokkos_sort) { typename ViewType::execution_space exec; sort(exec, view, always_use_kokkos_sort); exec.fence("Kokkos::Sort: fence after sorting"); } +#endif template std::enable_if_t::value> sort( @@ -635,4 +689,8 @@ void sort(ViewType view, size_t const begin, size_t const end) { } // namespace Kokkos +#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_SORT +#undef KOKKOS_IMPL_PUBLIC_INCLUDE +#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_SORT +#endif #endif diff --git a/lib/kokkos/algorithms/src/Kokkos_StdAlgorithms.hpp b/lib/kokkos/algorithms/src/Kokkos_StdAlgorithms.hpp index 2e3babbcf0..3e0f731cf0 100644 --- a/lib/kokkos/algorithms/src/Kokkos_StdAlgorithms.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_StdAlgorithms.hpp @@ -44,59 +44,103 @@ #ifndef KOKKOS_STD_ALGORITHMS_HPP #define KOKKOS_STD_ALGORITHMS_HPP +#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_STD_ALGORITHMS +#endif /// \file Kokkos_StdAlgorithms.hpp /// \brief Kokkos counterparts for Standard C++ Library algorithms -#include -#include -#include +#include "std_algorithms/impl/Kokkos_Constraints.hpp" +#include "std_algorithms/impl/Kokkos_RandomAccessIterator.hpp" +#include "std_algorithms/Kokkos_BeginEnd.hpp" // distance -#include +#include "std_algorithms/Kokkos_Distance.hpp" -// move, swap, iter_swap -#include "std_algorithms/Kokkos_ModifyingOperations.hpp" +// note that we categorize below the headers +// following the std classification. -// find, find_if, find_if_not -// for_each, for_each_n -// mismatch -// equal -// count_if, count -// all_of, any_of, none_of -// adjacent_find -// lexicographical_compare -// search, search_n -// find_first_of, find_end -#include +// modifying ops +#include "std_algorithms/Kokkos_Swap.hpp" +#include "std_algorithms/Kokkos_IterSwap.hpp" -// replace, replace_copy_if, replace_copy, replace_if -// copy, copy_n, copy_backward, copy_if -// fill, fill_n -// transform -// generate, generate_n -// reverse, reverse_copy -// move, move_backward -// swap_ranges -// unique, unique_copy -// rotate, rotate_copy -// remove, remove_if, remove_copy, remove_copy_if -// shift_left, shift_right -#include +// non-modifying sequence +#include "std_algorithms/Kokkos_AdjacentFind.hpp" +#include "std_algorithms/Kokkos_Count.hpp" +#include "std_algorithms/Kokkos_CountIf.hpp" +#include "std_algorithms/Kokkos_AllOf.hpp" +#include "std_algorithms/Kokkos_AnyOf.hpp" +#include "std_algorithms/Kokkos_NoneOf.hpp" +#include "std_algorithms/Kokkos_Equal.hpp" +#include "std_algorithms/Kokkos_Find.hpp" +#include "std_algorithms/Kokkos_FindIf.hpp" +#include "std_algorithms/Kokkos_FindIfNot.hpp" +#include "std_algorithms/Kokkos_FindEnd.hpp" +#include "std_algorithms/Kokkos_FindFirstOf.hpp" +#include "std_algorithms/Kokkos_ForEach.hpp" +#include "std_algorithms/Kokkos_ForEachN.hpp" +#include "std_algorithms/Kokkos_LexicographicalCompare.hpp" +#include "std_algorithms/Kokkos_Mismatch.hpp" +#include "std_algorithms/Kokkos_Search.hpp" +#include "std_algorithms/Kokkos_SearchN.hpp" -// is_sorted_until, is_sorted -#include +// modifying sequence +#include "std_algorithms/Kokkos_Fill.hpp" +#include "std_algorithms/Kokkos_FillN.hpp" +#include "std_algorithms/Kokkos_Replace.hpp" +#include "std_algorithms/Kokkos_ReplaceIf.hpp" +#include "std_algorithms/Kokkos_ReplaceCopyIf.hpp" +#include "std_algorithms/Kokkos_ReplaceCopy.hpp" +#include "std_algorithms/Kokkos_Copy.hpp" +#include "std_algorithms/Kokkos_CopyN.hpp" +#include "std_algorithms/Kokkos_CopyBackward.hpp" +#include "std_algorithms/Kokkos_CopyIf.hpp" +#include "std_algorithms/Kokkos_Transform.hpp" +#include "std_algorithms/Kokkos_Generate.hpp" +#include "std_algorithms/Kokkos_GenerateN.hpp" +#include "std_algorithms/Kokkos_Reverse.hpp" +#include "std_algorithms/Kokkos_ReverseCopy.hpp" +#include "std_algorithms/Kokkos_Move.hpp" +#include "std_algorithms/Kokkos_MoveBackward.hpp" +#include "std_algorithms/Kokkos_SwapRanges.hpp" +#include "std_algorithms/Kokkos_Unique.hpp" +#include "std_algorithms/Kokkos_UniqueCopy.hpp" +#include "std_algorithms/Kokkos_Rotate.hpp" +#include "std_algorithms/Kokkos_RotateCopy.hpp" +#include "std_algorithms/Kokkos_Remove.hpp" +#include "std_algorithms/Kokkos_RemoveIf.hpp" +#include "std_algorithms/Kokkos_RemoveCopy.hpp" +#include "std_algorithms/Kokkos_RemoveCopyIf.hpp" +#include "std_algorithms/Kokkos_ShiftLeft.hpp" +#include "std_algorithms/Kokkos_ShiftRight.hpp" -// min_element, max_element, minmax_element -#include +// sorting +#include "std_algorithms/Kokkos_IsSortedUntil.hpp" +#include "std_algorithms/Kokkos_IsSorted.hpp" -// is_partitioned, partition_copy, partition_point -#include +// min/max element +#include "std_algorithms/Kokkos_MinElement.hpp" +#include "std_algorithms/Kokkos_MaxElement.hpp" +#include "std_algorithms/Kokkos_MinMaxElement.hpp" -// adjacent_difference -// reduce, transform_reduce -// exclusive_scan, transform_exclusive_scan -// inclusive_scan, transform_inclusive_scan -#include +// partitioning +#include "std_algorithms/Kokkos_IsPartitioned.hpp" +#include "std_algorithms/Kokkos_PartitionCopy.hpp" +#include "std_algorithms/Kokkos_PartitionPoint.hpp" +// numeric +#include "std_algorithms/Kokkos_AdjacentDifference.hpp" +#include "std_algorithms/Kokkos_Reduce.hpp" +#include "std_algorithms/Kokkos_TransformReduce.hpp" +#include "std_algorithms/Kokkos_ExclusiveScan.hpp" +#include "std_algorithms/Kokkos_TransformExclusiveScan.hpp" +#include "std_algorithms/Kokkos_InclusiveScan.hpp" +#include "std_algorithms/Kokkos_TransformInclusiveScan.hpp" + +#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_STD_ALGORITHMS +#undef KOKKOS_IMPL_PUBLIC_INCLUDE +#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_STD_ALGORITHMS +#endif #endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/numeric/Kokkos_AdjacentDifference.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp similarity index 72% rename from lib/kokkos/algorithms/src/std_algorithms/numeric/Kokkos_AdjacentDifference.hpp rename to lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp index 03e5fd6aeb..0a7cf06f5b 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/numeric/Kokkos_AdjacentDifference.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp @@ -42,106 +42,15 @@ //@HEADER */ -#ifndef KOKKOS_STD_NUMERICS_ADJACENT_DIFFERENCE_HPP -#define KOKKOS_STD_NUMERICS_ADJACENT_DIFFERENCE_HPP +#ifndef KOKKOS_STD_ALGORITHMS_ADJACENT_DIFFERENCE_HPP +#define KOKKOS_STD_ALGORITHMS_ADJACENT_DIFFERENCE_HPP -#include -#include "../Kokkos_BeginEnd.hpp" -#include "../Kokkos_Constraints.hpp" -#include "../Kokkos_Distance.hpp" +#include "impl/Kokkos_AdjacentDifference.hpp" +#include "Kokkos_BeginEnd.hpp" namespace Kokkos { namespace Experimental { -namespace Impl { -// ------------------------ -// -// functors -// -// ------------------------ -template -struct StdAdjacentDifferenceDefaultBinaryOpFunctor { - KOKKOS_FUNCTION - constexpr RetType operator()(const ValueType1& a, const ValueType2& b) const { - return a - b; - } -}; - -template -struct StdAdjacentDiffFunctor { - using index_type = typename InputIteratorType::difference_type; - - const InputIteratorType m_first_from; - const OutputIteratorType m_first_dest; - BinaryOperator m_op; - - KOKKOS_FUNCTION - void operator()(const index_type i) const { - const auto& my_value = m_first_from[i]; - if (i == 0) { - m_first_dest[i] = my_value; - } else { - const auto& left_value = m_first_from[i - 1]; - m_first_dest[i] = m_op(my_value, left_value); - } - } - - KOKKOS_FUNCTION - StdAdjacentDiffFunctor(InputIteratorType first_from, - OutputIteratorType first_dest, BinaryOperator op) - : m_first_from(std::move(first_from)), - m_first_dest(std::move(first_dest)), - m_op(std::move(op)) {} -}; - -// ------------------------------------------ -// adjacent_difference_impl -// ------------------------------------------ -template -OutputIteratorType adjacent_difference_impl(const std::string& label, - const ExecutionSpace& ex, - InputIteratorType first_from, - InputIteratorType last_from, - OutputIteratorType first_dest, - BinaryOp bin_op) { - // checks - Impl::static_assert_random_access_and_accessible(ex, first_from, first_dest); - Impl::static_assert_iterators_have_matching_difference_type(first_from, - first_dest); - Impl::expect_valid_range(first_from, last_from); - - if (first_from == last_from) { - return first_dest; - } - - // aliases - using value_type = typename OutputIteratorType::value_type; - using aux_view_type = ::Kokkos::View; - using functor_t = - StdAdjacentDiffFunctor; - - // run - const auto num_elements = - Kokkos::Experimental::distance(first_from, last_from); - aux_view_type aux_view("aux_view", num_elements); - ::Kokkos::parallel_for(label, - RangePolicy(ex, 0, num_elements), - functor_t(first_from, first_dest, bin_op)); - ex.fence("Kokkos::adjacent_difference: fence after operation"); - - // return - return first_dest + num_elements; -} - -} // end namespace Impl - -// ------------------------ -// -// public API -// -// ------------------------ template std::enable_if_t::value, diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp new file mode 100644 index 0000000000..332f9dd369 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp @@ -0,0 +1,124 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_ADJACENT_FIND_HPP +#define KOKKOS_STD_ALGORITHMS_ADJACENT_FIND_HPP + +#include "impl/Kokkos_AdjacentFind.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set1 +template +IteratorType adjacent_find(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::adjacent_find_impl("Kokkos::adjacent_find_iterator_api_default", + ex, first, last); +} + +template +IteratorType adjacent_find(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::adjacent_find_impl(label, ex, first, last); +} + +template +auto adjacent_find(const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_impl("Kokkos::adjacent_find_view_api_default", ex, + KE::begin(v), KE::end(v)); +} + +template +auto adjacent_find(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_impl(label, ex, KE::begin(v), KE::end(v)); +} + +// overload set2 +template +IteratorType adjacent_find(const ExecutionSpace& ex, IteratorType first, + IteratorType last, BinaryPredicateType pred) { + return Impl::adjacent_find_impl("Kokkos::adjacent_find_iterator_api_default", + ex, first, last, pred); +} + +template +IteratorType adjacent_find(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + BinaryPredicateType pred) { + return Impl::adjacent_find_impl(label, ex, first, last, pred); +} + +template +auto adjacent_find(const ExecutionSpace& ex, + const ::Kokkos::View& v, + BinaryPredicateType pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_impl("Kokkos::adjacent_find_view_api_default", ex, + KE::begin(v), KE::end(v), pred); +} + +template +auto adjacent_find(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + BinaryPredicateType pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_impl(label, ex, KE::begin(v), KE::end(v), pred); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp new file mode 100644 index 0000000000..66a49541f3 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp @@ -0,0 +1,94 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_ALL_OF_HPP +#define KOKKOS_STD_ALGORITHMS_ALL_OF_HPP + +#include "impl/Kokkos_AllOfAnyOfNoneOf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool all_of(const ExecutionSpace& ex, InputIterator first, InputIterator last, + Predicate predicate) { + return Impl::all_of_impl("Kokkos::all_of_iterator_api_default", ex, first, + last, predicate); +} + +template +bool all_of(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, Predicate predicate) { + return Impl::all_of_impl(label, ex, first, last, predicate); +} + +template +bool all_of(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::all_of_impl("Kokkos::all_of_view_api_default", ex, KE::cbegin(v), + KE::cend(v), std::move(predicate)); +} + +template +bool all_of(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::all_of_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp new file mode 100644 index 0000000000..e50e90f6da --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp @@ -0,0 +1,94 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_ANY_OF_HPP +#define KOKKOS_STD_ALGORITHMS_ANY_OF_HPP + +#include "impl/Kokkos_AllOfAnyOfNoneOf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool any_of(const ExecutionSpace& ex, InputIterator first, InputIterator last, + Predicate predicate) { + return Impl::any_of_impl("Kokkos::any_of_view_api_default", ex, first, last, + predicate); +} + +template +bool any_of(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, Predicate predicate) { + return Impl::any_of_impl(label, ex, first, last, predicate); +} + +template +bool any_of(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::any_of_impl("Kokkos::any_of_view_api_default", ex, KE::cbegin(v), + KE::cend(v), std::move(predicate)); +} + +template +bool any_of(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::any_of_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_BeginEnd.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_BeginEnd.hpp index beb53fdd70..5449196192 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_BeginEnd.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_BeginEnd.hpp @@ -46,8 +46,8 @@ #define KOKKOS_BEGIN_END_HPP #include -#include "Kokkos_RandomAccessIterator.hpp" -#include "Kokkos_Constraints.hpp" +#include "impl/Kokkos_RandomAccessIterator.hpp" +#include "impl/Kokkos_Constraints.hpp" /// \file Kokkos_BeginEnd.hpp /// \brief Kokkos begin, end, cbegin, cend diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp new file mode 100644 index 0000000000..b3237041b7 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp @@ -0,0 +1,97 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COPY_HPP +#define KOKKOS_STD_ALGORITHMS_COPY_HPP + +#include "impl/Kokkos_CopyCopyN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +OutputIterator copy(const ExecutionSpace& ex, InputIterator first, + InputIterator last, OutputIterator d_first) { + return Impl::copy_impl("Kokkos::copy_iterator_api_default", ex, first, last, + d_first); +} + +template +OutputIterator copy(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, + OutputIterator d_first) { + return Impl::copy_impl(label, ex, first, last, d_first); +} + +template +auto copy(const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_impl("Kokkos::copy_view_api_default", ex, + KE::cbegin(source), KE::cend(source), KE::begin(dest)); +} + +template +auto copy(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_impl(label, ex, KE::cbegin(source), KE::cend(source), + KE::begin(dest)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp new file mode 100644 index 0000000000..83efd96672 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp @@ -0,0 +1,95 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COPY_BACKWARD_HPP +#define KOKKOS_STD_ALGORITHMS_COPY_BACKWARD_HPP + +#include "impl/Kokkos_CopyBackward.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType2 copy_backward(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 d_last) { + return Impl::copy_backward_impl("Kokkos::copy_backward_iterator_api_default", + ex, first, last, d_last); +} + +template +IteratorType2 copy_backward(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 d_last) { + return Impl::copy_backward_impl(label, ex, first, last, d_last); +} + +template +auto copy_backward(const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_backward_impl("Kokkos::copy_backward_view_api_default", ex, + cbegin(source), cend(source), end(dest)); +} + +template +auto copy_backward(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_backward_impl(label, ex, cbegin(source), cend(source), + end(dest)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp new file mode 100644 index 0000000000..c83cc29886 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp @@ -0,0 +1,99 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COPY_IF_HPP +#define KOKKOS_STD_ALGORITHMS_COPY_IF_HPP + +#include "impl/Kokkos_CopyIf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +OutputIterator copy_if(const ExecutionSpace& ex, InputIterator first, + InputIterator last, OutputIterator d_first, + Predicate pred) { + return Impl::copy_if_impl("Kokkos::copy_if_iterator_api_default", ex, first, + last, d_first, std::move(pred)); +} + +template +OutputIterator copy_if(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, + OutputIterator d_first, Predicate pred) { + return Impl::copy_if_impl(label, ex, first, last, d_first, std::move(pred)); +} + +template +auto copy_if(const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest, Predicate pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_if_impl("Kokkos::copy_if_view_api_default", ex, + cbegin(source), cend(source), begin(dest), + std::move(pred)); +} + +template +auto copy_if(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest, Predicate pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_if_impl(label, ex, cbegin(source), cend(source), + begin(dest), std::move(pred)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp new file mode 100644 index 0000000000..7f3b9374c7 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp @@ -0,0 +1,98 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COPY_N_HPP +#define KOKKOS_STD_ALGORITHMS_COPY_N_HPP + +#include "impl/Kokkos_CopyCopyN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +OutputIterator copy_n(const ExecutionSpace& ex, InputIterator first, Size count, + OutputIterator result) { + return Impl::copy_n_impl("Kokkos::copy_n_iterator_api_default", ex, first, + count, result); +} + +template +OutputIterator copy_n(const std::string& label, const ExecutionSpace& ex, + InputIterator first, Size count, OutputIterator result) { + return Impl::copy_n_impl(label, ex, first, count, result); +} + +template +auto copy_n(const ExecutionSpace& ex, + const ::Kokkos::View& source, Size count, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_n_impl("Kokkos::copy_n_view_api_default", ex, + KE::cbegin(source), count, KE::begin(dest)); +} + +template +auto copy_n(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& source, Size count, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_n_impl(label, ex, KE::cbegin(source), count, + KE::begin(dest)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp new file mode 100644 index 0000000000..a885ee4ad2 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp @@ -0,0 +1,94 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COUNT_HPP +#define KOKKOS_STD_ALGORITHMS_COUNT_HPP + +#include "impl/Kokkos_CountCountIf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +typename IteratorType::difference_type count(const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + const T& value) { + return Impl::count_impl("Kokkos::count_iterator_api_default", ex, first, last, + value); +} + +template +typename IteratorType::difference_type count(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + const T& value) { + return Impl::count_impl(label, ex, first, last, value); +} + +template +auto count(const ExecutionSpace& ex, + const ::Kokkos::View& v, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_impl("Kokkos::count_view_api_default", ex, KE::cbegin(v), + KE::cend(v), value); +} + +template +auto count(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_impl(label, ex, KE::cbegin(v), KE::cend(v), value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp new file mode 100644 index 0000000000..98b9d74c4c --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp @@ -0,0 +1,99 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COUNT_IF_HPP +#define KOKKOS_STD_ALGORITHMS_COUNT_IF_HPP + +#include "impl/Kokkos_CountCountIf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +typename IteratorType::difference_type count_if(const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + Predicate predicate) { + return Impl::count_if_impl("Kokkos::count_if_iterator_api_default", ex, first, + last, std::move(predicate)); +} + +template +typename IteratorType::difference_type count_if(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + Predicate predicate) { + return Impl::count_if_impl(label, ex, first, last, std::move(predicate)); +} + +template +auto count_if(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_if_impl("Kokkos::count_if_view_api_default", ex, + KE::cbegin(v), KE::cend(v), std::move(predicate)); +} + +template +auto count_if(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_if_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Distance.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Distance.hpp index ced4370472..4e148642b1 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Distance.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Distance.hpp @@ -45,8 +45,8 @@ #ifndef KOKKOS_STD_ALGORITHMS_DISTANCE_HPP #define KOKKOS_STD_ALGORITHMS_DISTANCE_HPP -#include "Kokkos_Constraints.hpp" -#include "Kokkos_RandomAccessIterator.hpp" +#include "impl/Kokkos_Constraints.hpp" +#include "impl/Kokkos_RandomAccessIterator.hpp" namespace Kokkos { namespace Experimental { diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp new file mode 100644 index 0000000000..8634019fad --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp @@ -0,0 +1,198 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_EQUAL_HPP +#define KOKKOS_STD_ALGORITHMS_EQUAL_HPP + +#include "impl/Kokkos_Equal.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2) { + return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, + last1, first2); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2) { + return Impl::equal_impl(label, ex, first1, last1, first2); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, BinaryPredicateType predicate) { + return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, + last1, first2, std::move(predicate)); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, + BinaryPredicateType predicate) { + return Impl::equal_impl(label, ex, first1, last1, first2, + std::move(predicate)); +} + +template +bool equal(const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_impl("Kokkos::equal_view_api_default", ex, + KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2)); +} + +template +bool equal(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_impl(label, ex, KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2)); +} + +template +bool equal(const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, + BinaryPredicateType predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_impl("Kokkos::equal_view_api_default", ex, + KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), + std::move(predicate)); +} + +template +bool equal(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, + BinaryPredicateType predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_impl(label, ex, KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2), std::move(predicate)); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { + return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, + last1, first2, last2); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, IteratorType2 last2) { + return Impl::equal_impl(label, ex, first1, last1, first2, last2); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType predicate) { + return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, + last1, first2, last2, std::move(predicate)); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType predicate) { + return Impl::equal_impl(label, ex, first1, last1, first2, last2, + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp new file mode 100644 index 0000000000..b97710f24f --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp @@ -0,0 +1,190 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_EXCLUSIVE_SCAN_HPP +#define KOKKOS_STD_ALGORITHMS_EXCLUSIVE_SCAN_HPP + +#include "impl/Kokkos_ExclusiveScan.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set 1 +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +exclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + ValueType init_value) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + return Impl::exclusive_scan_default_op_impl( + "Kokkos::exclusive_scan_default_functors_iterator_api", ex, first, last, + first_dest, init_value); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +exclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, ValueType init_value) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + return Impl::exclusive_scan_default_op_impl(label, ex, first, last, + first_dest, init_value); +} + +template +auto exclusive_scan(const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_default_op_impl( + "Kokkos::exclusive_scan_default_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), + init_value); +} + +template +auto exclusive_scan(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_default_op_impl(label, ex, KE::cbegin(view_from), + KE::cend(view_from), + KE::begin(view_dest), init_value); +} + +// overload set 2 +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +exclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + ValueType init_value, BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(ex); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + return Impl::exclusive_scan_custom_op_impl( + "Kokkos::exclusive_scan_custom_functors_iterator_api", ex, first, last, + first_dest, init_value, bop); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +exclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, ValueType init_value, + BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(ex); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + return Impl::exclusive_scan_custom_op_impl(label, ex, first, last, first_dest, + init_value, bop); +} + +template +auto exclusive_scan(const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value, BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(ex); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_custom_op_impl( + "Kokkos::exclusive_scan_custom_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), + init_value, bop); +} + +template +auto exclusive_scan(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value, BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(ex); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_custom_op_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), init_value, bop); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp new file mode 100644 index 0000000000..200e03b9dc --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp @@ -0,0 +1,86 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FILL_HPP +#define KOKKOS_STD_ALGORITHMS_FILL_HPP + +#include "impl/Kokkos_FillFillN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +void fill(const ExecutionSpace& ex, IteratorType first, IteratorType last, + const T& value) { + Impl::fill_impl("Kokkos::fill_iterator_api_default", ex, first, last, value); +} + +template +void fill(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, const T& value) { + Impl::fill_impl(label, ex, first, last, value); +} + +template +void fill(const ExecutionSpace& ex, + const ::Kokkos::View& view, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + Impl::fill_impl("Kokkos::fill_view_api_default", ex, begin(view), end(view), + value); +} + +template +void fill(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + Impl::fill_impl(label, ex, begin(view), end(view), value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp new file mode 100644 index 0000000000..2e814dc55f --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp @@ -0,0 +1,91 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FILL_N_HPP +#define KOKKOS_STD_ALGORITHMS_FILL_N_HPP + +#include "impl/Kokkos_FillFillN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType fill_n(const ExecutionSpace& ex, IteratorType first, SizeType n, + const T& value) { + return Impl::fill_n_impl("Kokkos::fill_n_iterator_api_default", ex, first, n, + value); +} + +template +IteratorType fill_n(const std::string& label, const ExecutionSpace& ex, + IteratorType first, SizeType n, const T& value) { + return Impl::fill_n_impl(label, ex, first, n, value); +} + +template +auto fill_n(const ExecutionSpace& ex, + const ::Kokkos::View& view, SizeType n, + const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::fill_n_impl("Kokkos::fill_n_view_api_default", ex, begin(view), + n, value); +} + +template +auto fill_n(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, SizeType n, + const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::fill_n_impl(label, ex, begin(view), n, value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp new file mode 100644 index 0000000000..6758f00ce4 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp @@ -0,0 +1,89 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_HPP + +#include "impl/Kokkos_FindIfOrNot.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +InputIterator find(const ExecutionSpace& ex, InputIterator first, + InputIterator last, const T& value) { + return Impl::find_impl("Kokkos::find_iterator_api_default", ex, first, last, + value); +} + +template +InputIterator find(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, const T& value) { + return Impl::find_impl(label, ex, first, last, value); +} + +template +auto find(const ExecutionSpace& ex, + const ::Kokkos::View& view, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_impl("Kokkos::find_view_api_default", ex, KE::begin(view), + KE::end(view), value); +} + +template +auto find(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_impl(label, ex, KE::begin(view), KE::end(view), value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp new file mode 100644 index 0000000000..61b54c8225 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp @@ -0,0 +1,149 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_END_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_END_HPP + +#include "impl/Kokkos_FindEnd.hpp" +#include "Kokkos_Equal.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set 1: no binary predicate passed +template +IteratorType1 find_end(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last) { + return Impl::find_end_impl("Kokkos::find_end_iterator_api_default", ex, first, + last, s_first, s_last); +} + +template +IteratorType1 find_end(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last) { + return Impl::find_end_impl(label, ex, first, last, s_first, s_last); +} + +template +auto find_end(const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_impl("Kokkos::find_end_view_api_default", ex, + KE::begin(view), KE::end(view), KE::begin(s_view), + KE::end(s_view)); +} + +template +auto find_end(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); +} + +// overload set 2: binary predicate passed +template +IteratorType1 find_end(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last, const BinaryPredicateType& pred) { + return Impl::find_end_impl("Kokkos::find_end_iterator_api_default", ex, first, + last, s_first, s_last, pred); +} + +template +IteratorType1 find_end(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::find_end_impl(label, ex, first, last, s_first, s_last, pred); +} + +template +auto find_end(const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_impl("Kokkos::find_end_view_api_default", ex, + KE::begin(view), KE::end(view), KE::begin(s_view), + KE::end(s_view), pred); +} + +template +auto find_end(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp new file mode 100644 index 0000000000..b8c27cb272 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp @@ -0,0 +1,150 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_FIRST_OF_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_FIRST_OF_HPP + +#include "impl/Kokkos_FindFirstOf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set 1: no binary predicate passed +template +IteratorType1 find_first_of(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last) { + return Impl::find_first_of_impl("Kokkos::find_first_of_iterator_api_default", + ex, first, last, s_first, s_last); +} + +template +IteratorType1 find_first_of(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last) { + return Impl::find_first_of_impl(label, ex, first, last, s_first, s_last); +} + +template +auto find_first_of(const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_impl("Kokkos::find_first_of_view_api_default", ex, + KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); +} + +template +auto find_first_of(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); +} + +// overload set 2: binary predicate passed +template +IteratorType1 find_first_of(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::find_first_of_impl("Kokkos::find_first_of_iterator_api_default", + ex, first, last, s_first, s_last, pred); +} + +template +IteratorType1 find_first_of(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::find_first_of_impl(label, ex, first, last, s_first, s_last, + pred); +} + +template +auto find_first_of(const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_impl("Kokkos::find_first_of_view_api_default", ex, + KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); +} + +template +auto find_first_of(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp new file mode 100644 index 0000000000..54896da117 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp @@ -0,0 +1,95 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_IF_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_IF_HPP + +#include "impl/Kokkos_FindIfOrNot.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType find_if(const ExecutionSpace& ex, IteratorType first, + IteratorType last, PredicateType predicate) { + return Impl::find_if_or_not_impl("Kokkos::find_if_iterator_api_default", + ex, first, last, std::move(predicate)); +} + +template +IteratorType find_if(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + PredicateType predicate) { + return Impl::find_if_or_not_impl(label, ex, first, last, + std::move(predicate)); +} + +template +auto find_if(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_impl("Kokkos::find_if_view_api_default", ex, + KE::begin(v), KE::end(v), + std::move(predicate)); +} + +template +auto find_if(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_impl(label, ex, KE::begin(v), KE::end(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp new file mode 100644 index 0000000000..cfe6bb84d8 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp @@ -0,0 +1,98 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_IF_NOT_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_IF_NOT_HPP + +#include "impl/Kokkos_FindIfOrNot.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType find_if_not(const ExecutionSpace& ex, IteratorType first, + IteratorType last, Predicate predicate) { + return Impl::find_if_or_not_impl( + "Kokkos::find_if_not_iterator_api_default", ex, first, last, + std::move(predicate)); +} + +template +IteratorType find_if_not(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + Predicate predicate) { + return Impl::find_if_or_not_impl(label, ex, first, last, + std::move(predicate)); +} + +template +auto find_if_not(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_impl( + "Kokkos::find_if_not_view_api_default", ex, KE::begin(v), KE::end(v), + std::move(predicate)); +} + +template +auto find_if_not(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_impl(label, ex, KE::begin(v), KE::end(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp new file mode 100644 index 0000000000..8a2f90e82b --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp @@ -0,0 +1,95 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FOR_EACH_HPP +#define KOKKOS_STD_ALGORITHMS_FOR_EACH_HPP + +#include "impl/Kokkos_ForEachForEachN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +UnaryFunctorType for_each(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + UnaryFunctorType functor) { + return Impl::for_each_impl(label, ex, first, last, std::move(functor)); +} + +template +UnaryFunctorType for_each(const ExecutionSpace& ex, IteratorType first, + IteratorType last, UnaryFunctorType functor) { + return Impl::for_each_impl("Kokkos::for_each_iterator_api_default", ex, first, + last, std::move(functor)); +} + +template +UnaryFunctorType for_each(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_impl(label, ex, KE::begin(v), KE::end(v), + std::move(functor)); +} + +template +UnaryFunctorType for_each(const ExecutionSpace& ex, + const ::Kokkos::View& v, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_impl("Kokkos::for_each_view_api_default", ex, + KE::begin(v), KE::end(v), std::move(functor)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp new file mode 100644 index 0000000000..dd917a33e8 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp @@ -0,0 +1,96 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FOR_EACH_N_HPP +#define KOKKOS_STD_ALGORITHMS_FOR_EACH_N_HPP + +#include "impl/Kokkos_ForEachForEachN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType for_each_n(const std::string& label, const ExecutionSpace& ex, + IteratorType first, SizeType n, + UnaryFunctorType functor) { + return Impl::for_each_n_impl(label, ex, first, n, std::move(functor)); +} + +template +IteratorType for_each_n(const ExecutionSpace& ex, IteratorType first, + SizeType n, UnaryFunctorType functor) { + return Impl::for_each_n_impl("Kokkos::for_each_n_iterator_api_default", ex, + first, n, std::move(functor)); +} + +template +auto for_each_n(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, SizeType n, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_n_impl(label, ex, KE::begin(v), n, std::move(functor)); +} + +template +auto for_each_n(const ExecutionSpace& ex, + const ::Kokkos::View& v, SizeType n, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_n_impl("Kokkos::for_each_n_view_api_default", ex, + KE::begin(v), n, std::move(functor)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp new file mode 100644 index 0000000000..955cb42d4b --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp @@ -0,0 +1,91 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_GENERATE_HPP +#define KOKKOS_STD_ALGORITHMS_GENERATE_HPP + +#include "impl/Kokkos_GenerateGenerateN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +void generate(const ExecutionSpace& ex, IteratorType first, IteratorType last, + Generator g) { + Impl::generate_impl("Kokkos::generate_iterator_api_default", ex, first, last, + std::move(g)); +} + +template +void generate(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, Generator g) { + Impl::generate_impl(label, ex, first, last, std::move(g)); +} + +template +void generate(const ExecutionSpace& ex, + const ::Kokkos::View& view, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + Impl::generate_impl("Kokkos::generate_view_api_default", ex, begin(view), + end(view), std::move(g)); +} + +template +void generate(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + Impl::generate_impl(label, ex, begin(view), end(view), std::move(g)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp new file mode 100644 index 0000000000..470edb1596 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp @@ -0,0 +1,93 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_GENERATE_N_HPP +#define KOKKOS_STD_ALGORITHMS_GENERATE_N_HPP + +#include "impl/Kokkos_GenerateGenerateN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType generate_n(const ExecutionSpace& ex, IteratorType first, + Size count, Generator g) { + Impl::generate_n_impl("Kokkos::generate_n_iterator_api_default", ex, first, + count, std::move(g)); + return first + count; +} + +template +IteratorType generate_n(const std::string& label, const ExecutionSpace& ex, + IteratorType first, Size count, Generator g) { + Impl::generate_n_impl(label, ex, first, count, std::move(g)); + return first + count; +} + +template +auto generate_n(const ExecutionSpace& ex, + const ::Kokkos::View& view, Size count, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::generate_n_impl("Kokkos::generate_n_view_api_default", ex, + begin(view), count, std::move(g)); +} + +template +auto generate_n(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, Size count, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::generate_n_impl(label, ex, begin(view), count, std::move(g)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp new file mode 100644 index 0000000000..c34b5f43c9 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp @@ -0,0 +1,223 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_INCLUSIVE_SCAN_HPP +#define KOKKOS_STD_ALGORITHMS_INCLUSIVE_SCAN_HPP + +#include "impl/Kokkos_InclusiveScan.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set 1 +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest) { + return Impl::inclusive_scan_default_op_impl( + "Kokkos::inclusive_scan_default_functors_iterator_api", ex, first, last, + first_dest); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest) { + return Impl::inclusive_scan_default_op_impl(label, ex, first, last, + first_dest); +} + +template +auto inclusive_scan( + const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_default_op_impl( + "Kokkos::inclusive_scan_default_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest)); +} + +template +auto inclusive_scan( + const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_default_op_impl(label, ex, KE::cbegin(view_from), + KE::cend(view_from), + KE::begin(view_dest)); +} + +// overload set 2 (accepting custom binary op) +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOp binary_op) { + return Impl::inclusive_scan_custom_binary_op_impl( + "Kokkos::inclusive_scan_custom_functors_iterator_api", ex, first, last, + first_dest, binary_op); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, BinaryOp binary_op) { + return Impl::inclusive_scan_custom_binary_op_impl(label, ex, first, last, + first_dest, binary_op); +} + +template +auto inclusive_scan(const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_impl( + "Kokkos::inclusive_scan_custom_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), + binary_op); +} + +template +auto inclusive_scan(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op); +} + +// overload set 3 +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOp binary_op, ValueType init_value) { + return Impl::inclusive_scan_custom_binary_op_impl( + "Kokkos::inclusive_scan_custom_functors_iterator_api", ex, first, last, + first_dest, binary_op, init_value); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, BinaryOp binary_op, + ValueType init_value) { + return Impl::inclusive_scan_custom_binary_op_impl( + label, ex, first, last, first_dest, binary_op, init_value); +} + +template +auto inclusive_scan(const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op, ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_impl( + "Kokkos::inclusive_scan_custom_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), + binary_op, init_value); +} + +template +auto inclusive_scan(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op, ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op, init_value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp new file mode 100644 index 0000000000..8a2ca207ae --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp @@ -0,0 +1,92 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_IS_PARTITIONED_HPP +#define KOKKOS_STD_ALGORITHMS_IS_PARTITIONED_HPP + +#include "impl/Kokkos_IsPartitioned.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool is_partitioned(const ExecutionSpace& ex, IteratorType first, + IteratorType last, PredicateType p) { + return Impl::is_partitioned_impl( + "Kokkos::is_partitioned_iterator_api_default", ex, first, last, + std::move(p)); +} + +template +bool is_partitioned(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, PredicateType p) { + return Impl::is_partitioned_impl(label, ex, first, last, std::move(p)); +} + +template +bool is_partitioned(const ExecutionSpace& ex, + const ::Kokkos::View& v, + PredicateType p) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::is_partitioned_impl("Kokkos::is_partitioned_view_api_default", + ex, cbegin(v), cend(v), std::move(p)); +} + +template +bool is_partitioned(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + PredicateType p) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::is_partitioned_impl(label, ex, cbegin(v), cend(v), std::move(p)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp new file mode 100644 index 0000000000..0ab466f338 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp @@ -0,0 +1,131 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_IS_SORTED_HPP +#define KOKKOS_STD_ALGORITHMS_IS_SORTED_HPP + +#include "impl/Kokkos_IsSorted.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool is_sorted(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::is_sorted_impl("Kokkos::is_sorted_iterator_api_default", ex, + first, last); +} + +template +bool is_sorted(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::is_sorted_impl(label, ex, first, last); +} + +template +bool is_sorted(const ExecutionSpace& ex, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_impl("Kokkos::is_sorted_view_api_default", ex, + KE::cbegin(view), KE::cend(view)); +} + +template +bool is_sorted(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_impl(label, ex, KE::cbegin(view), KE::cend(view)); +} + +template +bool is_sorted(const ExecutionSpace& ex, IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + return Impl::is_sorted_impl("Kokkos::is_sorted_iterator_api_default", ex, + first, last, std::move(comp)); +} + +template +bool is_sorted(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + return Impl::is_sorted_impl(label, ex, first, last, std::move(comp)); +} + +template +bool is_sorted(const ExecutionSpace& ex, + const ::Kokkos::View& view, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(ex); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_impl("Kokkos::is_sorted_view_api_default", ex, + KE::cbegin(view), KE::cend(view), + std::move(comp)); +} + +template +bool is_sorted(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(ex); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_impl(label, ex, KE::cbegin(view), KE::cend(view), + std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp new file mode 100644 index 0000000000..c480d9ee5a --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp @@ -0,0 +1,134 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_IS_SORTED_UNTIL_HPP +#define KOKKOS_STD_ALGORITHMS_IS_SORTED_UNTIL_HPP + +#include "impl/Kokkos_IsSortedUntil.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType is_sorted_until(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::is_sorted_until_impl( + "Kokkos::is_sorted_until_iterator_api_default", ex, first, last); +} + +template +IteratorType is_sorted_until(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::is_sorted_until_impl(label, ex, first, last); +} + +template +auto is_sorted_until(const ExecutionSpace& ex, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_impl("Kokkos::is_sorted_until_view_api_default", + ex, KE::begin(view), KE::end(view)); +} + +template +auto is_sorted_until(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_impl(label, ex, KE::begin(view), KE::end(view)); +} + +template +IteratorType is_sorted_until(const ExecutionSpace& ex, IteratorType first, + IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + return Impl::is_sorted_until_impl( + "Kokkos::is_sorted_until_iterator_api_default", ex, first, last, + std::move(comp)); +} + +template +IteratorType is_sorted_until(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::is_sorted_until_impl(label, ex, first, last, std::move(comp)); +} + +template +auto is_sorted_until(const ExecutionSpace& ex, + const ::Kokkos::View& view, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(ex); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_impl("Kokkos::is_sorted_until_view_api_default", + ex, KE::begin(view), KE::end(view), + std::move(comp)); +} + +template +auto is_sorted_until(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(ex); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_impl(label, ex, KE::begin(view), KE::end(view), + std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ModifyingOperations.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IterSwap.hpp similarity index 79% rename from lib/kokkos/algorithms/src/std_algorithms/Kokkos_ModifyingOperations.hpp rename to lib/kokkos/algorithms/src/std_algorithms/Kokkos_IterSwap.hpp index f8ca3456e5..1174740a5b 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ModifyingOperations.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IterSwap.hpp @@ -42,38 +42,17 @@ //@HEADER */ -#ifndef KOKKOS_MODIFYING_OPERATIONS_HPP -#define KOKKOS_MODIFYING_OPERATIONS_HPP +#ifndef KOKKOS_STD_ALGORITHMS_ITER_SWAP_HPP +#define KOKKOS_STD_ALGORITHMS_ITER_SWAP_HPP #include -#include "Kokkos_BeginEnd.hpp" -#include "Kokkos_Constraints.hpp" +#include "impl/Kokkos_Constraints.hpp" +#include "Kokkos_Swap.hpp" namespace Kokkos { namespace Experimental { - -// move -template -KOKKOS_INLINE_FUNCTION std::remove_reference_t&& move(T&& t) { - return static_cast&&>(t); -} - -// swap -template -KOKKOS_INLINE_FUNCTION void swap(T& a, T& b) noexcept { - static_assert( - std::is_move_assignable::value && std::is_move_constructible::value, - "Kokkos::Experimental::swap arguments must be move assignable " - "and move constructible"); - - T tmp = std::move(a); - a = std::move(b); - b = std::move(tmp); -} - -//---------------------------------------------------------------------------- -// this is here because we use the swap function above namespace Impl { + template struct StdIterSwapFunctor { IteratorType1 m_a; diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp new file mode 100644 index 0000000000..4704a9ec56 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp @@ -0,0 +1,154 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_LEXICOGRAPHICAL_COMPARE_HPP +#define KOKKOS_STD_ALGORITHMS_LEXICOGRAPHICAL_COMPARE_HPP + +#include "impl/Kokkos_LexicographicalCompare.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool lexicographical_compare(const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, + IteratorType2 last2) { + return Impl::lexicographical_compare_impl( + "Kokkos::lexicographical_compare_iterator_api_default", ex, first1, last1, + first2, last2); +} + +template +bool lexicographical_compare(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { + return Impl::lexicographical_compare_impl(label, ex, first1, last1, first2, + last2); +} + +template +bool lexicographical_compare( + const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_impl( + "Kokkos::lexicographical_compare_view_api_default", ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), KE::cend(view2)); +} + +template +bool lexicographical_compare( + const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_impl(label, ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), + KE::cend(view2)); +} + +template +bool lexicographical_compare(const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, + IteratorType2 last2, ComparatorType comp) { + return Impl::lexicographical_compare_impl( + "Kokkos::lexicographical_compare_iterator_api_default", ex, first1, last1, + first2, last2, comp); +} + +template +bool lexicographical_compare(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + ComparatorType comp) { + return Impl::lexicographical_compare_impl(label, ex, first1, last1, first2, + last2, comp); +} + +template +bool lexicographical_compare( + const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_impl( + "Kokkos::lexicographical_compare_view_api_default", ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), KE::cend(view2), comp); +} + +template +bool lexicographical_compare( + const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_impl(label, ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), + KE::cend(view2), comp); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp new file mode 100644 index 0000000000..5f6e5cbf62 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp @@ -0,0 +1,132 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_MAX_ELEMENT_HPP +#define KOKKOS_STD_ALGORITHMS_MAX_ELEMENT_HPP + +#include "impl/Kokkos_MinMaxMinmaxElement.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +auto max_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::min_or_max_element_impl( + "Kokkos::max_element_iterator_api_default", ex, first, last); +} + +template +auto max_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::min_or_max_element_impl(label, ex, first, last); +} + +template +auto max_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + "Kokkos::max_element_iterator_api_default", ex, first, last, + std::move(comp)); +} + +template +auto max_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + label, ex, first, last, std::move(comp)); +} + +template +auto max_element(const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_impl( + "Kokkos::max_element_view_api_default", ex, begin(v), end(v)); +} + +template +auto max_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_impl(label, ex, begin(v), + end(v)); +} + +template +auto max_element(const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + "Kokkos::max_element_view_api_default", ex, begin(v), end(v), + std::move(comp)); +} + +template +auto max_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + label, ex, begin(v), end(v), std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp new file mode 100644 index 0000000000..63cc548960 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp @@ -0,0 +1,132 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_MIN_ELEMENT_HPP +#define KOKKOS_STD_ALGORITHMS_MIN_ELEMENT_HPP + +#include "impl/Kokkos_MinMaxMinmaxElement.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +auto min_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::min_or_max_element_impl( + "Kokkos::min_element_iterator_api_default", ex, first, last); +} + +template +auto min_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::min_or_max_element_impl(label, ex, first, last); +} + +template +auto min_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + "Kokkos::min_element_iterator_api_default", ex, first, last, + std::move(comp)); +} + +template +auto min_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + label, ex, first, last, std::move(comp)); +} + +template +auto min_element(const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_impl( + "Kokkos::min_element_view_api_default", ex, begin(v), end(v)); +} + +template +auto min_element(const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + "Kokkos::min_element_view_api_default", ex, begin(v), end(v), + std::move(comp)); +} + +template +auto min_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_impl(label, ex, begin(v), + end(v)); +} + +template +auto min_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + label, ex, begin(v), end(v), std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp new file mode 100644 index 0000000000..07cdefcc05 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp @@ -0,0 +1,133 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_MINMAX_ELEMENT_HPP +#define KOKKOS_STD_ALGORITHMS_MINMAX_ELEMENT_HPP + +#include "impl/Kokkos_MinMaxMinmaxElement.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +auto minmax_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::minmax_element_impl( + "Kokkos::minmax_element_iterator_api_default", ex, first, last); +} + +template +auto minmax_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::minmax_element_impl(label, ex, first, last); +} + +template +auto minmax_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::minmax_element_impl( + "Kokkos::minmax_element_iterator_api_default", ex, first, last, + std::move(comp)); +} + +template +auto minmax_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::minmax_element_impl( + label, ex, first, last, std::move(comp)); +} + +template +auto minmax_element(const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::minmax_element_impl( + "Kokkos::minmax_element_view_api_default", ex, begin(v), end(v)); +} + +template +auto minmax_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::minmax_element_impl(label, ex, begin(v), + end(v)); +} + +template +auto minmax_element(const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::minmax_element_impl( + "Kokkos::minmax_element_view_api_default", ex, begin(v), end(v), + std::move(comp)); +} + +template +auto minmax_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::minmax_element_impl( + label, ex, begin(v), end(v), std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElementOperations.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElementOperations.hpp deleted file mode 100644 index aa8f5ba376..0000000000 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElementOperations.hpp +++ /dev/null @@ -1,409 +0,0 @@ -/* -//@HEADER -// ************************************************************************ -// -// Kokkos v. 3.0 -// Copyright (2020) National Technology & Engineering -// Solutions of Sandia, LLC (NTESS). -// -// Under the terms of Contract DE-NA0003525 with NTESS, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Christian R. Trott (crtrott@sandia.gov) -// -// ************************************************************************ -//@HEADER -*/ - -#ifndef KOKKOS_STD_MIN_MAX_ELEMENT_OPERATIONS_HPP -#define KOKKOS_STD_MIN_MAX_ELEMENT_OPERATIONS_HPP - -#include -#include "Kokkos_BeginEnd.hpp" -#include "Kokkos_Constraints.hpp" -#include "Kokkos_Distance.hpp" -#include "Kokkos_ModifyingOperations.hpp" - -namespace Kokkos { -namespace Experimental { -namespace Impl { - -template -struct StdMinOrMaxElemFunctor { - using index_type = typename IteratorType::difference_type; - using red_value_type = typename ReducerType::value_type; - - IteratorType m_first; - ReducerType m_reducer; - - KOKKOS_FUNCTION - void operator()(const index_type i, red_value_type& red_value) const { - m_reducer.join(red_value, red_value_type{m_first[i], i}); - } - - KOKKOS_FUNCTION - StdMinOrMaxElemFunctor(IteratorType first, ReducerType reducer) - : m_first(std::move(first)), m_reducer(std::move(reducer)) {} -}; - -template -struct StdMinMaxElemFunctor { - using index_type = typename IteratorType::difference_type; - using red_value_type = typename ReducerType::value_type; - IteratorType m_first; - ReducerType m_reducer; - - KOKKOS_FUNCTION - void operator()(const index_type i, red_value_type& red_value) const { - const auto& my_value = m_first[i]; - m_reducer.join(red_value, red_value_type{my_value, my_value, i, i}); - } - - KOKKOS_FUNCTION - StdMinMaxElemFunctor(IteratorType first, ReducerType reducer) - : m_first(std::move(first)), m_reducer(std::move(reducer)) {} -}; - -// ------------------------------------------ -// min_or_max_element_impl -// ------------------------------------------ -template